深色模式
数据迁移工具与异构同步
摘要:数据迁移分同构(MySQL→MySQL)与异构(MySQL→ES/数仓)。核心流程是「全量 + 增量追平 + 双向校验 + 切换」。本文给出常用工具选型与一次安全迁移的执行顺序。
适用环境
bash
# 源库与目标库网络互通,并确认版本与字符集
mysql -uroot -p -h src -e "SELECT @@version, @@character_set_server;"
mysql -uroot -p -h dst -e "SELECT @@version, @@character_set_server;"1
2
3
2
3
操作步骤
1. 工具选型
| 工具 | 适用场景 | 特点 |
|---|---|---|
| mysqldump / mydumper | 同构全量 | 简单可靠;mydumper 支持并行 |
| Canal / Debezium | MySQL 增量(解析 binlog) | 准实时同步到 ES/消息队列/数仓 |
| DataX | 异构批量同步 | 插件丰富,配置式 |
| 官方复制 | MySQL→MySQL 长期同步 | 延迟低,但要求同构 |
2. 全量迁移(同构)
bash
# 源端导出(记录 binlog 位点,供增量追平)
mysqldump -uroot -p -h src --single-transaction --master-data=2 \
--databases shopdb | gzip > /tmp/shopdb_full.sql.gz
# 目标端导入
zcat /tmp/shopdb_full.sql.gz | mysql -uroot -p -h dst1
2
3
4
5
6
2
3
4
5
6
bash
# 大库用 mydumper/myloader 并行加速
mydumper -u root -p '密码' -h src -B shopdb -t 8 -o /tmp/dump_dir
myloader -u root -p '密码' -h dst -t 8 -d /tmp/dump_dir1
2
3
2
3
3. 增量追平(以 MySQL 复制为例)
sql
-- 目标库作为源库的从库追增量
CHANGE MASTER TO MASTER_HOST='src', MASTER_USER='repl',
MASTER_PASSWORD='ReplPass!2026', MASTER_AUTO_POSITION=1;
START SLAVE;
SHOW SLAVE STATUS\G -- 确认 Seconds_Behind_Master 归零1
2
3
4
5
2
3
4
5
4. 异构同步(MySQL → ES,Canal 思路)
properties
# canal.properties 关键项(示例)
canal.instance.master.address=10.0.1.10:3306
canal.instance.dbUsername=canal
canal.instance.dbPassword=CanalPass!2026
canal.instance.filter.regex=shopdb\\..*1
2
3
4
5
2
3
4
5
sql
-- Canal 需要类似 MySQL 从库的权限
CREATE USER 'canal'@'%' IDENTIFIED BY 'CanalPass!2026';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';1
2
3
2
3
异构同步要提前约定字段映射与主键:ES 用业务主键作为
_id,否则重复投递会产生重复文档。
5. 数据校验
sql
-- 行数比对
SELECT COUNT(*) FROM shopdb.orders; -- 源
SELECT COUNT(*) FROM shopdb.orders; -- 目标
-- 校验和比对(抽样大表)
SELECT BIT_XOR(CRC32(CONCAT_WS(',', id, status, amount))) FROM shopdb.orders WHERE id BETWEEN 1 AND 100000;1
2
3
4
5
6
2
3
4
5
6
bash
# 也可用 pt-table-checksum(同构场景)
pt-table-checksum --user=root --password=密码 --host=src --databases=shopdb1
2
2
6. 切换
bash
# 停写 → 等增量追平 → 校验 → 改应用连接串 → 观察
# 回退预案:保留源库只读一段时间,随时可切回1
2
2
危险
异构同步不是事务性的,中途失败可能产生重复或部分数据。目标端消费应保证幂等(按主键 upsert),并在切换前做全量校验,而不是只看「同步任务在跑」。
验证
- [ ] 目标库各表行数与源库一致
- [ ] 抽样校验和一致
- [ ] 增量延迟归零后停止写入,追平完成
- [ ] 应用切到新库后核心接口正常,错误日志无新增
常见坑
WARNING
字符集不一致(源 utf8mb3、目标 utf8mb4)会导致长度超限或乱码,迁移前统一对齐。
WARNING
目标端如果有自增主键或触发器,会与导入数据冲突;导入前临时禁用触发器与外键检查。
DANGER
迁移切换必须保留回滚窗口:源库保持只读而非立即下线,确认新库稳定运行后再释放。