多源复制是什么
多源复制让一个从库同时从多个源实例拉取数据,用于把多个分片汇总到中心库做报表或数仓前置。8.0 语法统一为 CHANGE REPLICATION SOURCE TO ... FOR CHANNEL '通道名',每条复制链路是一个独立通道:位点、线程状态、启停都按通道分开管理。前提是各个源的库表命名不冲突,且没有两个源同时写同一行数据——冲突设计属于架构问题,不是参数能解决的。
基本信息
| 建链语句 | CHANGE REPLICATION SOURCE TO ... FOR CHANNEL '名'(8.0) |
|---|---|
| 启停 | START REPLICA FOR CHANNEL '名' / STOP REPLICA FOR CHANNEL '名' |
| 状态查看 | SHOW REPLICA STATUS FOR CHANNEL '名';P_S 复制表按 CHANNEL_NAME 分组 |
| 自动位点 | SOURCE_AUTO_POSITION=1 基于 GTID,推荐与 GTID 一起使用 |
| 前提条件 | 各源库表命名需隔离(不同库或统一前缀) |
典型使用场景
- 分片汇总:多个业务分片的数据汇总到一张中心报表库
- 多租户归集:每个租户一个实例,汇总库统一做统计与对账
- 机房合并:把多个小机房的实例数据收到中心节点后再做迁移
- 报表前置:源库按业务拆开,汇总节点只承接分析型查询,避免压到生产库
- 演练与灰度:新汇总架构上线前先并行拉取,比对与现有链路的结果
配置两个通道
配置两个通道
-- 通道 A:来自 10.0.0.10
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='10.0.0.10', SOURCE_USER='repl', SOURCE_PASSWORD='***',
SOURCE_AUTO_POSITION=1 FOR CHANNEL 'ch_a';
-- 通道 B:来自 10.0.0.20
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='10.0.0.20', SOURCE_USER='repl', SOURCE_PASSWORD='***',
SOURCE_AUTO_POSITION=1 FOR CHANNEL 'ch_b';
START REPLICA FOR CHANNEL 'ch_a';
START REPLICA FOR CHANNEL 'ch_b';
-- 按通道分别检查状态,别只看默认通道
SHOW REPLICA STATUS FOR CHANNEL 'ch_a'\G通道状态关键字段
| 字段 | 含义 | 异常表现 |
|---|---|---|
| Replica_IO_Running | 拉取线程是否运行 | No 说明连不上源或认证失败 |
| Replica_SQL_Running | 回放线程是否运行 | No 通常是主键冲突或表不存在 |
| Seconds_Behind_Source | 通道级延迟秒数 | 持续增长说明回放跟不上 |
| Last_SQL_Error | 最近一次回放错误 | 冲突类错误需先解决数据问题 |
| Channel_Name | 当前状态所属通道 | 漏加 FOR CHANNEL 时查到的是默认通道 |
多源复制的每个通道都有独立的过滤规则与延迟;监控要按通道名分组,否则汇总一个平均值会把异常通道掩盖掉。
数据冲突是多源复制最常见的失败原因:主键或唯一键相同的两行从不同源重放过来时,第二个必然报错。选型阶段就要决定好是否加实例前缀列或分库隔离。