主库binlog物理缺失时必须重建从库:先通过show slave status确认io线程停止、seconds_behind_master为null及last_io_error报错,再比对主从binlog文件名与位置,若从库请求的文件在主库show master logs中不存在,则确属断档;gtid模式下需校验gtid_purged是否已覆盖缺失事务,若已purge则同样须重建。

无法跳过或重设 position 续上——主库 Binlog 物理缺失,MySQL 不允许伪造起点。唯一可行路径是重建从库。
怎么确认真是 Binlog 断档,不是网络或权限问题
先看 SHOW SLAVE STATUS\G 里最关键的三行:
-
Slave_IO_Running: No(IO 线程已停) -
Seconds_Behind_Master: NULL(不是延迟,是彻底断连) -
Last_IO_Error显示类似Could not find first log file name in binary log index file或Client requested master to start replication from position > file size
再对比主从位置:
- 主库执行
SHOW MASTER STATUS,看当前最老的File是mysql-bin.000012,Position是123456 - 从库看
Relay_Master_Log_File是mysql-bin.000013,说明它要读的文件在主库上根本不存在了
为什么调大 expire_logs_days 不管用
这个参数只控制“自动清理”,不保证“从库已消费”。常见误区:
- MySQL 5.7+ 默认
expire_logs_days = 0(不自动删),但很多云厂商或运维脚本会强制设为1–7 - 它每天凌晨触发一次清理,实际保留时长受
sync_binlog、磁盘空间不足、手动PURGE影响,可能远短于设定值 - 真正该用的是
binlog_expire_logs_seconds(MySQL 8.0+),秒级精度更可控,比如设为604800(7 天)
云数据库(如阿里云 RDS)通常禁用该变量,必须在控制台调“Binlog 保留天数”,且修改后需重启复制链路才生效。
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
已经断了,没备份,怎么最小化数据丢失重建
目标是快、准、少丢数据:
- 中小库(mysqldump --single-transaction --master-data=2 导出主库当前一致快照;导出时会自动记录
CHANGE MASTER TO所需的File和Position - 大库(>50 GB):必须用
Percona XtraBackup,否则锁表时间太长;备份时加--slave-info参数,自动生成主库位点信息 - 恢复到从库后,别直接
START SLAVE;先RESET SLAVE清掉旧 relay log,再用 dump 或 backup 里带的位点执行CHANGE MASTER TO
注意:RESET SLAVE 会清空 master.info 和 relay-log.info,所有连接参数(MASTER_HOST、MASTER_USER 等)必须重填。
GTID 模式下也救不回来吗
不能。GTID 只解决“定位事务”的问题,不解决“日志不存在”的问题。如果主库 gtid_purged 已包含从库缺失的 GTID 范围,就说明对应 binlog 已被 purge,照样无法追平。
检查方式:SELECT @@global.gtid_purged; 对比从库 Retrieved_Gtid_Set 和 Executed_Gtid_Set —— 若缺失部分已被 purge,就必须重建。
真正容易被忽略的点:重建后,gtid_executed 会重置,必须确保新从库的 gtid_purged 与主库完全一致,否则后续同步仍会失败。










