15_MySQL 数据同步与迁移方案 ------ 复制 / DataX / Canal / 异构同步(对标 Oracle GoldenGate)
系列定位 :《MySQL 数据库全栈运维实战系列》第 15 篇,与《Oracle 数据库全栈运维实战系列(VMware 版)》同构对标(Oracle 15 OGG:GoldenGate 实时日志复制与异构同步)。适用版本 :MySQL 8.0(5.7 差异随文标注)。官方文档:MySQL 8.0 Reference Manual(Replication / Utilities)、DataX / Canal 官方文档。
一、数据同步与迁移全景

图 1

图 2
| 方式 | 同步时效 | 方向 | 适用场景 | 类比 Oracle |
|---|---|---|---|---|
| 原生复制 | 准实时 | MySQL→MySQL | 主从、读写分离、异地 | DG / MySQL 内部流复制 |
| DataX | 批量(分钟~小时) | 任意异构 | 离线迁移、数仓同步、跨库初始化 | Data Pump + 自研 ETL |
| Canal | 实时(秒级) | MySQL→MQ/异构库 | 业务解耦、缓存刷新、异构同步 | GoldenGate(OGG) |
核心定位 :Canal 伪装成 MySQL 从库、订阅并解析 binlog 再投递,是 MySQL 生态里最接近 OGG 的实时异构同步方案;DataX 是阿里开源的离线批量同步框架,对标 expdp/impdp 加 ETL。
二、原生复制:同步与迁移的底座(官方:Replication)
第 13 篇已完整部署 GTID 主从,这里从"数据同步/迁移"角度补充关键命令。
-- ① 半同步插件(解释:关键事务等至少一个从库收到 binlog 才返回,降低数据丢失)
INSTALL PLUGIN rpl_semi_sync_source SONAME 'semisync_source.so'; -- 8.0(5.7 为 semisync_master)
INSTALL PLUGIN rpl_semi_sync_replica SONAME 'semisync_replica.so'; -- 8.0(5.7 为 semisync_slave)
SET GLOBAL rpl_semi_sync_source_enabled = 1;
SET GLOBAL rpl_semi_sync_replica_enabled = 1;
-- ② 查看复制延迟(解释:Seconds_Behind_Source 是同步监控核心指标)
SHOW REPLICA STATUS\G
-- 关注:Replica_IO_Running=Yes, Replica_SQL_Running=Yes,
-- Seconds_Behind_Source=0, Retrieved_Gtid_Set / Executed_Gtid_Set 差距
-- ③ 停止/重启复制(解释:迁移、对位点常用)
STOP REPLICA;
START REPLICA;
RESET REPLICA ALL; -- 解释:彻底清除复制配置,需谨慎
-- ④ 迁移时校验数据一致性(解释:主从数据核对)
SELECT COUNT(*), SUM(CRC32(checksum_col)) FROM schema1.t1; -- 源、目标各跑一次比对
三、DataX:离线批量同步框架(阿里开源)
DataX 是异构数据源离线同步工具,单进程多线程,用 JSON 描述"reader 从哪读、writer 往哪写"。

图 3
| 组件 | 说明 |
|---|---|
| reader | 读取端(mysqlreader / oraclereader / txtfilereader / hdfsreader) |
| writer | 写入端(mysqlwriter / oraclewritter / hdfswriter) |
| channel | 并发通道、限速(byte/s、record/s) |
3.1 一个标准 MySQL→MySQL 同步任务
{
"job": {
"setting": {
"speed": { "channel": 4, "byte": 10485760 }
},
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "rpl_user",
"password": "Rpl@Pass2026",
"column": ["id", "user_name", "create_time"],
"splitPk": "id",
"connection": [{
"jdbcUrl": ["jdbc:mysql://192.168.10.51:3306/schema1"],
"table": ["t_user"]
}]
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"username": "rpl_user",
"password": "Rpl@Pass2026",
"writeMode": "replace",
"connection": [{
"jdbcUrl": "jdbc:mysql://192.168.10.60:3306/schema2",
"table": ["t_user"]
}]
}
}
}
]
}
}
# 运行任务(解释:datax.py 入口,job 为上面的 JSON)
cd /usr/local/datax/bin
python datax.py /usr/local/datax/job/t_user.json
# 输出末尾会给出:总记录数、总字节、读写并发、脏记录数
VMware 注意事项:DataX 是 CPU/IO 密集型批处理,在虚机上跑全量初始化时注意------① channel 数与虚机 vCPU 匹配(4C 虚机建议 4 通道);② 目标库写盘走 SSD 直通避免 IO 抖动;③ 全量迁移期间临时关闭目标库的 MGR/半同步延迟检查,防止大批量写入拖垮主从延迟告警。
四、Canal:实时订阅 binlog(对标 OGG)

图 4
Canal(阿里巴巴)伪装成 MySQL 从库,向主库发送 dump 协议请求,解析 binlog 后投递到 MQ / 下游。这是 MySQL 版"OGG 实时抽取"的核心。

图 5
| 概念 | 说明 |
|---|---|
| instance | 一个 Canal 实例对应一个源库的一个 binlog 订阅 |
| destination | 订阅目标名(逻辑库别名) |
| parser | binlog 解析器,记忆位点(journal name / position) |
4.1 主库准备(Canal 从库账号)
-- 给 Canal 建"从库"账号(解释:Canal 用复制协议读 binlog)
CREATE USER 'canal'@'%' IDENTIFIED BY 'Canal@Pass2026';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- 确保主库已开 binlog 且为 ROW(解释:Canal 依赖 ROW 格式拿行镜像)
SHOW VARIABLES LIKE 'log_bin'; -- ON
SHOW VARIABLES LIKE 'binlog_format'; -- ROW
4.2 Canal 配置要点
# canal.properties / instance 配置(位置:canal.deployer/conf/example/instance.properties)
canal.instance.master.address=192.168.10.51:3306 # 解释:源库地址
canal.instance.dbUsername=canal # 解释:上面建的账号
canal.instance.dbPassword=Canal@Pass2026
canal.instance.filter.regex=schema1\\.t_user,schema1\\.t_order # 解释:只订阅指定表
canal.mq.topic=canal_topic # 解释:投递到的 MQ topic
# 启动 Canal(解释:deployer 为服务端)
cd /usr/local/canal/bin
sh startup.sh
tail -f /usr/local/canal/logs/example/example.log # 解释:确认成功伪装从库、位点推进
Canal vs 原生复制:原生复制只能 MySQL→MySQL;Canal 把 binlog 变成标准消息,下游可写 Kafka、ES、Redis、异构库------这正是它对标 OGG(支持 Oracle→任意库)的原因。
五、异构同步:MySQL → Oracle / 其他
| 链路 | 推荐方案 | 类比 OGG 能力 |
|---|---|---|
| MySQL→MySQL 实时 | 原生复制 / Canal | OGG 同构复制 |
| MySQL→Oracle 实时 | Canal 投 Kafka → ogg/kafka 适配写入 Oracle | OGG 异构复制 |
| MySQL→PG / ES / Redis | Canal → 下游 adapter | OGG 目标端 |
| MySQL→数仓 Hive/HDFS | DataX 离线批量 | Data Pump + ETL |
| 全量初始化 + 增量追平 | DataX 全量 + Canal 增量(经典组合) | OGG Initial Load + Replicat |

图 6
迁移标准姿势:① DataX 做历史全量;② 记录全量起始 binlog 位点;③ Canal 从该位点起追增量;④ 追平后切换流量。这与 Oracle 迁移里"Data Pump 初始化 + OGG 追增量"完全同构。
六、迁移方案选型与演练
| 场景 | 推荐 | 时效/特点 |
|---|---|---|
| 同版本 MySQL 升级 | 主从复制追平后切换 | 停机最短 |
| 跨版本大版本升级 | 建新主从 + GTID 追平 | 8.0 不支持 5.7→8.0 直接复制回退 |
| 异构到 Oracle | DataX 全量 + Canal 增量 | 准实时、需数据类型映射 |
| 数仓 T+1 | DataX 定时跑批 | 离线、可重跑 |
| 业务解耦/缓存刷新 | Canal → Kafka | 实时、削峰 |
-- 迁移后核对(解释:行数 + 校验和双比对)
SELECT COUNT(*) AS cnt, SUM(CRC32(id)) AS cksum FROM schema1.t_order;
七、要点速记
- 原生复制 是同步底座,重点监控
Seconds_Behind_Source与 GTID 位点差距。 - DataX 是离线批量 :JSON 描述 reader/writer,
python datax.py job.json,适合全量初始化与数仓。 - Canal 实时订阅 binlog:伪装从库、解析行变更、投递 MQ,是 MySQL 生态最接近 OGG 的异构同步工具。
- 经典迁移组合:DataX 全量 + Canal 增量追平,对应 Oracle 的 Data Pump + OGG。
- binlog 必须 ROW:Canal 拿不到行镜像就无法正确同步。
- VMware 批处理注意:channel 与 vCPU 匹配、目标库走 SSD、全量期间调整延迟告警阈值。
八、踩坑记录(实测汇总)
| # | 坑 | 现象 | 解决 |
|---|---|---|---|
| 1 | binlog 为 STATEMENT | Canal 解析丢行变更 | 改 binlog_format=ROW |
| 2 | Canal 账号权限不足 | 伪装从库失败、位点不推进 | 授 REPLICATION SLAVE/CLIENT |
| 3 | DataX channel 开太大 | 虚机 CPU/IO 打满 | channel 与 vCPU 匹配并限速 |
| 4 | 目标表无主键 | 增量 update 无法定位行 | 目标表补主键或用全字段定位 |
| 5 | 全量起始位点没记 | 增量与全量衔接错位、丢数据 | DataX 前记录 binlog 位点,Canal 从该点起 |
| 6 | 字符集不一致 | 中文乱码 | 源/目标统一 utf8mb4 |
| 7 | 5.7/8.0 复制语法混用 | CHANGE MASTER 报错 | 8.0 用 CHANGE REPLICATION SOURCE |
| 8 | 迁移期间没关延迟告警 | 大批量写入触发误告警 | 迁移窗口临时调阈值 |
| 9 | MGR 组内挂异地从库 | 跨城延迟拖垮组提交 | 异地走独立异步复制 |
| 10 | CRC32 校验大表超时 | 核对慢 | 按分区/分片分批校验 |
九、参考资料(官方正式文档)
| 主题 | 官方链接 |
|---|---|
| MySQL 8.0 Reference Manual | https://dev.mysql.com/doc/refman/8.0/en/ |
| MySQL Replication | https://dev.mysql.com/doc/refman/8.0/en/replication.html |
| GTID 复制 | https://dev.mysql.com/doc/refman/8.0/en/replication-gtids.html |
| 半同步复制 | https://dev.mysql.com/doc/refman/8.0/en/replication-semisync.html |
| DataX 官方(GitHub) | https://github.com/alibaba/DataX |
| Canal 官方(GitHub) | https://github.com/alibaba/canal |
本文章属于《MySQL 数据库全栈运维实战系列》高可用架构篇。欢迎收藏、交流。