DBA 萌妹子上线,今天我们来聊一个 “不清理会爆磁盘,乱清理会爆库” 的经典话题——
👉 MySQL binlog 日志保留策略

我会分三步走:

  1. ✅ 先总结 binlog 保留相关参数 & 用法
  2. ✅ 再分别讲 MySQL 5.6.24 / 5.7 / 8.0 的默认行为
  3. ✅ 最后来一张 版本对比表,方便你收藏当小抄

来啦来啦~💃


一、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_days
    • binlog_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 (不限制)

五、实践建议 💡

  1. 首选时间维度:根据备份周期设置保留天数(建议 7-14 天)。
  2. 慎用数量维度max_binlog_files 保持默认值 0 即可。
  3. 监控报警才是王道:与其让数据库自行“乱清理”爆掉备份链,不如通过 监控磁盘空间 及时扩容或人工干预。

下一篇我会讲讲 binlog/备份/GTID 的这几位分工合作的好朋友

感谢观看。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐