多源复制无需source_connection_auto_failover,核心是for channel指定唯一通道名;需启用table型仓库,按步骤为各主库配置独立channel并启停,状态查询与过滤均须带for channel。

MySQL 多源复制必须用 CHANGE REPLICATION SOURCE TO(8.0.23+)或 CHANGE MASTER TO(旧版)指定 SOURCE_CONNECTION_AUTO_FAILOVER?
不用。多源复制本身和自动故障转移无关,SOURCE_CONNECTION_AUTO_FAILOVER 是 MySQL 8.0.22+ 引入的独立特性,用于主库宕机后自动切到备选源,和「多源」不绑定。配置多源复制的核心是 FOR CHANNEL 'xxx' —— 每个主库必须分配唯一 channel 名,否则后续启动、监控、重连都会混乱。
怎么为两个不同主库添加独立 replication channel
先确保从库已启用 master_info_repository = TABLE 和 relay_log_info_repository = TABLE(5.7+ 默认开启,但建议显式确认),否则 FOR CHANNEL 会报错:ERROR 3077 (HY000): Multi-source replication is not supported when master info repository or relay log info repository is FILE。
实操步骤:
- 停掉所有复制线程:
STOP REPLICA;(8.0.22+)或STOP SLAVE;(旧版) - 为第一个主库添加 channel:
CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.1.10', SOURCE_PORT=3306, SOURCE_USER='repl', SOURCE_PASSWORD='xxx', SOURCE_LOG_FILE='mysql-bin.000001', SOURCE_LOG_POS=154 FOR CHANNEL 'master_a'; - 为第二个主库添加 channel:
CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.1.11', SOURCE_PORT=3307, SOURCE_USER='repl', SOURCE_PASSWORD='yyy', SOURCE_LOG_FILE='binlog.000002', SOURCE_LOG_POS=198 FOR CHANNEL 'master_b'; - 分别启动:
START REPLICA FOR CHANNEL 'master_a';和START REPLICA FOR CHANNEL 'master_b';
查状态、看错误、停某个 channel 时必须带 FOR CHANNEL
不加 channel 名,默认操作的是空字符串 channel(即传统单源模式),极易误操作。比如:
-
SHOW REPLICA STATUS\G只显示空 channel 状态,看不到master_a或master_b - 正确查某 channel:
SHOW REPLICA STATUS FOR CHANNEL 'master_a'\G - 查所有 channel 状态:
SELECT * FROM performance_schema.replication_connection_status;(连接状态)和performance_schema.replication_applier_status_by_coordinator;(应用状态) - 某个 channel 报错卡住,只停它:
STOP REPLICA FOR CHANNEL 'master_b';,别用STOP REPLICA;全停
过滤规则(如 replicate_ignore_db)对多源无效,得用 REPLICATE_REWRITE_DB 或 replicate_do_table 配 channel
全局复制过滤参数(如 replicate_ignore_db)在多源场景下被忽略——MySQL 8.0 明确文档说明「These options apply only to the default (unnamed) channel」。要实现 per-channel 过滤,必须用支持 channel 的语法:
- 库名映射:
CHANGE REPLICATION SOURCE TO SOURCE_RWRITEREPLICA_REWRITE_DB=('old_db','new_db') FOR CHANNEL 'master_a'; - 只同步特定表:
CHANGE REPLICATION SOURCE TO SOURCE_REPLICA_DO_TABLE=('db1.t1','db2.t3') FOR CHANNEL 'master_b'; - 注意:这些是
CHANGE REPLICATION SOURCE TO的子句,不是 my.cnf 配置项;修改后需重启该 channel(STOP/START REPLICA FOR CHANNEL)才生效
channel 名大小写敏感,且不能含空格或特殊字符;一旦设错,后续所有操作都找不到目标,排查起来非常隐蔽。











