主从同步中断且主库binlog已丢失时,必须重建从库:先验证binlog确不可用,再停sql线程、记录gtid或位点、主库锁表获取精确位置,优先用xtrabackup物理备份恢复并提取binlog信息配置复制,逻辑备份需解析dump中change master语句或binlog定位起点,最后严格验证gtid集合一致性、数据校验和只读状态。

主从同步中断后,主库的 binlog 已被自动清理(PURGE BINARY LOGS)或误删,从库无法继续追上——此时 START SLAVE 会报错 Could not find first log file name in binary log index file 或 Relay log read failure,说明缺失日志不可逆,必须放弃原同步链路,走重建流程。
确认 binlog 确实不可用且无法补全
别急着重做,先快速验证是否真丢了:
- 在主库执行
SHOW BINARY LOGS;,看最老的Log_name是否早于从库当前Relay_Master_Log_File(查SHOW SLAVE STATUS\G中的该字段);如果已不存在,就是真丢了 - 检查
expire_logs_days或binlog_expire_logs_seconds设置,结合误删/中断时间,判断是否被自动清理 - 翻
mysqld错误日志,搜索Could not open log file或log file not found,确认不是路径配置错误或权限问题 - 若主库是多源复制或启用了 GTID,还要确认
SELECT MASTER_POS_WAIT(...)是否能返回超时,避免误判为“只是延迟”
重建主从前必须做的三件事
重建不是 dump + 导入就完事,漏掉任何一项都可能让新从库刚启动就报错:
- 停掉旧从库的 SQL 线程:
STOP SLAVE SQL_THREAD;(别停 IO 线程,防止 relay log 被意外清空) - 记录旧从库当前已执行的 GTID 集合(如果有):
SELECT @@global.gtid_executed;;若用 position 复制,记下Exec_Master_Log_Pos和Relay_Master_Log_File——虽然这次用不上,但可辅助判断数据一致性 - 在主库上执行一次
FLUSH TABLES WITH READ LOCK;并立刻SHOW MASTER STATUS;,拿到精确的File和Position;锁表时间越短越好,业务低峰期操作
用物理备份还是逻辑备份重建?
取决于数据量、RTO 要求和备份类型:
- 有
xtrabackup全量物理备份:优先选它。恢复快、不锁表、支持流式传输。还原后用xtrabackup --prepare,再从备份中提取xtrabackup_binlog_info文件里的mysql-bin.0000xx和位置,直接CHANGE MASTER TO ... MASTER_LOG_FILE='...', MASTER_LOG_POS=xxx; - 只有
mysqldump逻辑备份:导入后必须手动找起点。dump 文件里通常含CHANGE MASTER TO注释行(如-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000015', MASTER_LOG_POS=123456789;),但该位置只对“dump 时刻的主库”有效;若主库 binlog 已轮转,得用mysqlbinlog --base64-output=DECODE-ROWS -v解析 dump 后第一个 binlog 文件,找到GTID_LOG_EVENT或Previous_gtids_log_event对应的位置 - 没任何备份?只能靠业务层补偿或从其他从库拉数据——这时要评估能否接受部分数据丢失,而不是硬凑 MySQL 恢复流程
重建后最容易被忽略的验证点
很多人导完数据、配好复制、START SLAVE 看到 Seconds_Behind_Master: 0 就以为结束了,其实隐患藏在细节里:
- 检查
SHOW SLAVE STATUS\G中的Retrieved_Gtid_Set和Executed_Gtid_Set是否完全一致(GTID 模式下),不一致说明有事件被跳过或重复 - 对比主从的
SELECT COUNT(*)和校验和(如pt-table-checksum),尤其注意大表分页偏移、TEXT字段截断、字符集隐式转换导致的行内容差异 - 确认从库的
read_only=ON已生效,且应用账号没有SUPER权限——否则后续写入会污染从库状态 - 如果原从库曾开启
log_slave_updates(用于级联复制),重建后要手动补上,否则下游从库会断











