一、概述
在大数据迁移或数据同步场景中,经常需要将多个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,表示向目标表插入数据。batchSize和batchByteSize优化写入性能。 - 占位符 :所有以
{``{...}}形式出现的变量都将被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)中,实现周期性同步。