级联复制必须开启log_slave_updates并确保server_id全局唯一,change master to需基于mysqlb的show master status配置,且建议不超过两级以降低延迟与故障风险。

log_slave_updates 必须开启,否则级联复制必然失败
级联复制不是默认启用的功能。MySQL 从库默认不记录自己收到的 relay log 事件到本地 binlog,所以即使 mysqlB 是 mysqlA 的从库,若未显式开启 log_slave_updates,它就无法把变更“转发”给 mysqlC。
常见错误现象:SHOW SLAVE STATUS\G 在 mysqlC 上显示 Slave_IO_Running: Yes,但 Slave_SQL_Running: No,且 Last_IO_Error 为空、Last_SQL_Error 提示 “Could not find first log file name in binary log index file” 或直接卡在初始化阶段——本质是 mysqlB 根本没生成可被 mysqlC 拉取的 binlog 文件。
- 检查方式:在 mysqlB 上执行
SHOW VARIABLES LIKE 'log_slave_updates';,结果必须为ON - 若为
OFF,需在 mysqlB 的my.cnf中 [mysqld] 段添加log_slave_updates = ON,并确保log_bin已启用(如log_bin = mysql-bin) - 修改后必须重启 mysqld,仅
SET GLOBAL不生效
server_id 必须全局唯一,且不能为 0
MySQL 复制链路靠 server_id 区分节点身份。如果 mysqlA、mysqlB、mysqlC 的 server_id 有重复,或任意一个设为 0,复制会拒绝连接或产生不可预测行为(例如 mysqlC 可能误认自己是 mysqlA 的直连从库)。
典型误配场景:运维人员只改了 mysqlC 的 server_id,却忘了 mysqlB 的配置文件里仍沿用和 mysqlA 相同的 server_id = 1;或者在测试环境随手写 server_id = 0,以为“不参与复制”,结果导致整个链路中断。
- 三节点推荐值:
server_id = 1(mysqlA)、server_id = 2(mysqlB)、server_id = 3(mysqlC) - 检查命令:
SELECT @@server_id;,必须在每个节点上单独验证 -
server_id是只读变量,只能通过配置文件修改 + 重启生效
CHANGE MASTER TO 要指向 mysqlB 的当前 binlog 位置,不是 mysqlA 的
配置 mysqlC 时,MASTER_LOG_FILE 和 MASTER_LOG_POS 必须来自 mysqlB 的 SHOW MASTER STATUS,而不是 mysqlA 的。这是级联复制最常踩的坑:照搬主库信息,导致 mysqlC 从错误起点拉日志,轻则跳过部分数据,重则因 GTID 冲突或 position 错位直接报错退出。
注意:mysqlB 的 SHOW MASTER STATUS 返回的是它**自身 binlog 的最新写入点**,这个位置由它回放 mysqlA 的变更后自动生成,与 mysqlA 的 position 无直接映射关系。
- 操作顺序必须是:先在 mysqlB 上执行
SHOW MASTER STATUS;,记下File(如mysql-bin.000005)和Position(如1234) - 再在 mysqlC 上执行:
CHANGE MASTER TO MASTER_HOST='mysqlB_ip', MASTER_USER='repl', MASTER_PASSWORD='xxx', MASTER_LOG_FILE='mysql-bin.000005', MASTER_LOG_POS=1234; - 不要用
MASTER_AUTO_POSITION=1除非全集群已统一启用 GTID 且清理过旧 binlog,否则易触发GTID_PURGED冲突
级联层级越深,延迟和故障面越大
mysqlC 的数据延迟 = mysqlB 延迟 + mysqlC 自身回放延迟。当 mysqlB 因网络抖动、磁盘 IO 瓶颈或大事务卡住时,mysqlC 会持续积压,且无法绕过 mysqlB 直连 mysqlA 恢复——它的复制源就是 mysqlB。
更隐蔽的问题是监控盲区:常规 Seconds_Behind_Master 只反映 mysqlC 相对于 mysqlB 的延迟,你根本看不到 mysqlB 相对于 mysqlA 的延迟。线上排查时容易误判“从库同步正常”,实际整条链已严重滞后。
- 务必在所有节点部署
pt-heartbeat或基于heartbeat表的跨级延迟检测 - 避免超过两级级联(即 mysqlA → mysqlB → mysqlC → mysqlD),三级以上维护成本陡增
- mysqlB 必须启用
read_only = ON(除复制用户外禁止写入),否则人为写入会破坏复制一致性,且无法被 mysqlC 感知











