多源复制是MySQL 5.7+支持的一个从库同时从多个主库同步数据的机制,通过channel实现并行多主同步,需避免表名冲突、relay log竞争等风险,并须精细化监控与压测验证。

什么是多源复制,MySQL 5.7+ 才真正可用
MySQL 多源复制(Multi-Source Replication)是指一个从库(slave)同时从多个主库(master)拉取 binlog 并应用,适用于把多个业务库(如 order_db、user_db、log_db)合并到一个统一查询/分析从库的场景。注意:MySQL 5.6 不支持原生多源,仅靠 CHANGE MASTER TO 覆盖式配置;只有 5.7 及以上版本通过 channel 机制才真正支持并行多主同步。
配置前必须关掉 sql_slave_skip_counter 和全局 replicate_ignore_db
多源复制下,传统基于库名的过滤逻辑(如 replicate_ignore_db)对所有 channel 生效,极易误过滤;而 sql_slave_skip_counter 是全局计数器,无法按 channel 精确跳过错误。正确做法是:
- 用
replicate_ignore_table或replicate_wild_ignore_table按 channel 单独设置(例如:CHANGE REPLICATION FILTER replicate_ignore_table = ('mysql.%') FOR CHANNEL 'order_master';) - 出错时优先用
SET GLOBAL sql_slave_skip_counter = 1; START SLAVE SQL_THREAD FOR CHANNEL 'xxx';,但仅限临时修复,不能长期依赖 - 避免在多源环境中启用
skip-slave-start,否则所有 channel 都不会自动启动
START SLAVE FOR CHANNEL 启动失败常见原因
执行 START SLAVE FOR CHANNEL 'xxx'; 报错最常见的是权限、网络或 position 不匹配。典型错误包括:
-
ERROR 2003 (HY000): Can't connect to MySQL server on 'xxx' (111):检查从库能否 telnet 通主库对应端口,且主库bind_address未绑定为127.0.0.1 -
ERROR 1236 (HY000): Could not find first log file name in binary log index file:说明MASTER_LOG_FILE值在主库上已不存在(被 purged),需重新mysqldump --single-transaction --master-data=2导出并重置 channel - 不同 channel 使用了相同
relay_log文件前缀(如都用默认relay-log):会导致 relay log 冲突,必须为每个 channel 显式指定唯一前缀,例如:CHANGE MASTER TO ... RELAY_LOG_FILE='relay_order.000001' FOR CHANNEL 'order_master';
冲突处理与表名重复风险必须人工兜底
MySQL 多源复制不解决逻辑冲突——如果两个主库都有 payment 表,且结构或数据不一致,合并到同一个从库就会直接报错(如 ERROR 1050 (42S01): Table 'payment' already exists)。这不是配置能绕过的:
- 建库阶段就要约定命名空间,比如强制所有业务库使用前缀:
order_payment、user_payment - 不推荐用
replicate_rewrite_db做库名重写(已废弃且不支持多 channel 精确控制) - DDL 同步要格外小心:一个 channel 的
DROP TABLE可能误删另一个 channel 正在用的同名表,建议禁用跨库 DDL 同步,只同步 DML - 监控必须细化到 channel 级:
SHOW SLAVE STATUS FOR CHANNEL 'xxx'\G中的Seconds_Behind_Master、SQL_Delay、Retrieved_Gtid_Set都要单独采集,不能只看整体状态
多源复制不是“配完就跑”,channel 之间隔离是弱隔离,表级冲突、GTID 交叉、relay log 竞争都是静默隐患,上线前务必用真实业务流量压测至少 48 小时。


















