新闻

如何高效迁移 SQL Server 数据到 DolphinDB

2022.12.06

作为传统的事务型数据库,SQLServer有着出色的读写性能,但当面对高吞吐量数据写入以及海量的数据分析等场景时,却无法满足需求;即使数据量较小,能满足数据写入的要求,也难以同时响应实时计算的请求。本文旨在为有从 SQL Server 迁移至 DolphinDB 需求的用户提供一份简洁明了的参考。

迁移数据

DolphinDB 提供了多种灵活的数据同步方法,来帮助用户方便地把海量数据从多个数据源进行全量同步或增量同步。本文基于深交所逐笔委托数据,为大家介绍如何高效将数据从 SQL Server 迁移至 DolphinDB。

本案例中使用的软件版本为:

  • DolphinDB: DolphinDB_Linux64_V2.00.8.6
  • SQL Server: Microsoft SQL Server 2017 (RTM-CU31) (KB5016884) - 14.0.3456.2 (X64)
  • 假设现有最近 10 年的逐笔委托数据,存储于 SQL Server。为方便后期与其他数据源的逐笔委托数据整合,数据迁移过程中要对表结构进行部分调整,字段对应表如下所示:

方法一:ODBC 插件

ODBC(Open Database Connectivity) 插件是 DolphinDB 提供的通过 ODBC 接口访问 SQL Server 的开源产品。插件配合 DolphinDB 脚本使用,与服务器在同一个进程空间内运行,能高效地完成 SQL Server 数据到 DolphinDB 的数据写入。

数据迁移核心步骤如下:

  • 安装 ODBC 驱动(ubunt22.04)

终端中运行以下命令安装 freeTDS 程序库、unixODBC 库和 SQL Server ODBC 驱动:

# 安装 freeTDSapt install -y freetds# 安装 unixODBC 库apt-get install unixodbc unixodbc-dev# 安装 SQL Server ODBC 驱动apt-get install tdsodbc
  • 配置环境

在 / etc/freetds/freetds.conf 和  / etc/odbcinst.ini 中分别配置 IP 地址、端口等其他设置。

  • 建立连接

加载 ODBC 插件后,运行以下命令建立与 SQL Server 的连接:

conn =odbc::connect("Driver={SQLServer};Servername=sqlserver;Uid=sa;Pwd=Dolphin
  • 同步数据

运行以下脚本执行同步:

def transform(mutable msg){  msg.replaceColumn!(`LocalTime,time(temporalParse(msg.LocalTime,"HH:mm:ss.nnnnnn")))    msg.replaceColumn!(`Price,double(msg.Price))  msg[`SeqNo]=int(NULL)  msg[`DataStatus]=int(NULL)  msg[`BizIndex]=long(NULL)  msg[`Market]="SZ"  msg.reorderColumns!(`ChannelNo`ApplSeqNum`MDStreamID`SecurityID`SecurityIDSource`Price`OrderQty`Side`TransactTime`OrderType`LocalTime`SeqNo`Market`DataStatus`BizIndex)    return msg}def synsData(conn,dbName,tbName){    odbc::query(conn,"select ChannelNo,ApplSeqNum,MDStreamID,SecurityID,SecurityIDSource,Price,OrderQty,Side,TransactTime,OrderType,LocalTime from data",loadTable(dbName,tbName),100000,transform)}submitJob("synsData","synsData",synsData,conn,dbName,tbName)
startTime                      endTime2022.11.28 11:51:18.092        2022.11.28 11:53:20.198

方法二:DataX 驱动

DataX 是可扩展的数据同步框架,将不同数据源的同步抽象为从源头数据源读取数据的 Reader 插件,以及向目标端写入数据的 Writer 插件,理论上 DataX 框架可以支持任意数据源类型的数据同步工作。

DolphinDB 提供基于 DataXReader 和 DataXWriter 的开源驱动。DolphinDBWriter 插件实现了向 DolphinDB 写入数据,使用 DataX 的现有 reader 插件结合 DolphinDBWriter 插件,即可实现从不同数据源向 DolphinDB 同步数据。用户可以在 Java 项目中包含 DataX 的驱动包,开发从 SQL Server 数据源到 DolphinDB 的数据迁移软件。

DataX 驱动的开发基于 Java SDK,支持高可用。

数据迁移核心步骤如下:

  • 部署 DataX 及相关插件

下载DataX压缩包后,解压至自定义目录;将 Github 中源码的 ./dist/dolphindbwriter 目录下所有内容拷贝到 DataX/plugin/writer 目录下,即可使用。

  • 配置文件

配置文件 synchronization.json 置于 data/job 目录下。

  • 执行任务

在Linux 终端中执行以下命令执行 DataX 任务:

cd ./DataX/bin/python DataX.py ../job/synchronization.json
任务启动时刻                    : 2022-11-28 17:58:52任务结束时刻                    : 2022-11-28 18:02:24任务总计耗时                    :                212s任务平均流量                    :            3.62MB/s记录写入速度                    :          78779rec/s读出记录总数                    :            16622527读写失败总数                    :                   0

ODBC or DataX ?

使用 ODBC 插件和 DataX 驱动进行数据迁移的耗时分别为 122s 和212s。

当数据量增大,尤其当表的数量增多时,ODBC 插件的速度优势更为明显。而且即使不需要对同步数据进行处理,DataX 也需要对每一个表配置一个 json,而 ODBC 则只需要更改表名即可,实现难度明显低于 DataX。

由此可见,ODBC插件的性能优于DataX,我们更加推荐大家使用 ODBC 插件的方式进行数据迁移。