本文主要向大家介绍了MySQL数据库之一个mysql/tmp目录爆满问题的处理,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助。
登录到服务器,看了下发现100GB的根目录,居然使用了差不多90GB。这台服务器上只跑了一个MySQL,应该不是日志未清理等其它原因造成的。
上图看的话,没有涉及到写binlog的操作,但是由于单纯的select并不会造成/tmp目录爆满的情况,所以猜测他这个同一个事务里面之前还有涉及到写binlog的操作(update、delete等)。
Whenathreadthathandlesthetransactionstarts,itallocatesabufferofbinlog_cache_sizetobufferstatements.Ifastatementisbiggerthanthis,thethreadopensatemporaryfiletostorethetransaction.Thetemporaryfileisdeletedwhenthethreadends.
TheBinlog_cache_usestatusvariableshowsthenumberoftransactionsthatusedthisbuffer(andpossiblyatemporaryfile)forstoringstatements.TheBinlog_cache_disk_usestatusvariableshowshowmanyofthosetransactionsactuallyhadtouseatemporaryfile.Thesetwovariablescanbeusedfortuningbinlog_cache_sizetoalargeenoughvaluethatavoidstheuseoftemporaryfiles.
Themax_binlog_cache_sizesystemvariable(default4GB,whichisalsothemaximum)canbeusedtorestrictthetotalsizeusedtocacheamultiple-statementtransaction.Ifatransactionislargerthanthismanybytes,itfailsandrollsback.Theminimumvalueis.
当事务开始时,它将缓冲区语句分配一个binlog_cache_size大小的缓冲区(我这里设置的是bytes,即16MB)。如果一个语句大于此,线程将打开一个临时文件来存储事务(默认是存放在/tmp/目录下)。当线程结束时,临时文件会自动被删除。
上面就是因为事务里面的临时文件超过16MB了,被放到/tmp目录下了,但是这个临时文件实在太大了,导致磁盘空间不足告警了。
等上面的查询结束后,我们先关闭mysqld。(条件能允许的话,当然是让查询自己结束。如果直接kill掉的话,估计回滚也要话挺长时间的)
再次执行lsof|grepdeleted可以看到临时文件的路径已经改到了/bdata/mysql_tmp目录下了。
本文由职坐标整理并发布,希望对同学们学习MySQL有所帮助,更多内容请关注职坐标数据库MySQL数据库频道!
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。