MySQL binlog 日志保留策略
·
文章目录
DBA 萌妹子上线,今天我们来聊一个 “不清理会爆磁盘,乱清理会爆库” 的经典话题——
👉 MySQL binlog 日志保留策略。
我会分三步走:
- ✅ 先总结 binlog 保留相关参数 & 用法
- ✅ 再分别讲 MySQL 5.6.24 / 5.7 / 8.0 的默认行为
- ✅ 最后来一张 版本对比表,方便你收藏当小抄
来啦来啦~💃
一、binlog 日志是啥?为啥要管它?
一句话版本:
binlog = MySQL 的“时光机 + 黑匣子”
主要用途:
- ✅ 主从复制(从库靠它活着)
- ✅ 点时间恢复(误删数据的后悔药)
- ✅ 审计 & 数据变更追踪
问题是:
- 不清理 → 磁盘爆炸 💣
- 清早了 → 主从断裂 / 无法恢复 😱
所以,保留策略非常重要!
二、binlog 保留相关参数 & 使用方法
1️⃣ expire_logs_days(老前辈参数)
📌 适用版本:MySQL 5.6 / 5.7(8.0 已逐渐被替代)
作用:
自动删除 N 天前 的 binlog
expire_logs_days = 7
表示:
binlog 超过 7 天 → MySQL 在合适的时机自动清理
✅ 特点:
- 单位:天
- 删除发生在:
- MySQL 启动
- binlog 切换
- 执行
FLUSH LOGS
⚠️ 缺点:
- 精度低(只能按天)
- 无法精确控制磁盘占用
- 在 8.0 中已不推荐
2️⃣ binlog_expire_logs_seconds(新晋小鲜肉✨)
📌 适用版本:MySQL 8.0+
binlog_expire_logs_seconds = 604800
表示:
binlog 保留 604800 秒(7 天)
✅ 优点:
- 秒级精度(强迫症福音)
- 逻辑更清晰
- 未来官方主推
📌 注意:
- 如果 同时设置
expire_logs_daysbinlog_expire_logs_seconds
- 👉 以 seconds 为准
3️⃣ max_binlog_files(数量限制器 🛡️)
📌 适用版本:MySQL 5.6 / 5.7 / 8.0(默认值均为 0,即不限制)
除了按“时间”清理,MySQL 还可以按“个数”控制总量。
max_binlog_files = 100
✅ 核心逻辑:
- 当 binlog 文件总数超过这个值,MySQL 会自动清理最老的文件。
- 优先级:它与时间参数共同作用,谁先达到阈值就按谁的来。
⚠️ DBA 避坑指南:
- 默认不建议开启:除非磁盘空间极度紧张。
- 风险:强制限制数量可能导致 binlog 在被备份之前就被删除,导致无法恢复数据。
4️⃣ 手动清理(危险但灵活 😈)
✅ 推荐方式(安全):
PURGE BINARY LOGS TO 'mysql-bin.000123';
或:
PURGE BINARY LOGS BEFORE '2026-03-01 00:00:00';
🚨 不要做的事:
rm -f mysql-bin.*
(这样干的 DBA,主从复制会当场去世)
三、三大版本 binlog 默认保留策略对比
接下来是重头戏啦~🎉
我们从 默认行为 & 改进点 来看。
🌱 MySQL 5.6.24
📌 默认情况:
expire_logs_days = 0- ❗ binlog 永不自动删除
也就是说:
binlog:
“只进不出,磁盘扛得住算我输”
✅ 特点总结:
- 自动清理 = ❌
- 全靠 DBA 手动配置
- 非常容易把磁盘写爆
👉 典型事故版本(新手 DBA 的第一课)
🌿 MySQL 5.7
📌 默认情况:
expire_logs_days = 0- 行为 与 5.6 基本一致
✅ 改进点:
- binlog & 复制稳定性更好
- GTID 更成熟(但跟保留策略关系不大)
❌ 仍然存在的问题:
- 默认不清理
- 还是需要 DBA 显式设置
👉 总结一句话:
“我比 5.6 强,但 binlog 这事我还是不管。”
🌳 MySQL 8.0(终于像个成年人了)
📌 默认情况(重要!)
- 引入:
binlog_expire_logs_seconds - 默认值:2592000 秒(30 天) ✅
也就是说:
MySQL 8.0 开箱即送:
binlog 自动保留 30 天
🎉 改进点:
- ✅ 有默认清理策略
- ✅ 秒级精度
- ✅ 更不容易磁盘爆炸
- ✅ 更适合云环境 / 自动化运维
📌 官方态度:
expire_logs_days→ 逐步淘汰- 推荐使用
binlog_expire_logs_seconds
四、三大版本 binlog 保留策略对比表(精华版✨)
| 特性 / 版本 | MySQL 5.6.24 | MySQL 5.7 | MySQL 8.0 |
|---|---|---|---|
| 默认自动清理 | ❌ 无 | ❌ 无 | ✅ 有 |
| 默认保留时长 | 永久 | 永久 | 30 天 |
| 时间控制参数 | expire_logs_days |
expire_logs_days |
binlog_expire_logs_seconds |
| 数量控制参数 | max_binlog_files |
max_binlog_files |
max_binlog_files |
| 默认限制数量 | 0 (不限制) | 0 (不限制) | 0 (不限制) |
五、实践建议 💡
- 首选时间维度:根据备份周期设置保留天数(建议 7-14 天)。
- 慎用数量维度:
max_binlog_files保持默认值 0 即可。 - 监控报警才是王道:与其让数据库自行“乱清理”爆掉备份链,不如通过 监控磁盘空间 及时扩容或人工干预。
下一篇我会讲讲 binlog/备份/GTID 的这几位分工合作的好朋友。
感谢观看。
更多推荐




所有评论(0)