迁移 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 中,它是标签表中的一列。
- :标签的名称。在 SQL Server 中,它显示在标签表的<tag>TagName列中。
- S:InfluxDB 中的标签键。它表示 SQL Server 中浮点表或字符串表的Status列。
- :SQL Server 中浮点表或字符串表的状态Status列中的状态(C、D、E、S或U)。
- : 为 InfluxDB 定义的字段键,如<FieldKey>V_B、V_I、V_D或V_S,分别表示布尔值、整型值、双精度值或字符串值。
- :标签值。在 SQL Server 中,它显示在浮点表或字符串表的<value>Val列中。如果 <FieldKey> 为 V_I(表示值为整数),则值应采用以下格式:<value>i。例如,V_I=8i。
- M:记号。在 SQL Server 中,它是浮点表或字符串表的列。如果没有标记,可以忽略 M 和 <MarkerValue>。
- : SQL Server 中浮点表或字符串表的“<MarkerValue>标记”列中的值(B、E、S或空白)。
- :InfluxDB 中以 Unix 时间表示的数据点的时间戳。要构造时间戳,请使用 SQL Server 中浮点表或字符串表的<Timestamp>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,字段为。然后,将重命名选定字段以匹配 InfluxDB 模式。V_I您应该根据自己的需要编辑示例脚本的标签表、浮点表或字符串表名称、字段键(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)。
- 目标:函数,用于将数据写入组织中的 InfluxDB 时段MyOrganization。HMIserver您应通过输入自己的时段和组织来编辑示例脚本。要迁移到内置的 InfluxDB,组织名称必须是Rockwell;要迁移到外部 InfluxDB,可以自定义组织名称。
提供反馈