MySQL 多源复制能实现「多个主库 → 单个从库」同步吗?
能,但必须明确:MySQL 原生多源复制(Multi-Source Replication)只支持「多个主库 → 单个从库」,不支持「一个主库 → 多个从库」的反向聚合,也不支持主库之间自动冲突解决。它本质是让一个从库同时拉取多个独立主库的 binlog,各自维护一套复制通道(channel),彼此隔离。
配置前必须关闭 sql_log_bin
并检查主库 binlog 格式
若在从库上执行建表、写入等操作,需临时禁用二进制日志记录,否则可能污染主库数据流;更重要的是,所有主库都必须启用
ROW格式(
binlog_format = ROW)。
STATEMENT或
MIXED在多源场景下极易因非确定性语句导致从库应用失败或数据不一致。 检查主库:
SHOW VARIABLES LIKE 'binlog_format';从库临时关闭日志:
SET SQL_LOG_BIN = 0;(仅会话级,重启后恢复) 修改主库配置后必须重启或执行
SET PERSIST binlog_format = 'ROW';(MySQL 8.0+)
CHANGE REPLICATION SOURCE TO
必须为每个主库指定唯一 channel 名
这是多源复制的核心标识。不指定
FOR CHANNEL,MySQL 默认使用空字符串 channel,后续无法添加第二条复制链路——会报错
ERROR 3079 (HY000): Multiple channels exist, please specify channel name。 连接第一个主库:
CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.1.10', SOURCE_USER='repl', SOURCE_PASSWORD='xxx', SOURCE_PORT=3306 FOR CHANNEL 'master_a';连接第二个主库:
CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.1.11', SOURCE_USER='repl', SOURCE_PASSWORD='xxx', SOURCE_PORT=3306 FOR CHANNEL 'master_b';启动时也需按 channel 启动:
START REPLICA FOR CHANNEL 'master_a'; START REPLICA FOR CHANNEL 'master_b';
表名冲突和 GTID 混用是实际落地中最常翻车的两个点
多个主库若存在同名库表(比如都叫
shop.orders),从库将无法区分数据来源,INSERT/UPDATE 会相互覆盖。GTID 更要谨慎:所有主库必须启用 GTID(
gtid_mode = ON),且不能共用同一套
server_uuid;但更关键的是,从库必须设为
enforce_gtid_consistency = ON,否则启动复制时报错
ERROR 3546 (HY000): GTID consistency cannot be enforced...。
真正难处理的是跨主库业务逻辑耦合——比如主库 A 写
user表,主库 B 写
user_profile表,但从库 JOIN 查询时发现主键不一致或时间差过大。这类问题无法靠复制机制解决,得靠应用层收敛或中间层做数据对齐。
