设了expire_logs_days却没删binlog,大概率是参数未生效或被覆盖;mysql仅在参数>0且重启后执行过flush logs时才自动purge。

Binlog 文件占满磁盘,expire_logs_days 不生效?
直接看结论:设了 expire_logs_days 却没删 binlog,大概率是参数没真正生效,或被其他机制覆盖。MySQL 只在满足两个条件时才自动 purge:一是该参数值 > 0,二是服务器重启后至少执行过一次 FLUSH LOGS(或自动触发的 log rotation)。常见错误是改完配置没重启 mysqld,或者用了 SET GLOBAL expire_logs_days = X 但没写入配置文件——后者在重启后就丢失。
- 检查是否真生效:
SHOW VARIABLES LIKE 'expire_logs_days';,确认返回值不是 0 - 确认 binlog 是否启用了自动清理逻辑:
SHOW BINARY LOGS;看最早日志时间是否早于NOW() - INTERVAL expire_logs_days DAY - 临时强制清理(慎用):
PURGE BINARY LOGS BEFORE '2024-05-01 00:00:00';,注意时间格式必须是 datetime 字符串,不能是函数表达式
为什么 PURGE BINARY LOGS 手动执行也报错?
典型错误是 ERROR 1377 (HY000): Cannot delete or update a parent row: a foreign key constraint fails —— 这其实是假象,真实原因是当前有活跃的复制线程(比如从库还没读完),MySQL 会阻止删除那些尚未被所有 slave IO 线程读取的 binlog。不是权限或外键问题,而是安全保护机制。
- 查复制状态:
SHOW SLAVE STATUS\G看Relay_Master_Log_File,它对应主库上正在被消费的 binlog 文件名 - 确认哪些 binlog 还不能删:
SELECT * FROM performance_schema.replication_applier_status_by_coordinator;(5.7+)或检查Seconds_Behind_Master - 如果从库已严重延迟,先别硬 purge;可临时停掉从库 IO 线程:
STOP SLAVE IO_THREAD;,再 purge,完事再START SLAVE IO_THREAD;
MySQL 5.7 和 8.0 在 binlog 清理行为上有啥关键差异?
核心区别在于:5.7 依赖 expire_logs_days + log rotation 触发清理;8.0 引入了 binlog_expire_logs_seconds(优先级更高),且 purge 动作更积极——只要 binlog 超过设定秒数、且没有活跃的复制依赖,就会在后台线程中自动清理,无需等 FLUSH LOGS。
- 8.0 推荐用
binlog_expire_logs_seconds替代expire_logs_days,比如设为259200(3 天),精度更高,也避免闰年/月末天数不一致问题 - 5.7 中若 binlog 文件名带数字序号(如
mysql-bin.000012),而你手动rm删除了某些文件,会导致SHOW BINARY LOGS报错或缺失,必须用PURGE命令操作 - 两者都要求
log_bin开启,且skip_log_bin或disable_log_bin会彻底关闭 binlog 写入,自然也不会生成待清理文件
磁盘快爆了,又不敢随便删,怎么办?
最稳妥的“断流+缩容”组合操作:先停止新 binlog 生成(不影响业务),再清理旧文件,最后恢复。这不是停库,只是让 MySQL 换一个新 binlog 文件继续写,把老的腾出来删。
- 执行
FLUSH BINARY LOGS;:立刻滚动到下一个文件,后续写入全部进新文件 - 立刻查
SHOW BINARY LOGS;,记下倒数第二个文件名(即刚被“封存”的最后一个旧文件) - 用
PURGE BINARY LOGS TO 'mysql-bin.000123';(填你记下的那个文件名),安全删掉它之前所有 binlog - 如果磁盘仍紧张,可考虑压缩归档(需外部工具):
gzip /var/lib/mysql/mysql-bin.*,但注意:压缩后的文件 MySQL 不认,也不能用于恢复或复制
真正容易被忽略的是:binlog 文件名序列不连续不代表出问题,MySQL 本身允许跳号;但如果你用脚本按数字规律 rm mysql-bin.[0-9]*,极大概率误删正在写的文件,导致主从断裂或崩溃。永远走 PURGE 接口,不碰文件系统直删。











