15_MySQL 数据同步与迁移方案 —— 复制 / DataX / Canal / 异构同步(对标 Oracle GoldenGate)

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;

七、要点速记

  1. 原生复制 是同步底座,重点监控 Seconds_Behind_Source 与 GTID 位点差距。
  2. DataX 是离线批量 :JSON 描述 reader/writer,python datax.py job.json,适合全量初始化与数仓。
  3. Canal 实时订阅 binlog:伪装从库、解析行变更、投递 MQ,是 MySQL 生态最接近 OGG 的异构同步工具。
  4. 经典迁移组合:DataX 全量 + Canal 增量追平,对应 Oracle 的 Data Pump + OGG。
  5. binlog 必须 ROW:Canal 拿不到行镜像就无法正确同步。
  6. 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 数据库全栈运维实战系列》高可用架构篇。欢迎收藏、交流。

相关推荐
Linux界最忧郁之人1 小时前
华为云ECS&IMS&AS实战|弹性云服务器、私有镜像、弹性伸缩完整实验
linux·运维·服务器·centos·华为云·openstack
zjx23881 小时前
oracle11g转Gbase8s库SQL常见问题修改
数据库·sql
真上帝的左手2 小时前
30. 技术专题-‌应用框架组件-缓存-Redis
数据库·redis·分布式·缓存·中间件
后台模板学习2 小时前
GitHub Actions 与 Jenkins 在日志监
运维·github·jenkins
雪芽蓝域zzs2 小时前
第 2 章:整合 MySQL + MyBatis,搭建数据库基础、实体类、Mapper、测试查询
数据库·mysql·mybatis
whyutianict_vv2 小时前
零基础转 AI 运维:投入清单、技术路线与核对表
linux·运维·人工智能·ai
实泽有之,无泽虚之2 小时前
SQL Server数据库备份与还原详解
数据库·sqlserver
DevOpenClub2 小时前
高考一分一段 API:分数查位次、科类枚举与历史对照
linux·数据库·高考
Java后端的Ai之路2 小时前
Java并发编程07-等待通知机制优化循环等待
java·数据库·python