MySQL 8.4 中 expire_logs_days 已完全移除,必须配置 binlog_expire_logs_seconds(如604800)和 binlog_expire_logs_auto_purge = ON 才生效;需用 SELECT VERSION() 确认版本,SHOW GLOBAL VARIABLES 验证参数值,并执行 FLUSH LOGS 触发清理。

MySQL 8.4 中 expire_logs_days 已完全弃用,必须使用 binlog_expire_logs_seconds 配合 binlog_expire_logs_auto_purge 控制 binlog 保留策略;否则配置不生效,磁盘仍会持续膨胀。
确认当前版本与参数状态
先验证是否为 MySQL 8.4(或 ≥8.0.23),再检查实际生效的过期参数:
- 执行
SELECT VERSION();确认版本号 - 运行
SHOW GLOBAL VARIABLES LIKE 'binlog_expire_logs%';—— 关注binlog_expire_logs_seconds和binlog_expire_logs_auto_purge的值 - 若
binlog_expire_logs_auto_purge为OFF,即使设置了binlog_expire_logs_seconds,也不会自动删除任何 binlog -
expire_logs_days可能仍存在(兼容保留),但它的值会被忽略,且设为非零时会触发警告
设置 7 天保留期(推荐动态+持久化方式)
避免重启依赖,推荐用 SET PERSIST 持久化 + SET GLOBAL 立即生效:
- 先清空旧参数冲突:
SET PERSIST expire_logs_days = 0; - 设置秒级过期时间:
SET PERSIST binlog_expire_logs_seconds = 604800;(7×24×3600) - 确保自动清理开启:
SET PERSIST binlog_expire_logs_auto_purge = ON; - 立即应用(无需重启):
SET GLOBAL binlog_expire_logs_seconds = 604800;和SET GLOBAL binlog_expire_logs_auto_purge = ON;
注意:SET PERSIST 会写入 mysqld-auto.cnf,下次启动自动加载;但若该文件权限异常或被覆盖,持久化可能失效。
PURGE 不触发?检查三个关键触发时机
MySQL 不是定时轮询清理,而是在特定事件发生时才检查并删除过期 binlog:
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
-
FLUSH LOGS:手动切换 binlog 文件,**最常用且可控的触发方式** - binlog 文件大小达到
max_binlog_size(如默认 1G),自动滚动时触发检查 - MySQL 启动时扫描
bin.index,按文件系统修改时间(mtime)判断过期 —— 这意味着:如果最老的 binlog 文件还没过期,哪怕中间有文件已超时,也不会删
所以,执行 FLUSH LOGS 后再查 SHOW BINARY LOGS;,通常就能看到旧文件被移除。别等“自动”,主动触发更可靠。
误删或清理后磁盘空间未释放?别直接 rm -f
binlog 文件被 PURGE 或自动清理后,磁盘空间未释放,常见于以下情况:
- 从库还在读取该 binlog(
SHOW SLAVE STATUS\G中Relay_Master_Log_File指向未过期文件)—— 删除前务必确认所有从库Seconds_Behind_Master = 0且 IO/SQL 线程正常 - 文件被其他进程(如
mysqlbinlog、备份工具、监控 agent)打开未关闭,Linux 下文件句柄仍占用空间 —— 用lsof | grep mysql-bin检查 - 直接用
rm删除 binlog 文件而非PURGE命令,导致bin.index与磁盘文件不一致,MySQL 后续拒绝写入新日志
真正安全的清理只有两种路径:配置 binlog_expire_logs_auto_purge = ON 让 MySQL 自己管,或用 PURGE BINARY LOGS BEFORE '2026-10-28 00:00:00'; 手动指定时间点 —— 其他方式都绕过了 MySQL 的元数据一致性校验。










