MySQL 8.0的binlog_expire_logs_seconds比5.7更灵活,因其支持秒级精度、事件触发式清理及显式优先级控制,替代了5.7中粗粒度的expire_logs_days,实现小时/分钟级保留策略、跨时区一致性及灰度/测试场景灵活配置。

MySQL主从复制中binlog过期时间由expire_logs_days控制
MySQL本身不直接管理“主从复制日志保留时间”这个概念——真正需要保留的是主库的二进制日志(binlog),因为从库靠它拉取并重放SQL事件。决定这些日志自动清理时间的,是主库上的系统变量expire_logs_days。
该变量单位是天,取值范围是0–9999,默认为0,表示**永不自动删除**binlog文件。一旦设为非零值(比如7),MySQL会在每天凌晨执行清理时,删掉早于当前时间N天的所有binlog(注意:不是按文件生成时间,而是按文件中最早事件的时间戳)。
-
SET GLOBAL expire_logs_days = 7;可动态生效,但重启后失效(除非写入配置文件) - 永久生效需在
my.cnf或my.ini的[mysqld]段添加:expire_logs_days = 7 - 修改后建议手动触发一次清理:
PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY); - 注意:该设置只影响
binlog,不影响从库的relay log;relay log的清理由relay_log_purge(默认ON)和relay_log_space_limit协同控制
为什么expire_logs_days设太小会导致复制中断
如果主库把某个binlog文件删了,而从库还没来得及读完(比如网络延迟、从库宕机、SQL线程卡住),那么当从库尝试去拉取下一个事件时,就会报错:Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file' 或更具体的 'The slave is connecting using CHANGE MASTER TO MASTER_LOG_FILE='<some-binlog>', MASTER_LOG_POS=<pos>', but the specified log file does not exist on the master.'</pos></some-binlog>
- 典型诱因:主库磁盘空间告警后盲目调小
expire_logs_days到1,结果从库延迟超过1天就断连 - 安全底线:保留时间应 ≥ 从库最大可能延迟时间 + 运维缓冲时间(建议至少多留2天)
- 监控关键指标:
Seconds_Behind_Master(注意它可能为0但实际有积压)、Read_Master_Log_Pos与主库当前File/Position的差值 - 紧急恢复时,不能只依赖binlog;务必确保有定期全量备份+对应位点,否则删掉的binlog无法还原
MySQL 8.0+推荐改用binlog_expire_logs_seconds
MySQL 8.0.11起引入了更精确的秒级控制变量binlog_expire_logs_seconds,优先级高于expire_logs_days。如果两者都设置,后者会被忽略。
- 例如保留3天又6小时:
SET GLOBAL binlog_expire_logs_seconds = 277200;(3×24×3600 + 6×3600) - 配置文件写法:
binlog_expire_logs_seconds = 277200 - 优势:避免“按天截断”导致的边界误差(比如某binlog里最早事件是昨天23:59,按
expire_logs_days=1可能被误删) - 兼容性注意:5.7及更早版本不识别该变量,设了会报错;升级前请确认版本
从库relay log的保留逻辑完全不同
从库自己的中继日志(relay log)不参与主库binlog生命周期管理。它的清理由两个机制负责:
- 自动清理:只要
relay_log_purge = ON(默认),SQL线程执行完一个relay log文件后,IO线程就会自动删除它 - 空间保护:若设置了
relay_log_space_limit > 0,当所有relay log总大小超限时,MySQL会强制删除最旧的文件(哪怕SQL线程还没读完),这可能导致复制失败——所以生产环境一般不设该限制,或设得非常宽松 - 手动清理风险高:
RESET SLAVE会清空relay log并重置复制位置,RESET SLAVE ALL还会删掉master.info等元数据,务必确认从库已停止且无需恢复原配置
真正容易被忽略的是:binlog保留策略必须和备份策略对齐。比如你每天做一次xtrabackup全备,但binlog只留2天,那中间1天的增量就丢了。保留窗口不是越短越好,而是要覆盖最长RPO容忍周期+备份链完整性要求。


















