首页/数据/数据库速查/binlog 清理与过期策略
备份与恢复56 条

binlog 清理与过期策略

binlog 不能无限堆积:设置过期时间自动清理(binlog_expire_logs_seconds,8.0 默认 2592000 秒=30 天),或按文件手工 PURGE;主从环境必须保留足够窗口。

数据库速查数据更新于 2026-10-13

binlog 清理与过期

binlog 记录所有数据变更,是 PITR 与主从复制的原料,但不能无限堆积,写满磁盘会直接把实例拖到只读甚至崩溃。MySQL 8.0 用 binlog_expire_logs_seconds 控制自动过期(默认 2592000 秒即 30 天),5.7 用 expire_logs_days,也可以手工 PURGE BINARY LOGS。保留窗口的底线是覆盖从库最大延迟加一次全备间隔。

基本信息

适用MySQL 5.7 / 8.0,需 log_bin=ON
自动过期8.0 binlog_expire_logs_seconds,5.7 expire_logs_days
手工清理PURGE BINARY LOGS TO / BEFORE,不可逆
保留底线≥ 从库最大延迟 + 全备间隔

查看与清理

查看与清理
SHOW VARIABLES LIKE 'binlog_expire_logs_seconds';   # 8.0 自动过期秒数
SHOW BINARY LOGS;                                   # 文件列表与大小,判断堆积
SHOW REPLICA STATUS\G                               # 执行清理前先确认从库已读位点
PURGE BINARY LOGS TO 'mysql-bin.000042';            # 删除该文件之前的所有 binlog
PURGE BINARY LOGS BEFORE '2026-10-01 00:00:00';      # 按时点删除,立刻释放空间
PURGE BINARY LOGS BEFORE NOW() - INTERVAL 7 DAY;     # 保留 7 天,表达式写法更直观

参数与操作读法

项目含义风险点
binlog_expire_logs_seconds自动过期秒数,8.0 默认 30 天设为 0 表示永不过期,长期运行必然写满磁盘
expire_logs_days5.7 的过期天数在 8.0 上已废弃,配了也不生效
max_binlog_size单个 binlog 文件上限影响文件粒度与清理、归档节奏
PURGE TO / BEFORE手工删除指定范围不可逆,可能让从库报 1236 断链
SHOW BINARY LOGS文件清单与大小只反映主库,不代表从库已消费到哪

典型使用场景

  • 磁盘水位告警时按保留窗口清理历史 binlog,恢复写入空间
  • 新增从库前后核对保留窗口,避免位点被清理导致重建
  • 为 PITR 预留窗口:过期天数要大于备份周期与最长恢复时长
  • 审计合规要求至少保留 N 天,用参数固化并纳入配置基线检查
  • 迁移或下线旧从库后回收空间,同时确认没有别的消费者依赖更早位点
主库执行 PURGE 前必须确认所有从库读过的位点都已越过目标文件,否则从库直接断链报 1236,只能重新拉全量或从备份重建。
binlog 同时被 PITR 与审计依赖:清理前确认备份系统已把它归档到独立存储,再决定过期天数,别让过期参数成为唯一的安全网。

易错点

  • PURGE 是不可逆操作:手工清理前先确认所有从库 IO 位点已越过目标文件,事后无法找回
  • 调小过期参数想省空间,结果把从库需要的 binlog 清掉:属典型生产事故,改动前先算保留窗口
  • 在 8.0 上继续配 expire_logs_days:参数已废弃不生效,binlog 继续堆积到磁盘满
  • 只盯主库文件列表就判断安全:从库实际消费位点要看 SHOW REPLICA STATUS,两者不是一回事

数据来源与参考

  • MySQL 8.0 Reference Manual: PURGE BINARY LOGS

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌