突然收到zabbix告警,说mysql服务器的/目录磁盘空间不足。
登录到服务器,看了下发现100 gb的根目录,居然使用了差不多90 gb。这台服务器上只跑了一个mysql,应该不是日志未清理等其它原因造成的。
(说明:下面的几张截图是后期截的,当时已经有部分SQL跑完,释放掉部分磁盘空间了)
lsof | grep删除发现如下:
上图看的话,没有涉及到写binlog的操作,但是由于单纯的选择并不会造成/tmp目录爆满的情况,所以猜测他这个同一个事务里面之前还有涉及到写binlog的操作(更新、删除等)。
官方的说明:https://dev.mysql.com/doc/refman/5.6/en/binary-log.html
<代码类=拔淖帧? binlog_cache_size 代码>
, <代码类=拔淖帧? Binlog_cache_use> 代码,状态变量显示了此缓冲区使用的交易数量(也可能是一个临时文件)来存储报表。<代码类=拔淖帧? Binlog_cache_disk_use> 代码,状态变量显示有多少交易实际上不得不使用一个临时文件。这两个变量可用于tuning <代码类=拔淖帧? binlog_cache_size> 代码,一个足够大的价值,避免了使用临时文件。
<强> 强>
, <代码类=拔淖帧? max_binlog_cache_size> 代码,系统变量(默认4 gb,也是最大的)可以用来限制用于缓存多个语句的总大小事务。如果事务比这么多字节,它失败,回滚。最小值是4096。
如果您使用的是基于二进制日志和行日志,并发插入转换为正常插入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目录下了。