环境
操作系统:centos7.6
mysql版本:8.0.17
现象
客户反馈应用系统无法访问,登录操作系统执行df -h命令查看系统硬盘空间,发现根目录空间已使用100%,操作系统重启后根目录空间自动释放,才使用20%;
排查思路
- 排查/tmp目录
根据客户反馈的现象,我们首先想到的是程序bug导致在/tmp目录下写入了大量的临时文件,没有删除造成的,但是我们在/tmp目录下计算完空间发现/tmp目录下才20K,虽然有点质疑但是目前没有证据,换个思路继续排查。
- 逐级排查根目录下所有的子级文件夹
我们从根目录一级一级往下排查查看那个目录占用的空间比较异常,但是排查完发现这些子级文件夹占用的空间大小和根目录的空间相差很多,还有很大一部分的空间未找到归属。
计算某个目录下所有子级文件夹的大小命令:du -d1 -h
计算某个目录下所有子级文件夹(不包含子子级)大小的命令:du -h -x --max-depth=1
- 查看系统异常日志
从根目录下所有子目录的空间上没有发现问题,我们换个方向从系统日志入手开始排查,从系统日志中发现mysql异常信息,初步怀疑mysql导致的。
查看系统日志命令:dmesg -T
- 查看系统已删除但未释放空间的文件
从系统日志中确定了mysql的方向之后,我们查看系统中已删除的但是未释放空间的文件都是那个进程造成的,排查发现都是mysql进程产生的临时表文件已删除但未释放空间,终于定位到问题。
查看系统已删除未释放空间命令:lsof -w / | grep deleted
定位问题
目前定位到问题是mysql临时表文件产生的,就需要从应用系统中查找具体使用临时表的地方,考虑优化方案。
解决方案
优化方案1:对使用临时表的sql进行优化,尽量避免使用临时表;
优化方案2:msyql临时表文件默认目录是/tmp,可以考虑给更换目录,配置到存储目录;
在/etc/my.c