在生产环境中,MySQL binlog(Binary Log) 经常会无限增长,最终导致磁盘爆满。
本文结合实战经验,讲清楚:
如何立即清理 binlog
如何设置自动过期
只保留最近 1 天的正确做法
生产环境的安全注意事项
一、什么是 Binlog?
Binlog 是 MySQL 的二进制日志,用于:
主从复制
数据恢复(Point In Time Recovery)
数据审计
只要开启:
log-bin=mysql-binMySQL 就会持续写入 binlog 文件。
二、查看当前 Binlog 情况
在清理前,建议先查看现状:
SHOW BINARY LOGS;查看当前使用中的日志:
SHOW MASTER STATUS;如果是主从架构,一定要检查:
SHOW SLAVE STATUS\G确认从库已经同步完成。
三、立即清理 1 天以前的 Binlog
如果你现在磁盘已经告警,可以执行:
PURGE BINARY LOGS BEFORE NOW() - INTERVAL 1 DAY;作用:
删除 1 天以前的 binlog
不会删除当前正在使用的文件
如果从库未同步,会报错并阻止删除
适合:
紧急释放磁盘空间
单机环境
四、设置自动只保留 1 天
MySQL 8 推荐使用:
SET GLOBAL binlog_expire_logs_seconds = 86400;86400 秒 = 1 天
永久生效需写入配置文件:
[mysqld]
binlog_expire_logs_seconds=86400重启 MySQL 后生效。
五、最佳实践:立即清理 + 自动过期
如果目标是:
现在开始只保留 1 天
建议按以下步骤操作:
第一步:立即清理
PURGE BINARY LOGS BEFORE NOW() - INTERVAL 1 DAY;第二步:设置自动过期
SET GLOBAL binlog_expire_logs_seconds = 86400;这样:
历史日志立即清除
未来自动控制在 1 天以内
六、生产环境风险提醒(非常重要)
⚠ 如果你有主从复制:
从库延迟超过 1 天
将直接导致复制失败
⚠ 如果你做增量备份:
只能恢复 1 天以内的数据
超过 1 天无法做时间点恢复
七、常见错误做法
很多人直接:
rm mysql-bin.*这是错误的。
原因:
MySQL 有 binlog 索引文件
会导致 MySQL 启动异常
主从复制直接崩溃
正确方式永远是使用 SQL 命令删除。
评论区