贝利信息

mysql主从复制中的failover与手动切换方案

日期:2026-01-25 00:00 / 作者:P粉602998670
MySQL主从切换时必须重设MASTER_LOG_FILE和MASTER_LOG_POS,仅改MASTER_HOST会导致复制错误;需停写、确认追平、重置auto_increment、清理relay log并避免误判Seconds_Behind_Master为NULL。

MySQL 主从切换时 CHANGE MASTER TO 的关键参数必须重设

主库宕机后,若要将原从库提升为主库并让其他从库指向它,CHANGE MASTER TO 不只是改 MASTER_HOST 就行。漏掉 MASTER_LOG_FILEMASTER_LOG_POS 会导致从库拉取错误位置的 binlog,轻则数据跳变,重则复制中断报错 Could not find first log file name in binary log index file

实操建议:

手动切换前必须停写并确认从库已追平

很多故障源于“以为追平了”,实际 Seconds_Behind_Master 显示为 0 但 IO 线程仍在缓存 relay log,SQL 线程尚未执行完。直接切会导致新主库缺失最后一批事务。

验证方法:

failover 脚本里漏判 Seconds_Behind_Master = NULL 是高频坑

当从库 IO 线程异常断开(如网络闪断、主库关闭),Seconds_Behind_Master 会变成 NULL 而非数字。用 if [ $delay -eq 0 ] 类脚本判断是否可切,会直接报错退出或误判为延迟 0 秒。

正确做法:

切换后务必重置 auto_increment 偏移以防写冲突

原主库恢复后若作为从库重新接入,若未调整 auto_increment_offsetauto_increment_increment,多主写入时极易出现主键冲突。即使当前是单主架构,也要为后续扩容留余地。

操作建议:

实际中最容易被忽略的是:切换后没清空旧主库的 relay-log 文件,导致它重连时尝试重放早已失效的 relay 日志,报错 Could not parse relay log event entry。每次 promote 后,新主库应运行 RESET SLAVE ALL; 彻底清理复制元数据。