迁移 SQL Server 中的历史数据

如果数据记录模型的历史数据存储在 SQL Server 中,请使用 InfluxDB 命令并按照数据库模式迁移历史数据。要使用 FactoryTalk View SE 控件(如 TrendPro 或 XY 图)绘制数据,必须先向 DataLogPro 添加标签列表。
在开始之前,您必须知道:
  • SQL Server 存储格式。
  • InfluxDB 存储格式。
  • 如何在 InfluxDB 中构造数据条目。
SQL Server 存储格式
在 SQL Server 中创建了三个表,用于存储数据记录模型的历史数据:标签表、浮点表和字符串表。字符串类型的数据存储在字符串表中,而其他类型的数据存储在浮点表中。要使用 InfluxDB 存储格式建立映射,将需要某些表的列。
有关 SQL Server 数据库格式的详细信息,请参阅 ODBC 格式数据库
InfluxDB 存储格式
InfluxDB 数据库将数据组织到时段和测量中。时段名称为 HMI 服务器的名称。InfluxDB 的测量是
TagData
,它包括
Tag
Field
元素。要在 InfluxDB 中建立数据条目,需要使用 TagData、Tag 和 Field 以及 Tag 和 Field 的键。
有关 InfluxDB 存储格式的详细信息,请参阅 InfluxDB 存储格式和模式
如何在 InfluxDB 中构造数据条目
数据条目的构造遵循行协议元素解析标准:
  • 测量
  • 标签集
  • 字段集
  • 时间戳
  • 行之间用换行符
    \n
    分隔。行协议对空间敏感。
有关 InfluxDB 行协议的更多信息,请参见 InfluxDB OSS 文档中的 行协议在 InfluxDB 用户界面(UI)中从源加载数据,或参阅您自己的 InfluxDB 版本对应的文档。
其中
  • TagData
    :InfluxDB 中的测量。
  • TagName
    :InfluxDB 中的标签键。在 SQL Server 中,它是标签表中的一列。
  • <tag>
    :标签的名称。在 SQL Server 中,它显示在标签表的
    TagName
    列中。
  • S
    :InfluxDB 中的标签键。它表示 SQL Server 中浮点表或字符串表的
    Status
    列。
  • 状态
    :SQL Server 中浮点表或字符串表的
    Status
    列中的状态(
    C
    D
    E
    S
    U
    )。
  • <FieldKey>
    : 为 InfluxDB 定义的字段键,如
    V_B
    V_I
    V_D
    V_S
    ,分别表示布尔值、整型值、双精度值或字符串值。
  • <value>
    :标签值。在 SQL Server 中,它显示在浮点表或字符串表的
    Val
    列中。如果 <FieldKey> 为 V_I(表示值为整数),则值应采用以下格式:
    <value>i
    。例如,
    V_I=8i
  • M
    :记号。在 SQL Server 中,它是浮点表或字符串表的列。如果没有标记,可以忽略 M 和 <MarkerValue>。
  • <MarkerValue>
    : SQL Server 中浮点表或字符串表的“
    标记
    ”列中的值(
    B
    E
    S
    或空白)。
  • <Timestamp>
    :InfluxDB 中以 Unix 时间表示的数据点的时间戳。要构造时间戳,请使用 SQL Server 中浮点表或字符串表的
    DateAndTime
    Millitm
    列。
示例
TagData,TagName="system\Second",S="C" V_I=8i,M="B" 1465839830100400200
将历史数据迁移到 InfluxDB
了解 SQL Server 和 InfluxDB 的存储格式后,可在 InfluxDB UI 中使用
sql.from()
Influx 函数和脚本。为此,请在浏览器中访问
ComputerName:8086
,导航到
数据浏览器
,输入您的脚本(请参阅下面的示例),然后单击
运行
。该脚本将从 SQL Server 读取数据,并转换数据以匹配 InfluxDB 架构,然后将数据写入 InfluxDB。有关更多信息,请参见
sql.from()
函数
只有对 InfluxDB 具有管理权限的用户才能执行迁移。有关更多信息,请参见 InfluxDB OSS 文档中的创建令牌或参考您自己的 InfluxDB 版本对应的文档。
总体而言,历史数据的迁移包括迁移标签的数据和迁移标记,您可以单独或一起执行。您可以使用一个脚本迁移多个标签的数据,前提是它们具有相同的类型,即布尔型(V_B)、整型(V_I)、双精度(V_D)或字符串(V_S)。此外,您可以迁移一个表(即浮点表或字符串表)中的所有标记。
InfluxDB 数据类型(字段键)
对应的 SQL Server 表
布尔型(V_B)、整型(V_I)和双精度(V_D)
浮点表
字符串(V_S)
字符串表
以下将存储在 SQL Server 中的历史数据迁移到 InfluxDB 的示例仅供参考;并未涵盖所有 ODBC 数据库或作为生产环境的解决方案。该示例将数据和标记一起迁移。某些参数是必需的,而其他参数是可编辑的。您可以复制脚本并根据需要修改可编辑的参数。
示例:将存储在 SQL Server 中的数据记录模型的历史数据迁移到 InfluxDB
import "sql" sql.from( driverName: "sqlserver", dataSourceName: "sqlserver://sa:password123@10.224.1.1:1433?database=mydb", query: "Select 'TagData' as _measurement, FORMAT(DATEADD(SECOND,DATEDIFF(SECOND,GETDATE(),GETUTCDATE()),DATEADD(MILLISECOND,Millitm,CAST(DateAndTime as datetime2))), 'yyyy-MM-ddTHH:mm:ss.fffZ') as _time, dbo.TagTable.TagName as TagName, COALESCE(NULLIF(dbo.FloatTable.Status,''),'C') as S,'V_I' as _field, dbo.FloatTable.Val as _value from dbo.TagTable Join dbo.FloatTable on dbo.FloatTable.TagIndex = dbo.TagTable.TagIndex where dbo.TagTable.TagName = 'system\\Second'") |> map(fn: (r) =>({r with _time: time(v:r._time)})) |> map(fn: (r) =>({r with _value: int(v:r._value)})) |>to( bucket: "HMIserver", org:"Rockwell") sql.from( driverName: "sqlserver", dataSourceName: "sqlserver://sa:password123@10.224.1.1:1433?database=mydb", query: "Select 'TagData' as _measurement, FORMAT(DATEADD(SECOND,DATEDIFF(SECOND,GETDATE(),GETUTCDATE()),DATEADD(MILLISECOND,Millitm,CAST(DateAndTime as datetime2))), 'yyyy-MM-ddTHH:mm:ss.fffZ') as _time, dbo.TagTable.TagName as TagName, COALESCE(NULLIF(dbo.FloatTable.Status,''),'C') as S,'M' as _field, dbo.FloatTable.Marker as _value from dbo.TagTable Join dbo.FloatTable on dbo.FloatTable.TagIndex = dbo.TagTable.TagIndex where dbo.FloatTable.Marker <> ''") |> map(fn: (r) =>({r with _time: time(v:r._time)})) |>to( bucket: "HMIserver", org:"MyOrganization")
示例说明
脚本的第一部分迁移 SQL Server 数据库的
浮点
表中的整数数据(
system\\Second
),第二部分迁移
浮点
表中的所有标记。
  • import "sql"
    :导入
    sql
    包。该
    sql
    包提供的工具可用于处理 SQL 数据库中的数据。
  • sql.from()
    :从 SQL 数据源检索数据。其具有以下参数:
    • driverName
      :用于连接到 SQL 数据库的驱动程序。对于 SQL Server,它是
      sqlserver
    • dataSourceName
      :用于连接到 SQL 数据库的数据源名称(DNS)或连接字符串。它包括 SQL Server 的用户名、密码、主机地址、端口和数据库名称,所有这些内容都应根据您自己的需要进行编辑。
    • query
      :对 SQL Server 数据库执行的查询。
      脚本第一部分中的查询从
      标签
      表和
      浮点
      表中选择多个字段,其中
      TagName
      system\Second
      ,字段为
      V_I
      。然后,将重命名选定字段以匹配 InfluxDB 模式。
      您应该根据自己的需要编辑示例脚本的标签表、浮点表或字符串表名称、字段键(
      V_B
      V_I
      V_D
      V_S
      )以及标签名称。您可以添加多个相同类型的标签,并以“
      or
      ”分隔,例如:
      dbo.TagTable.TagName = 'tag1' or dbo.TagTable.TagName = 'tag2'
      脚本的第二部分中的查询与第一部分类似,只是它从
      浮点
      表中选择字段
      M
      您应该根据自己的需要编辑示例脚本的表类型(浮点表或字符串表)。
  • 映射
    :函数,用于将每条记录中的
    _time
    字段从字符串转换为时间值,或将每条记录中的
    _value
    字段从字符串转换为整数。
    您应该根据自己的需要编辑示例脚本的值类型(
    int
    bool
    float
    string
    )。
  • 目标
    :函数,用于将数据写入组织
    MyOrganization
    中的 InfluxDB 时段
    HMIserver
    您应通过输入自己的时段和组织来编辑示例脚本。要迁移到内置的 InfluxDB,组织名称必须是
    Rockwell
    ;要迁移到外部 InfluxDB,可以自定义组织名称。
提供反馈
对本文档有问题或反馈吗? 请在这里提交您的反馈
Normal