必须同时设置binlog_expire_logs_seconds和binlog_expire_logs_auto_purge=ON才能自动删除日志;MySQL 8.0.11+才支持前者,旧版仅认expire_logs_days;需查SHOW VARIABLES确认两者值非默认且auto_purge为ON,配置须写入[mysqld]段并执行FLUSH BINARY LOGS触发清理。

必须同时设置 binlog_expire_logs_seconds 和 binlog_expire_logs_auto_purge = ON,否则日志不会自动删除。
确认 MySQL 版本和当前生效参数
MySQL 8.0.11+ 才真正支持 binlog_expire_logs_seconds,旧版(如 5.7)只认 expire_logs_days。别猜,直接查:
SHOW VARIABLES LIKE 'binlog_expire_logs_seconds';
如果返回 Value 是 NULL 或 0,说明没生效;如果是 604800(即 7 天),再看:
SHOW VARIABLES LIKE 'binlog_expire_logs_auto_purge';
如果值是 OFF,哪怕秒数设对了,也**完全不删日志**。
-
expire_logs_days在 8.0.23+ 默认为0,且已废弃——它显示非零值可能是配置残留,不代表在管事 - 两个参数都非零时,
binlog_expire_logs_seconds生效,但前提是binlog_expire_logs_auto_purge是ON
写入配置文件(最可靠方式)
编辑你的 MySQL 配置文件(如 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf),确保在 [mysqld] 段内添加这两行:
[mysqld] binlog_expire_logs_seconds = 604800 binlog_expire_logs_auto_purge = ON
注意:
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 漏掉
[mysqld]段,或拼错参数名(比如binlog_expire_log_seconds少个s),MySQL 会静默忽略,SHOW VARIABLES仍显示默认值 - 改完不用重启 MySQL,但必须执行
FLUSH BINARY LOGS才能立刻触发一次过期扫描 - 某些 Docker 镜像或云数据库托管服务(如阿里云 RDS、腾讯云 CDB)默认把
binlog_expire_logs_auto_purge设为OFF,光配秒数没用
PURGE 命令为什么没反应?
设完参数后发现磁盘上 binlog 还在涨,不是配置失败,而是清理时机未到。MySQL 不靠后台定时任务轮询,而是在以下场景顺带检查并删除:
- 执行
FLUSH BINARY LOGS(手动触发轮转) - 启动 MySQL 服务时
- 当前 binlog 文件大小达到
max_binlog_size触发轮转时
所以配完不 FLUSH,可能等一小时甚至更久才看到效果。磁盘告急时别等自动,直接手动清理:
PURGE BINARY LOGS BEFORE '2026-09-25 00:00:00';
但务必先确认从库没卡住:
SHOW SLAVE STATUS\G
检查 Relay_Master_Log_File 是否小于你要删的最老文件名,否则 I/O 线程会报 Could not find first log file name in binary log index file。
容易被忽略的关键点
很多人设了 604800 就以为万事大吉,实际最容易翻车的是:binlog_expire_logs_auto_purge 这个开关在部分环境默认是 OFF,且没有任何提示。它优先级最高,关了就等于整个自动清理系统断电。另外,PURGE 命令里的 BEFORE 是按 binlog 文件“关闭时间”判断,不是创建时间或当前时间——正在写的文件哪怕生成于三天前,只要没关闭,就不会被删。










