MySQL 5.7 多源复制必须使用 FOR CHANNEL 显式指定通道名,漏写或错写将导致静默失败;元数据存储必须设为 TABLE 模式(master_info_repository 和 relay_log_info_repository 均需为 TABLE),否则报错 ERROR 3077;START/SHOW REPLICA 必须带 FOR CHANNEL 参数,否则仅操作默认通道。

MySQL 5.7 中多源复制必须用 FOR CHANNEL,漏写或写错 channel 名会导致复制静默失败——它不会报错,但那个通道根本不会启动。
必须先设成 TABLE 存储元数据
多源复制不支持 FILE 模式,否则执行 CHANGE REPLICATION SOURCE TO ... FOR CHANNEL 会直接报错:ERROR 3077 (HY000): To have multiple channels, repository cannot be of type FILE。
- 动态修改前必须先停掉所有复制线程:
STOP REPLICA(注意:5.7.28+ 推荐用STOP REPLICA,不是STOP SLAVE) - 然后执行:
SET GLOBAL master_info_repository = 'TABLE';和SET GLOBAL relay_log_info_repository = 'TABLE'; - 确认生效:
SHOW VARIABLES LIKE '%repository%';,两个值都应为TABLE - 这一步不能跳过,哪怕你只打算加第二个 channel
每个 CHANGE REPLICATION SOURCE TO 都要带显式 channel 名
5.7.17+ 统一使用 SOURCE 术语(旧版 MASTER 已弃用),且 FOR CHANNEL 是强制的——空 channel(即不写 FOR CHANNEL)会被当作默认通道,仅能存在一个。
- 正确写法:
CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.1.101', SOURCE_USER='rpl', SOURCE_PASSWORD='pwd', SOURCE_LOG_FILE='mysql-bin.000001', SOURCE_LOG_POS=154 FOR CHANNEL 'src_a'; - 错误写法:
CHANGE REPLICATION SOURCE TO ...;(缺FOR CHANNEL)或FOR CHANNEL ''(空名) - channel 名必须是合法标识符(字母/数字/下划线,不能含点、短横等),且全局唯一;重复命名会覆盖前一个配置
- 不同主库建议用有意义的名字,比如
'order_master'、'user_master',别用'a'、'b'这类易混淆的简写
START REPLICA 和 SHOW REPLICA STATUS 必须指定 channel
这是最常踩的坑:敲完所有 CHANGE ... FOR CHANNEL 后,只执行一次 START REPLICA,结果只有默认通道(空名)在跑,其他全卡住不动——SHOW REPLICA STATUS 根本不显示它们。
- 启动单个通道:
START REPLICA FOR CHANNEL 'src_a'; - 查看指定通道状态:
SHOW REPLICA STATUS FOR CHANNEL 'src_a'\G(加\G才能看清字段) - 停止单个通道:
STOP REPLICA FOR CHANNEL 'src_b'; - 不要依赖
START REPLICA全局命令,它只影响默认通道;也没有“启动全部 channel”的快捷方式 - 检查是否真在运行:
SELECT CHANNEL_NAME, SERVICE_STATE FROM performance_schema.replication_connection_status;
server_id 冲突和跨通道冲突是隐性故障源
即使语法全对、所有 channel 都显示 IO_Running: Yes、SQL_Running: Yes,仍可能出问题。
-
server_id必须全局唯一:从库自己的server_id不能和任一主库重复,否则 IO 线程无法连接,日志里只写Could not initialize master info structure,不提示具体原因 - 跨通道无自动冲突处理:如果
src_a和src_b都往同一个表log.events插数据,大概率触发ERROR 1062 (23000): Duplicate entry '123' for key 'PRIMARY',SQL_Running变No,且不会自动跳过 - 并行参数(如
replica_parallel_workers)只作用于单个 channel 内部,对跨 channel 冲突完全无效 - 真正安全的做法是:提前约定各主库写不同库/不同表,或由应用层控制写入路由
channel 名拼错、FOR CHANNEL 漏写、START REPLICA 不带参数——这三个地方出错,MySQL 都不会明确报错,只会让复制“假装在运行”。查状态不带 FOR CHANNEL 就等于没查,这是线上最容易被忽略的盲区。


















