文章目录
场景
有两个库,需要同步其中的某些表的数据,不想写程序,所以选择一个同步工具,这里选择 datax。
安装
下载
安装
这里以 Linux 操作系统为例,把下载到的 datax.tar.gz 上传到服务器的 /data/software 目录下,执行如下命令解压:
shell
# 解压
cd /data/software && tar -zxvf datax.tar.gz
配置
- 准备边界值存储(以本地文件为例)
创建一个文本文件 25.6-to-10.186-dept_energy_statistics-sync_timestamp.txt,用于记录上次同步的最大时间戳,初始值可设为同步开始前的时间(如 2025-01-01 00:00:00)。
shell
# 创建并初始化边界值文件
echo "2025-01-01 00:00:00" > /data/software/datax/25.6-to-10.186-dept_energy_statistics-sync_timestamp.txt
- 编写 DataX 增量同步 JSON 任务
新建 25.6-to-10.186-dept_energy_statistics.json,核心是在 mysqlreader 的 where 条件中添加时间戳过滤。
cd /data/software/datax/job && vim 25.6-to-10.186-dept_energy_statistics.json
shell
{
"job": {
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "root",
"password": "root",
"column": ["*"],
"connection": [
{
"table": ["dept_energy_statistics"],
"jdbcUrl": ["jdbc:mysql://IP1:3306/db1_data?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai"]
}
],
"where": "update_time > '${last_sync_time}' and update_time <= '${current_sync_time}'",
"splitPk": ""
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"username": "root",
"password": "root",
"column": ["*"],
"connection": [
{
"table": ["dept_energy_statistics"],
"jdbcUrl": "jdbc:mysql://IP2:3306/db2_data?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai"
}
],
"preSql": [],
"batchSize": 1000,
"onDuplicateKeyUpdate": {
"key": [],
"updateColumn": []
}
}
}
}
],
"setting": {
"speed": {
"channel": 3
}
}
}
}
- 编写 Shell 脚本(自动化边界值更新 + 任务执行)
新建 25.6-to-10.186-dept_energy_statistics.sh,实现「读取上次边界值→生成本次同步时间→执行 DataX 任务→更新边界值」的完整流程。
cd /data/software/datax && vim 25.6-to-10.186-dept_energy_statistics.sh
shell
#!/bin/bash
# 显式配置 Java 环境变量(解决 crontab 无法识别的问题)
export JAVA_HOME=/usr/local/java/jdk8u452
export PATH=$JAVA_HOME/bin:$PATH
# 1. 定义常量
DATAX_PATH="/data/software/datax" # DataX 安装目录
JOB_FILE="${DATAX_PATH}/job/25.6-to-10.186-dept_energy_statistics.json" # DataX 任务文件路径
TIMESTAMP_FILE="${DATAX_PATH}/25.6-to-10.186-dept_energy_statistics-sync_timestamp.txt" # 边界值文件路径
SOURCE_DB_IP="IP1"
TARGET_DB_IP="IP2"
# 2. 读取上次同步的最大时间戳
last_sync_time=$(cat ${TIMESTAMP_FILE})
# 3. 生成本次同步的结束时间(当前系统时间,格式与数据库时间一致)
current_sync_time=$(date +"%Y-%m-%d %H:%M:%S")
echo "开始增量同步,同步范围:${last_sync_time} ~ ${current_sync_time}"
# 4. 替换 DataX 任务文件中的变量,并执行同步任务
python3 ${DATAX_PATH}/bin/datax.py \
-p "-Dlast_sync_time='${last_sync_time}' -Dcurrent_sync_time='${current_sync_time}'" \
${JOB_FILE}
# 5. 同步成功后,更新边界值文件(将本次结束时间作为下次开始时间)
if [ $? -eq 0 ]; then
echo "${current_sync_time}" > ${TIMESTAMP_FILE}
echo "增量同步成功,已更新边界值为:${current_sync_time}"
else
echo "增量同步失败,请检查日志"
exit 1
fi
- 定时调度(Linux crontab)
设置每小时执行一次脚本,实现准实时增量同步。
crontab -e
shell
0 * * * * /bin/bash /data/software/datax/25.6-to-10.186-dept_energy_statistics.sh >> /data/software/datax/sync_logs.log 2>&1
********************************** 只要思想不滑坡,办法总比困难多**********************************