这篇博客主要是来解决 mysql 落盘日志占用磁盘空间过大的问题。我是用 docker 启动的 mysql,然后把 /var/lib/mysql 挂载到宿主机上。有人反馈网页点击无反应,我想的是这么简单,也没改动怎么会报错呢。上服务器,刚好无意看了下 df -h,好家伙磁盘全满,其中挂载 msyql 的文件夹基本上全占。那只好解决了,虽然找运维扩磁盘是一个更舒服的选择,不过这个问题我碰到好几次了。之前都是删掉没用的,先能用再说,不过删到后面,实在没啥可以删的了。
接下来,来看看我的解决思路。
看一下挂载目录里面是什么文件占这么大

两眼蒙圈,不知道是啥鬼,之前对 mysql 没有做过多了解。不过肉眼可见的,可以看到有 2 类文件占用了很大。
啥都不懂,就先看看文件最大的能不能删嘛。
*.log 文件和 mysql-bin.* 文件,这两类占据了很大的空间,不知道干啥的,就去找一下这两货是啥。
详细的不在这边说,就知道这文件大概是干啥的就行
有眼不识泰山,原来是 mysql 的 binary log。
二进制日志记录了所有的 DDL(数据定义语言)语句和 DML(数据操作语言)语句,但是不记录包括数据查询的语句。
不知道能不能删,等下找找,大概率不能乱删。
原来是 general log,难怪这么大。
general_log,会将所有到达Mysql Server的SQL语句记录。
这个肯定能删,而且现在 sql 语句都应该可以到日志聚合系统查看,可以不用在这上面看。
网上都有,按照此步骤即可删除。前面已经看到,有很多 mysql-bin 文件,所以直接找到现在 mysql 在用的,也就是我不能删的文件是哪个。
如果看不到挂载目录,只能指令查看,或者数据库IDE的,可以用 show binary logs 来查看总的 mysql-bin 文件
查看正在使用的日志文件
show master status

删除可删除的 mysql-bin 文件
purge binary logs to ‘mysql-bin.000029’
在到目录看一下,就没了,无需重启
这个网上,比较少,不过也就是清空文件而已。
cat /dev/null > 7b130360affe.log
其中 log 是那个最大的文件,切记不要直接 rm -rf log,这大概率删不掉。
上面删除的方法都是暂时的,就是过一段大概率还会出现磁盘剩余空间不足的问题,所以还得预防一下。
可以设置自动清理的天数
修改 my.cnf 里面的 expire_logs_days 为 3 或者一个你觉得几天需要自动清理一次日志的天数。
修改完后,需要重启不然不生效
不想要重启的可以在 mysql 里面执行 set global expire_logs_days = 3 这样子也行,不过重启之后就会恢复。
默认 general log 开起来,不过可以关掉,没啥必要
修改 my.cnf 里面的 general_log 为 0
修改完后,需要重启不然不生效
不想要重启的可以在 mysql 里面执行 set global general_log = 'OFF' 这样子也行,不过重启之后就会恢复。