转载 - 删除/清理 MySQL 的 binlog
删除/清理 MySQL 的 binlog
问题
还处在数据清理和处理的流程中,突然发现程序脚本异常退出了。
通过排查发现,1TB的磁盘,居然满了,定位到 /var/lib/mysql
路径下,发现了大量的 binlog.xxxxxxx
文件,通过 ncdu
分析出它们占据了大几百GB的磁盘空间。
(当时处理问题之前没有截图,所以只能截几张写本文时的图了,而写本文时,合作已经处于最后的输出流程了,所以数据库 写操作
只与 记录输出时间
相关,数据量小了很多)


原因
binlog
是记录所有数据库表结构变更(例如CREATE、ALTER TABLE…)以及表数据修改(INSERT、UPDATE、DELETE…)的二进制日志。
binlog
不会记录SELECT和SHOW这类操作,因为这类操作对数据本身并没有修改,但你可以通过查询通用日志来查看MySQL执行过的所有语句。
二进制日志包括两类文件:二进制日志索引文件(文件名后缀为 .index
)用于记录所有的二进制文件,二进制日志文件(文件名后缀为 .00000*
)记录数据库所有的DDL和DML(除了数据查询语句)语句事件。
所以简单点描述,数据库 写操作
越多越频繁,binlog
记录的越多,甚至出现笔者遇到的 爆炸增长
。
解决
既然 binlog
是日志,只要确保(或者“假装确保”)过去的操作都正确,咱也没有 从 binlog 恢复数据
的需求,那就删了呗。
手动删除
直接在 /var/lib/mysql
路径下,将 binlog.0*
删除掉(注意不要删除 binlog.index
)
该方法不推荐,因为手动删除并不会更新 binlog.index
,而 binlog.index
的作用是加快查找 binlog
文件的速度。
删除指定编号之前的 binlog
mysql> PURGE MASTER LOGS TO 'binlog.000860';
Query OK, 0 rows affected (0.01 sec)

删除指定日期之前的 binlog
mysql> PURGE MASTER LOGS BEFORE '2020-11-11 11:11:11';
Query OK, 0 rows affected (0.19 sec)

清空所有 binlog
mysql> RESET MASTER;
Query OK, 0 rows affected (0.09 sec)

配置自动清理
mysql> set global expire_logs_days=7;
则只保留7天内的 binlog
文件。
或者修改 MySQL
配置文件,设置 expire_logs_days=7
然后重启服务,即可永久生效。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2017-03-02 由 MySQL server 和 mysql-connector 版本的不匹配引发的一场惊魂
2017-03-02 在Eclipse中使用Maven部署项目的Tomcat