MySQL 5.7多源复制需配置多个独立复制通道,强制要求master_info_repository和relay_log_info_repository设为TABLE模式,每个CHANGE REPLICATION SOURCE TO必须带合法FOR CHANNEL子句,START/SHOW/STOP操作须显式指定通道,且各通道需配置不冲突的relay-log前缀。

MySQL 5.7 多源复制不是“开启功能”,而是靠正确配置多个复制通道实现的;漏掉 FOR CHANNEL、用错 master_info_repository 类型,或者没为每个通道指定独立 relay-log 前缀,都会导致静默失败——看起来没报错,但复制根本不跑。
必须先设成 TABLE 模式,FILE 模式直接报错
MySQL 5.7 多源复制强制要求元数据存表,master_info_repository 和 relay_log_info_repository 都必须是 '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 SLAVE) SET GLOBAL master_info_repository = 'TABLE';SET GLOBAL relay_log_info_repository = 'TABLE';- 再确认:
SHOW VARIABLES LIKE '%repository%';,两个值都应为TABLE
这步不能跳过,哪怕你只加第二个通道——只要任一变量还是 FILE,新通道就无法注册。
每个 CHANGE 必须带非空、合法的 FOR CHANNEL
FOR CHANNEL 是强制语法,不是可选参数。漏写、写成空字符串 FOR CHANNEL ''、或通道名含点/短横/空格(如 'order.db' 或 'master-1'),MySQL 都会当作默认通道(空名)处理,覆盖前一个配置,且不报错。
正确写法示例:
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 'order_master';
通道名建议用有意义的下划线命名(如 'user_master'),避免 'a'、'b' 这类简写,否则查状态时极易混淆。
START/SHOW/STOP 都要按通道显式指定
这是最常踩的坑:执行完所有 CHANGE ... FOR CHANNEL 后,只敲一次 START REPLICA,结果只有默认通道在跑,其他通道完全不动——SHOW REPLICA STATUS 根本不显示它们。
必须逐个操作:
- 启动单个通道:
START REPLICA FOR CHANNEL 'order_master'; - 查看指定通道状态:
SHOW REPLICA STATUS FOR CHANNEL 'order_master'\G(加\G才能看清字段) - 停止单个通道:
STOP REPLICA FOR CHANNEL 'user_master';
没有“启动全部通道”的命令。START REPLICA 不带 FOR CHANNEL 只影响默认通道(空名),其余通道始终处于 STOPPED 状态。
relay-log 前缀必须为每个通道单独设置
多个通道若共用默认 relay-log 前缀(如都用 relay-bin),中继日志文件会冲突,复制中途卡死或丢事件。
解决方式有两种:
- 在配置文件中统一设基础名:
relay-log = rela(注意结尾无数字,MySQL 会自动追加编号) - 或更稳妥地,在每个
CHANGE REPLICATION SOURCE TO里显式指定前缀:RELAY_LOG_FILE = 'rela_order_000001'(需配合RELAY_LOG_POS)
实际部署中,建议用第一种方式,并确保该前缀在所有通道间不重叠——比如 rela_user、rela_order、rela_log,而不是全用 relay-bin。
真正麻烦的不是配置步骤,而是所有通道的状态、日志位置、错误码都要单独盯;一个通道出错不会影响另一个,但你也无法靠“整体状态”判断是否全通——每个 FOR CHANNEL 都得单独 SHOW 一遍。


















