MySQL 8.0 多源复制必须显式创建命名通道并逐个配置,漏写 FOR CHANNEL 或混用通道名会直接报错;需先 STOP REPLICA 再配置,否则触发 ERROR 3080;通道名须全小写、无特殊字符、≤64 字符且语义清晰;SOURCE_HOST 必须 DNS 可解析;过滤规则(如 REPLICATE_DO_DB)必须按通道单独设置;SHOW REPLICA STATUS 必须带 FOR CHANNEL 才能查看真实状态。

MySQL 8.0 多源复制本身不自动启用,必须显式创建多个命名通道并逐个配置;漏写 FOR CHANNEL 或混用通道名会直接报错,且过滤规则(如 REPLICATE_DO_DB)必须按通道单独设置,否则无效。
必须先停复制再配置通道
并发修改通道配置会触发 ERROR 3080。执行任何 CHANGE REPLICATION SOURCE TO 前,务必先运行:
STOP REPLICA;
否则 MySQL 可能因状态竞争拒绝写入新通道。配置完成后,再为每个通道单独启动:
START REPLICA FOR CHANNEL 'chan_orders';START REPLICA FOR CHANNEL 'chan_logs';
通道名和 SOURCE_HOST 必须严格合规
通道名不是随意字符串——需全小写、无空格/特殊字符、长度 ≤64,且语义清晰(如 'prod_us' 而非 'm1')。SOURCE_HOST 必须能被从库 DNS 解析,填 localhost 或未绑定的内网 IP(如 Docker 默认 bridge 网络中的 172.17.0.2)会导致 IO 线程无法连接。
常见错误现象:Replica_IO_Running: No + 错误日志中出现 Can't connect to MySQL server on 'xxx'。
过滤规则必须按通道单独设置且不可跨通道生效
REPLICATE_DO_DB 这类过滤只作用于指定通道,例如:
CHANGE REPLICATION FILTER REPLICATE_DO_DB = (orders) FOR CHANNEL 'chan_orders';
这条命令不会影响 'chan_logs' 通道——它仍会同步所有库。若想限制日志库,必须再执行:
CHANGE REPLICATION FILTER REPLICATE_DO_DB = (logs) FOR CHANNEL 'chan_logs';
注意:REPLICATE_WILD_DO_TABLE 支持通配(如 'orders.%'),但 REPLICATE_DO_DB 不支持模糊匹配;若主库用了库名前缀分片(如 orders_shard_a, orders_shard_b),只能靠应用层或视图聚合,过滤规则无法自动合并。
检查状态必须带 FOR CHANNEL,否则看不到真实情况
SHOW REPLICA STATUS; 只显示空字符串通道(即默认通道),而多源复制中默认通道通常未使用。所有通道状态必须显式查询:
-
SHOW REPLICA STATUS FOR CHANNEL 'chan_orders';→ 关注Retrieved_Gtid_Set是否持续增长、Executed_Gtid_Set是否与前者一致 -
Seconds_Behind_Source为NULL通常是 SQL 线程已停止,立即查Last_SQL_Error字段,常见值如Duplicate entry '123' for key 'PRIMARY'表示表名或主键冲突
最易忽略的点:GTID 落后不等于延迟——如果 Retrieved_Gtid_Set 停滞,说明 IO 线程卡住(网络或权限问题);如果 Executed_Gtid_Set 落后但 Retrieved_Gtid_Set 正常增长,才是 SQL 层积压。











