使用DataX实现MySQL到MySQL的批量表同步(灵活配置方案)

一、概述

在大数据迁移或数据同步场景中,经常需要将多个MySQL表从源库同步到目标库(可能是同一库或不同库)。DataX作为阿里云开源的异构数据源离线同步工具,支持丰富的插件,通过JSON配置文件定义同步任务。本方案通过编写一个JSON模板和一个Shell脚本,实现对多个表的批量同步,并可灵活指定同步条件(如按年份分区)。本文档包含DataX的下载部署、JSON模板编写、Shell脚本实现以及总结。

二、DataX下载与部署

1.直接使用官方预编译包(推荐,无需编译)

1.1 下载datax
sh 复制代码
https://datax-opensource.oss-cn-hangzhou.aliyuncs.com/202308/datax.tar.gz
1.2 解压安装
sh 复制代码
# 解压到指定目录,例如/data/software/
tar -zxvf datax.tar.gz -C /data/software/
cd /data/software/datax
1.3 验证安装

如果看到输出包含"任务启动时刻"及"任务结束时刻",则安装成功。

sh 复制代码
# 执行自检脚本,测试DataX是否可用
python /data/software/datax/bin/datax.py /data/software/datax/job/job.json

2.源码编译

2.1 环境准备
  • JDK:1.8 或以上版本
  • Maven:3.x 版本(建议 3.6+)
  • Python:2.6+ 或 3.x(用于执行 datax.py
sh 复制代码
java -version
mvn -version
python --version   # 或 python3 --version
2.2 进入源码目录并编译

编译成功后,会在 target/ 目录下生成 datax.tar.gz

sh 复制代码
# 进入您解压后的源码目录(DataX-datax_v202309)
cd DataX-datax_v202309

# 执行 Maven 打包命令
mvn -U clean package assembly:single -Dmaven.test.skip=true
2.3 解压并使用

将生成的 tar 包解压到安装目录(如 /data/software/datax):

sh 复制代码
tar -zxvf target/datax.tar.gz -C /data/software/
cd /data/software/datax

三、JSON模板编写

1. 模板设计思路

为了实现批量同步,我们定义一个JSON模板文件template.json,其中使用变量占位符(如{``{src_host}})代替具体的数据库连接信息和表名。后续通过Shell脚本的sed命令替换这些占位符,生成针对每个表的实际任务JSON文件。

2.模板内容

sh 复制代码
{
  "job": {
    "setting": {
      "speed": {
        "channel": 5
      }
    },
    "content": [
      {
        "reader": {
          "name": "mysqlreader",
          "parameter": {
            "username": "{{src_username}}",
            "password": "{{src_password}}",
            "column": ["*"],
            "connection": [
              {
                "jdbcUrl": ["jdbc:mysql://{{src_host}}:{{src_port}}/{{src_db}}"],
                "table": ["{{src_table}}"]
              }
            ],
            "where": "{{where}}"
          }
        },
        "writer": {
          "name": "mysqlwriter",
          "parameter": {
            "batchSize": "2048",
            "batchByteSize": "33554432",
            "username": "{{dest_username}}",
            "password": "{{dest_password}}",
            "column": ["*"],
            "writeMode": "insert",
            "connection": [
              {
                "jdbcUrl": "jdbc:mysql://{{dest_host}}:{{dest_port}}/{{dest_db}}",
                "table": ["{{dest_table}}"]
              }
            ]
          }
        }
      }
    ]
  }
}

3.关键参数说明

  • reader部分 :使用MySQLReader插件,通过JDBC连接源库。where条件可灵活指定,例如按时间字段筛选数据。
  • writer部分 :使用MySQLWriter插件,writeMode设为insert,表示向目标表插入数据。batchSizebatchByteSize优化写入性能。
  • 占位符 :所有以{``{...}}形式出现的变量都将被Shell脚本替换。

四、Shell脚本实现批量同步

1.脚本功能

脚本定义了源库和目标库的连接信息、待迁移的表列表(支持源表名与目标表名不同)、以及同步的where条件。通过遍历表列表,为每张表生成对应的JSON任务文件,并以后台方式执行DataX任务,日志输出到独立文件。

2.脚本内容(sync_data.sh

sh 复制代码
#!/bin/bash
                                                                                                           
set -e
#源数据库信息
#src_jdbcUrl="jdbc:mysql://172.18.45.28:53306/cqshzl"
src_host="172.18.130.11"
src_port="53306"
src_db="irs"
src_username="root"
src_password="xxx"
#src_password="HpNy2H0qf9Gdf!X"
#目标数据库信息
#dest_jdbcUrl="jdbc:mysql://172.18.45.28:53306/cqshzl"
dest_host="172.18.130.132"
dest_port="53306"
dest_db="cqshzl"
dest_username="sync"
dest_password="xxx"
#TABLES=("user" "order" "product" "log")
#条件
#year="2025"
#where="YEAR(follow_end_time) ='$year'"
# 待迁移表列表(格式:源表名:目标表名)
tables=(
        "task_base_info_grid_distribute:task_base_info_grid_distribute_irs"
        "task_base_info_new_distribute:task_base_info_new_distribute_irs"
      )
                                                                                                           
# 遍历表名,生成配置文件
for table_pair in "${tables[@]}"; do
  # 分割源表名和目标表名
  IFS=':' read -ra TABLE <<< "$table_pair"
  src_table="${TABLE[0]}"
  dest_table="${TABLE[1]}"
  # 替换模板中的占位符
  sed  -e "s/{{src_table}}/$src_table/g"  \
       -e "s/{{src_username}}/$src_username/g" \
       -e "s/{{src_password}}/$src_password/g" \
       -e "s/{{src_host}}/$src_host/g" \
       -e "s/{{src_port}}/$src_port/g" \
       -e "s/{{src_db}}/$src_db/g" \
       -e "s/{{dest_table}}/$dest_table/g" \
       -e "s/{{dest_username}}/$dest_username/g" \
       -e "s/{{dest_password}}/$dest_password/g" \
       -e "s/{{dest_host}}/$dest_host/g" \
       -e "s/{{dest_port}}/$dest_port/g" \
       -e "s/{{dest_db}}/$dest_db/g" \
       template.json > "job_${dest_table}.json"
                                                                                                           
  # 执行 DataX 任务
    echo "正在迁移表: $src_table => $dest_table ..."
  python /data/dataX/datax/bin/datax.py  "job_${dest_table}.json" > "${dest_table}.log" 2>&1 &
  # 检查执行状态
  if [ $? -eq 0 ]; then
    echo "脚本执行成功,请查看日志${dest_table}.log"
  else
    echo "脚本执行失败,请查看日志${dest_table}.log"
  fi
done

echo "所有表同步任务已启动,请查看日志"

3.脚本说明与注意事项

  • 密码中的特殊字符 :如果密码包含&\等特殊符号,在sed替换时可能会被解释。上述脚本中已将密码中的&转义为\&,但更稳妥的做法是使用其他分隔符或对变量进行转义处理。
  • 后台执行 :脚本使用&将DataX任务放到后台执行,以便同时启动多个任务。若需串行执行,可去掉&
  • 日志查看 :每个任务生成独立的日志文件(如test2025.log),方便跟踪单个任务的执行情况。
  • 灵活性 :通过修改tables数组和where条件,可轻松调整同步范围。支持源表名与目标表名不同,适用于表名需要追加后缀的场景(如按年份分表)。

五、总结

1.方案优势

  • 批量处理:通过脚本自动生成JSON并调用DataX,避免手动编写多个任务文件。
  • 灵活配置 :支持自定义同步条件(where)、表名映射,适应不同业务需求。
  • 易于扩展:只需维护一个模板文件和一个脚本,新增表只需在数组中添加一行。
  • 性能可控 :可通过调整channel数量、batchSize等参数优化同步速度。

2. 使用建议

  • 首次使用前,先在单表上测试模板和脚本,确保替换正确、同步正常。
  • 对于大批量同步,建议在业务低峰期执行,并监控源/目标库负载。
  • 可将脚本集成到调度系统(如Crontab)中,实现周期性同步。
相关推荐
程序员夏末2 小时前
【JchatMind智能体 | 第二天】为何选 PostgreSQL + pgvector 而非 MySQL?
数据库·mysql·postgresql·ai编程·ai agent
数据知道2 小时前
详解MongoDB标签感知分片:基于区域的数据分布控制与优化策略
数据库·mongodb
xcLeigh2 小时前
复杂 SQL 过滤时机过晚?金仓基于代价的连接条件下推方案来了
java·数据库·sql语句·union·金仓·kingbasees
wwwwanggy2 小时前
【MySQL】表空间丢失处理(Tablespace is missing for table 错误处理)
数据库·mysql
Mr. Cao code2 小时前
快速部署MySQL 8.0:二进制安装全攻略
运维·数据库·mysql
herinspace2 小时前
管家婆iShop如何调整商品成本?
服务器·数据库·学习·电脑·excel
Nuopiane2 小时前
Mypal3(9)
前端·javascript·数据库
A.A呐2 小时前
【QT第四章】QT窗口
服务器·数据库·qt
LabVIEW开发2 小时前
LabVIEW数据库单字段更新实操
数据库·labview·labview知识·labview功能·labview程序