mysql 8.0+ binlog默认永不清除,必须同时启用binlog_expire_logs_auto_purge=on并设置binlog_expire_logs_seconds(如604800秒),expire_logs_days已废弃,设则可能报错3683;清理前须核对从库relay_master_log_file安全下限,再执行purge binary logs to。

MySQL 8.0+ 的 binlog 不会自动清理,除非你显式启用 binlog_expire_logs_auto_purge 并设好 binlog_expire_logs_seconds;设了 expire_logs_days 反而可能让清理失效甚至导致启动失败。
检查当前 binlog 清理是否真正启用
很多人以为“配置了就生效”,结果磁盘悄悄爆满。必须连上 MySQL 执行三组命令逐项确认:
-
SHOW VARIABLES LIKE 'log_bin';—— 必须返回ON,否则根本没开 binlog,谈不上清理 -
SHOW VARIABLES LIKE 'binlog_expire_logs_seconds';—— 若值为0或空,表示过期时间未设置或被禁用 -
SHOW VARIABLES LIKE 'binlog_expire_logs_auto_purge';—— 必须是ON,这是总开关;设成OFF时,哪怕binlog_expire_logs_seconds是 604800 也完全不触发删除
注意:expire_logs_days 在 8.0.23+ 已弃用,若它和 binlog_expire_logs_seconds 同时非零,MySQL 启动时会报错 ERROR 3683 (HY000),直接拒绝加载配置。
设置 binlog_expire_logs_seconds(唯一推荐方式)
单位是秒,不是天,不能靠 expire_logs_days = 7 蒙混过关。7 天 = 604800 秒,30 天 = 2592000 秒:
- 动态设置(立即生效,但重启丢失):
SET GLOBAL binlog_expire_logs_seconds = 604800; - 持久化设置(推荐):编辑
/etc/my.cnf的[mysqld]段,添加一行:binlog_expire_logs_seconds = 604800,然后重启,或执行SET PERSIST binlog_expire_logs_seconds = 604800;(需有PERSIST权限) - 如果之前设过
expire_logs_days,务必先清掉:SET GLOBAL expire_logs_days = 0;,否则可能冲突
该参数只定义“过期时间”,不控制清理时机——MySQL 后台线程默认每天凌晨检查一次,或在 FLUSH LOGS、max_binlog_size 触发切换时顺带清理。
PURGE 命令的语义差异与误删风险
PURGE BINARY LOGS TO 和 PURGE BINARY LOGS BEFORE 看似相似,但逻辑完全不同,极易误删正在被从库读取的日志:
-
PURGE BINARY LOGS TO 'mysql-bin.000123';—— 删除所有序号 小于000123的文件(即000122及更早),000123本身保留 -
PURGE BINARY LOGS BEFORE '2026-09-25 00:00:00';—— 删除所有“已关闭”且最后修改时间早于该时刻的 binlog 文件;注意:这个时间戳是文件关闭时写入的,不是创建时间,也不是当前时间 - 执行前必须确认从库已追平:
SHOW SLAVE STATUS\G中Seconds_Behind_Master接近 0,且Read_Master_Log_File≤ 主库SHOW MASTER STATUS中的File
切勿在生产主库上执行 RESET MASTER:它会无条件删光所有 binlog,从库立刻报错 Could not find first log file name in binary log index file,复制链路不可逆中断。
验证清理是否真起作用
配置完别等“自然触发”,主动验证:
- 手动触发一次清理逻辑:
FLUSH LOGS;—— 这会生成新 binlog,并促使 MySQL 检查并清理过期文件 - 查看剩余 binlog 列表:
SHOW BINARY LOGS;,确认旧文件是否减少 - 检查磁盘空间变化:
du -sh /var/lib/mysql/mysql-bin.*(路径以你的datadir和log_bin_basename为准) - 特别注意:即使配置正确,正在被从库读取、或被备份工具(如
mydumper)隐式持有的 binlog 也不会被删——SHOW MASTER LOGS中File_size非零 ≠ 可删
最常被忽略的一点:binlog_expire_logs_auto_purge = ON 是前提,没有它,其他所有设置都是摆设;而它的优先级高于 binlog_expire_logs_seconds,关了就全废。











