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_days | 5.7 的过期天数 | 在 8.0 上已废弃,配了也不生效 |
| max_binlog_size | 单个 binlog 文件上限 | 影响文件粒度与清理、归档节奏 |
| PURGE TO / BEFORE | 手工删除指定范围 | 不可逆,可能让从库报 1236 断链 |
| SHOW BINARY LOGS | 文件清单与大小 | 只反映主库,不代表从库已消费到哪 |
典型使用场景
- 磁盘水位告警时按保留窗口清理历史 binlog,恢复写入空间
- 新增从库前后核对保留窗口,避免位点被清理导致重建
- 为 PITR 预留窗口:过期天数要大于备份周期与最长恢复时长
- 审计合规要求至少保留 N 天,用参数固化并纳入配置基线检查
- 迁移或下线旧从库后回收空间,同时确认没有别的消费者依赖更早位点
主库执行 PURGE 前必须确认所有从库读过的位点都已越过目标文件,否则从库直接断链报 1236,只能重新拉全量或从备份重建。
binlog 同时被 PITR 与审计依赖:清理前确认备份系统已把它归档到独立存储,再决定过期天数,别让过期参数成为唯一的安全网。