跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

SQL binlog_expire_logs_seconds 的 binlog 保留周期设置规范

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

相关文章