binlog_expire_logs_seconds未删旧日志是因为清理仅在mysqld启动、FLUSH BINARY LOGS执行或binlog写满切换时触发,非定时轮询;需确保binlog_expire_logs_auto_purge=ON且配合手动FLUSH或调整备份策略。
binlog_expire_logs_seconds 设置后为什么没删旧日志?
MySQL 8 中设了
,但过期 binlog 就是不删——这不是配置失效,而是触发条件没满足。它不会定时轮询删除,只在三个时机检查并清理:
启动时、执行
(或备份工具如
内部调用的
)、当前 binlog 文件写满
触发切换。
常见错误现象:每天用
备份,备份时加了
,导致 binlog 刷新后无法触发清理逻辑——锁会阻塞自动 purge 流程。释放锁后再手动执行一次
,就能立刻触发过期清理。
确保
(默认开启,但必须确认)
避免长期持有
;若必须用,备份完成后补一句
低频写入 + 大
场景下,可能几天都不触发切换,此时依赖定时
是最稳妥的兜底方式
该设多少秒?别直接抄 30 天
默认值
(30 天)只是通用建议,实际要按你的恢复窗口+存储成本权衡。比如主从延迟监控要求保留 72 小时 binlog,那设
(3 天)更合理;而做逻辑误删回滚的团队,可能需要保留 7 天(
)甚至更久。
注意:这个参数只影响“新生成”的 binlog 的生命周期,已存在的 binlog 不会因修改该值而提前过期——它们仍按写入时间 + 原设定倒计时。所以调小值后,旧文件还得等自然到期或手动清理。
生产环境建议先设为
(7 天),观察磁盘增长和恢复需求是否匹配
不要设为 0:表示永不过期,
等价于禁用自动清理(除非
)
别和
混用:两者冲突,MySQL 8.0+ 优先认
,同时设非零值会报警告且仅前者生效
动态改 vs 配置文件改:重启要不要管?
临时改用
立刻生效,但 MySQL 重启就丢。永久生效必须写进配置文件,且位置严格限定在
段内。
路径不统一:Ubuntu/Debian 常用
,CentOS/RHEL 多在
或
。改完必须重启服务,光 reload 不行——这个变量不支持热重载。
改前先查当前值:
配置文件里只写一行:
,别加引号、别写注释在同一行
重启后务必验证:
和
两个都得对
禁用自动清理的两种合法姿势
真要停掉自动清理(比如配合外部归档脚本),不能只设
就完事——MySQL 8.0.29+ 要求你显式关开关,否则行为不明确。
版本差异很关键:
MySQL ≥ 8.0.29:
(推荐,优先级最高)
MySQL ≤ 8.0.28:
,且确保
未被设为非零值(最好也设为 0)
无论哪个版本,配置文件中禁用都要对应写死:
或
最容易被忽略的是:一旦
,哪怕
设成 1 秒,也不会删任何文件——这个开关是硬闸,不是调节阀。
binlog_expire_logs_secondsmysqldFLUSH BINARY LOGSxtrabackupFLUSH NO_WRITE_TO_BINLOG BINARY LOGSmax_binlog_sizextrabackupLOCK INSTANCE FOR BACKUPFLUSH BINARY LOGSbinlog_expire_logs_auto_purge = ONLOCK INSTANCE FOR BACKUPFLUSH BINARY LOGSmax_binlog_sizeFLUSH2592000259200604800604800binlog_expire_logs_seconds = 0binlog_expire_logs_auto_purge = OFFexpire_logs_daysbinlog_expire_logs_secondsSET GLOBAL binlog_expire_logs_seconds = 604800[mysqld]/etc/mysql/mysql.conf.d/mysqld.cnf/etc/my.cnf/etc/my.cnf.d/mysql-server.cnfSHOW VARIABLES LIKE 'binlog_expire_logs_seconds';binlog_expire_logs_seconds = 604800SHOW VARIABLES LIKE 'binlog_expire_logs_seconds';SHOW VARIABLES LIKE 'binlog_expire_logs_auto_purge';binlog_expire_logs_seconds = 0SET GLOBAL binlog_expire_logs_auto_purge = OFFSET GLOBAL binlog_expire_logs_seconds = 0expire_logs_daysbinlog_expire_logs_auto_purge = OFFbinlog_expire_logs_seconds = 0binlog_expire_logs_auto_purge = OFFbinlog_expire_logs_seconds