设置 MySQL binlog 保存天数,节省服务器硬盘空间

更新日期: 2025-03-01 阅读次数: 141 字数: 534 分类: MySQL

周五总是充满了意外,先是一个还没经过完全测试的大赛系统被甲方抢先上线,吓个半死; 然后发现一台服务器的上磁盘空间满了。。。😱

为了快速清理磁盘空间,顺序清理了:

  1. Nginx 日志
  2. Web 框架日志
  3. 系统日志

但是也只能勉强清理出来不到 5G。

然后 使用 ncdu 命令分析 linux 磁盘空间占用 意外的发现 MySQL 目录下的 binlog 占用了近 100G。

之前一天大概 1~2G 的日志,但是这个周飙到了每天 7~8G 。。。

紧急清理

可以通过 MySQL console 中,使用 SQL 清理某个编号之前的 binlog 日志文件:

例如,清理 100 编号前的 binlog (从 mysql 目录下的文件列表能看到都是顺序编号的)

PURGE BINARY LOGS TO 'binlog.000100';

设置自动清理策略

例如: MySQL 8.0+ 支持秒级精度(示例:设置保留 3 天)因为存储的并不是什么金融级数据,所以保存 3 天日志应该是足够的。

SET GLOBAL binlog_expire_logs_seconds = 3*24*3600;

补充:

在 MySQL 8 上测试发现,已经不能使用 expire_logs_days 了,只能使用上面的 binlog_expire_logs_seconds

SET GLOBAL expire_logs_days = 3;

MySQL 返回: 文档

#3683 - The option expire_logs_days and binlog_expire_logs_seconds cannot be used together. Please use binlog_expire_logs_seconds to set the expire time (expire_logs_days is deprecated)

确认修改完成

SHOW VARIABLES LIKE 'binlog_expire_logs_seconds';

Variable_name      Value
binlog_expire_logs_seconds      259200

永久修改

但是上面的设置,会在 MySQL 重启后失效。如果要永久保存,就需要设置 mysql 的配置文件。

而我的 MySQL 是安装在 docker 中,理论上是可以通过 docker compose 配置的环境变量来搞定,这个等找个访问量上的晚上设置一下吧。

奇妙的运维知识又增加了 😅

自动磁盘监控

最后,还是得加一下磁盘空间监控,定时发送磁盘剩余空间比较稳妥。

微信关注我哦 👍

大象工具微信公众号

我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式