这篇博客主要是来解决 mysql 落盘日志占用磁盘空间过大的问题。我是用 docker 启动的 mysql,然后把 /var/lib/mysql 挂载到宿主机上。有人反馈网页点击无反应,我想的是这么简单,也没改动怎么会报错呢。上服务器,刚好无意看了下 df -h
,好家伙磁盘全满,其中挂载 msyql 的文件夹基本上全占。那只好解决了,虽然找运维扩磁盘是一个更舒服的选择,不过这个问题我碰到好几次了。之前都是删掉没用的,先能用再说,不过删到后面,实在没啥可以删的了。
接下来,来看看我的解决思路。
瞅一眼
看一下挂载目录里面是什么文件占这么大
两眼蒙圈,不知道是啥鬼,之前对 mysql 没有做过多了解。不过肉眼可见的,可以看到有 2 类文件占用了很大。
啥都不懂,就先看看文件最大的能不能删嘛。
*.log
文件和 mysql-bin.*
文件,这两类占据了很大的空间,不知道干啥的,就去找一下这两货是啥。
是啥货
详细的不在这边说,就知道这文件大概是干啥的就行
mysql-bin*
有眼不识泰山,原来是 mysql 的 binary log。
二进制日志记录了所有的 DDL(数据定义语言)语句和 DML(数据操作语言)语句,但是不记录包括数据查询的语句。
不知道能不能删,等下找找,大概率不能乱删。
*.log
原来是 general log,难怪这么大。
general_log,会将所有到达Mysql Server的SQL语句记录。
这个肯定能删,而且现在 sql 语句都应该可以到日志聚合系统查看,可以不用在这上面看。
盘他
binary log
网上都有,按照此步骤即可删除。前面已经看到,有很多 mysql-bin 文件,所以直接找到现在 mysql 在用的,也就是我不能删的文件是哪个。
如果看不到挂载目录,只能指令查看,或者数据库IDE的,可以用 show binary logs 来查看总的 mysql-bin 文件
-
查看正在使用的日志文件
show master status
-
删除可删除的 mysql-bin 文件
purge binary logs to ‘mysql-bin.000029’
在到目录看一下,就没了,无需重启
general log
这个网上,比较少,不过也就是清空文件而已。
cat /dev/null > 7b130360affe.log
其中 log 是那个最大的文件,切记不要直接 rm -rf log,这大概率删不掉。
没有下一次
上面删除的方法都是暂时的,就是过一段大概率还会出现磁盘剩余空间不足的问题,所以还得预防一下。
binary log
可以设置自动清理的天数
修改 my.cnf
里面的 expire_logs_days
为 3 或者一个你觉得几天需要自动清理一次日志的天数。
修改完后,需要重启不然不生效
不想要重启的可以在 mysql 里面执行 set global expire_logs_days = 3
这样子也行,不过重启之后就会恢复。
general log
默认 general log 开起来,不过可以关掉,没啥必要
修改 my.cnf
里面的 general_log
为 0
修改完后,需要重启不然不生效
不想要重启的可以在 mysql 里面执行 set global general_log = 'OFF'
这样子也行,不过重启之后就会恢复。
总结
- 有针对性地去解决问题,msyql 挂载目录生成的文件很多,我第一次看也头大,所以选择逃避。不过针对刺头查一下文章,还是可以解决的。
- 平时可能没有太在意这些个配置,可以为之后借鉴一下。
- 还有很多调优的方式,生产需要注意的地方,有大佬知道的可以相互交流下~