MySQL多源复制是指一个从库同时接收多个主库的数据变更,并将这些变更应用到自身,从而实现多个主库数据向单一从库的合并。该功能从MySQL 5.7版本开始原生支持,通过通道(channel)机制隔离不同主库的复制链路。

多源复制基本原理
在传统主从复制中,一个从库只能对接一个主库。多源复制在此基础上引入了channel概念,每个channel对应一个主库连接,拥有独立的复制位点(file和position)。从库的relay log按channel分开存储,SQL线程或worker线程按channel并行回放,互不干扰。
环境准备
- 三个MySQL实例:master1(端口3307)、master2(端口3308)、slave(端口3309)
- 所有实例开启log_bin和server_id,且server_id互不相同
- slave实例需设置master_info_repository=TABLE和relay_log_info_repository=TABLE
配置步骤
1. 主库创建复制账号
在master1和master2分别执行:
-- 在master1执行 CREATE USER 'repl'@'192.168.0.1' IDENTIFIED BY 'ReplPass123'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.0.1'; FLUSH PRIVILEGES; SHOW MASTER STATUS; -- 在master2执行类似语句,注意使用不同或相同账号均可 CREATE USER 'repl'@'192.168.0.1' IDENTIFIED BY 'ReplPass123'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.0.1'; FLUSH PRIVILEGES; SHOW MASTER STATUS;
2. 从库配置多源通道
在slave上针对两个主库分别配置channel:
-- 配置master1通道 CHANGE MASTER TO MASTER_HOST='192.168.0.1', MASTER_PORT=3307, MASTER_USER='repl', MASTER_PASSWORD='ReplPass123', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154 FOR CHANNEL 'master1'; -- 配置master2通道 CHANGE MASTER TO MASTER_HOST='192.168.0.1', MASTER_PORT=3308, MASTER_USER='repl', MASTER_PASSWORD='ReplPass123', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154 FOR CHANNEL 'master2';
3. 启动并查看复制状态
-- 启动所有通道 START SLAVE; -- 查看指定通道状态 SHOW SLAVE STATUS FOR CHANNEL 'master1'G SHOW SLAVE STATUS FOR CHANNEL 'master2'G
数据合并注意事项
当多个主库存在同名库表时,从库合并会产生数据覆盖或冲突。推荐做法是为每个主库设置不同的库名前缀,或在主库使用REPLICATE_REWRITE_DB规则进行映射。例如将master1的orders库重写为m1_orders:
CHANGE REPLICATION FILTER REPLICATE_REWRITE_DB=('orders' -> 'm1_orders') FOR CHANNEL 'master1';
监控与排错
| 问题现象 | 可能原因 | 处理方式 |
|---|---|---|
| Slave_IO_Running为No | 网络不通或账号权限不足 | 检查防火墙及复制账号host限制 |
| Slave_SQL_Running为No | 表结构冲突或主键重复 | 使用pt-table-checksum排查并跳过错误事务 |
| 通道无数据写入 | 位点配置错误 | 重新执行CHANGE MASTER指定正确pos |
小结
通过多源复制,DBA可以用一条从库链路统一汇总多个主库的数据,大幅简化报表和离线分析架构。实际部署中应注意库表命名规划与复制过滤规则,避免数据冲突导致同步中断。