DataX 数据同步效率较高,满足大多数场景下的异构数据库间的数据同步需求。同时其配置灵活,支持字段级别的配置,可以轻松应对因异构数据库迁移到 TiDB 而产生的一些改动。

    方案设计如图所示

    第一阶段:切换支持 TiDB 的应用上线之前,把 SQL Server 数据库中的全量数据用 DataX 同步到 TiDB 库中。为避免对线上业务产生影响,可以选择备份库,或者在业务低峰期操作。

    第二阶段:把全量同步改为增量同步,利用 UpdateTime 字段(或其它条件,根据实际业务灵活调整)作为同步 Where 条件,进行增量覆盖式同步。 t_sync_record 表中记录每张表上次增量任务的执行时间。

    第三阶段:支持 TiDB 的应用上线以后,增量同步切换读写数据源改为逆向增量同步,将新数据近实时地写回 SQL Server 数据库。一旦上线之后出现需要回退的情况,可随时切回 SQL Server,待修复之后再次上线。

    第一步:部署 DataX

    下载

    解压

      自检

      第二步:编写 DataX 数据同步 Job(Json格式)

      (1)全量同步Job

      1. {
      2. "job": {
      3. "setting": {
      4. "speed": {
      5. #数据分片,分片数据可同时进行同步
      6. "channel": 128
      7. }
      8. },
      9. "content": [{
      10. #SQL Server配置
      11. "reader": {
      12. "name": "sqlserverreader",
      13. "parameter": {
      14. #数据库用户名
      15. "username": "${srcUserName}",
      16. #数据库密码
      17. "password": "${srcPassword}",
      18. #需要迁移的列名,* 表示全部列
      19. "column": ["*"]
      20. "connection": [{
      21. #需要迁移的表名
      22. "table": ["${tableName}"],
      23. 数据库 jdbc 连接
      24. "jdbcUrl": ["${srcUrl}"]
      25. }]
      26. }
      27. },
      28. #TiDB配置
      29. "writer": {
      30. "parameter": {
      31. #数据库用户名
      32. "username": "${desUserName}",
      33. #数据库密码
      34. "password": "${desPassword}",
      35. #使用 Replace 语法
      36. "writeMode": "replace",
      37. #目标表列名,* 表示全部列
      38. "column": ["*"],
      39. "connection": [{
      40. #数据库 jdbc 连接
      41. "jdbcUrl": "${desUrl}",
      42. #目标表名
      43. "table": ["${tableName}"]
      44. }],
      45. #本次迁移开始前执行的sql-作数据迁移日志使用
      46. "preSql": [
      47. "replace into t_sync_record(table_name,start_date,end_date) values('@table',now(),null)"],
      48. #本次迁移完成后执行的 sql- 作数据迁移日志使用
      49. "postSql": [
      50. "update t_sync_record set end_date=now() where table_name='@table' " ]
      51. }
      52. }
      53. }]
      54. }
      55. }

      (2)增量同步 Job

      vi increase.json

      (3)编写运行DataX Job的Shell执行脚本

      vi datax_excute_job.sh

      1. #!/bin/bash
      2. source /etc/profile
      3. srcUrl="Reader Sql Server 地址"
      4. srcPassword="Sql Server 密码"
      5. desUrl="Writer TiDB 地址"
      6. desUserName="TiDB 账号"
      7. desPassword="TiDB 密码"
      8. # 同步开始时间
      9. defaultsyncUpdateTime="2020-03-03 18:00:00.000"
      10. # 同步周期(秒)
      11. sleepTime="N"
      12. tableName="Table1,Table2,..."
      13. # 循环次数标识,-1为一直循环,其他按输入次数循环
      14. flg=-1
      15. while [ "$flg" -gt 0 -o "$flg" -eq -1 ]
      16. do
      17. #更新时间设置为上次循序执行的时间
      18. if [ "" = "$preRunTime" ]; then
      19. syncTime=$defaultsyncUpdateTime
      20. else
      21. syncTime=$preRunTime
      22. fi
      23. #记录下本次循环执行时间,供下次循环使用
      24. preRunTime=$(date -d +"%Y-%m-%d %T")".000";
      25. echo $syncTime
      26. echo $preRunTime
      27. echo $flg
      28. python {YOUR_DATAX_HOME}/bin/datax.py -p "-DsyncTime='${syncTime}' -DtableName='${tableName}' -DsrcUrl='${srcUrl}' -DsrcUserName='${srcUserName}' -DsrcPassword='${srcPassword}' -DdesUrl='${desUrl}' -DdesUserName='${desUserName}' -DdesPassword='${desPassword}'" {YOUR_DATAX_HOME}/job/increase.json
      29. if [ -1 -lt "$flg" ]; then
      30. let "flg-=1"
      31. fi
      32. sleep $sleepTime
      33. done

      (4)执行 Shell 脚本

      至此,核心脚本和操作都已完成,可通过修改参数配置,达到自己不同的需求,还可以配合数据对比服务,以期达到将应用程序从 SQL Server 顺利迁移到 TiDB 的目的。