一个mysql/tmp目录爆满问题的处理

突然收到zabbix告警,说mysql服务器的/目录磁盘空间不足。

登录到服务器,看了下发现100 gb的根目录,居然使用了差不多90 gb。这台服务器上只跑了一个mysql,应该不是日志未清理等其它原因造成的。


(说明:下面的几张截图是后期截的,当时已经有部分SQL跑完,释放掉部分磁盘空间了)

lsof | grep删除发现如下:

一个mysql/tmp目录爆满问题的处理”>可以看到这个临时文件差不多有40 gb。</p> <p> <br/> </p> <p> <br/> </p> <p>显示processlist;如下:</p> <p> <img src=

上图看的话,没有涉及到写binlog的操作,但是由于单纯的选择并不会造成/tmp目录爆满的情况,所以猜测他这个同一个事务里面之前还有涉及到写binlog的操作(更新、删除等)。



官方的说明:https://dev.mysql.com/doc/refman/5.6/en/binary-log.html

<代码类=拔淖帧? binlog_cache_size

, <代码类=拔淖帧? Binlog_cache_use>

<强>

, <代码类=拔淖帧? max_binlog_cache_size>

如果您使用的是基于二进制日志和行日志,并发插入转换为正常插入for  <代码类=拔淖帧?创建…选择,<代码类=拔淖帧?趁机插入……选择语句。这样做是为了确保你可以重新创建一个精确复制表的应用日志备份操作。如果您使用的是statement-based日志,原来的语句写入日志。


<强>


上面就是因为事务里面的临时文件超过16 mb了,被放到/tmp目录下了,但是这个临时文件实在太大了,导致磁盘空间不足告警了。


<强>解决方法:

等上面的查询结束后,我们先关闭mysqld。(条件能允许的话,当然是让查询自己结束。如果直接杀死掉的话,估计回滚也要话挺长时间的)


然后调整mysql的tmpdir到其他更大的磁盘去。

mkdir/bdata mysql_tmp

乔恩mysql。mysql/bdata mysql_tmp - r

乔恩1777 - r/bdata/mysql_tmp - r

vim/etc/my.cnf 

(mysqld) tmpdir=/bdata mysql_tmp


然后启动mysql即可

再次执行lsof | grep删除可以看到临时文件的路径已经改到了/bdata mysql_tmp目录下了。

一个mysql/tmp目录爆满问题的处理


一个mysql/tmp目录爆满问题的处理