標籤:mysql 一個 /tmp
突然收到zabbix警示,說mysql伺服器的/目錄磁碟空間不足。
登入到伺服器,看了下發現100GB的根目錄,居然使用了差不多90GB。這台伺服器上只跑了一個MySQL,應該不是日誌未清理等其它原因造成的。
(說明:下面的幾張是後期截的,當時已經有部分SQL跑完,釋放掉部分磁碟空間了)
lsof |grep deleted 發現如下:
650) this.width=650;" src="https://s1.51cto.com/wyfs02/M02/99/39/wKioL1lF_ezRJ2IyAABQPE-MFtA584.png" title="1.png" alt="wKioL1lF_ezRJ2IyAABQPE-MFtA584.png" />可以看到這個臨時檔案差不多有40GB。
show processlist; 如下:
650) this.width=650;" src="https://s5.51cto.com/wyfs02/M00/99/39/wKiom1lF_mTxOcCPAAApUEGKL_0121.png" title="2.png" alt="wKiom1lF_mTxOcCPAAApUEGKL_0121.png" />
看的話,沒有涉及到寫binlog的操作,但是由於單純的select並不會造成/tmp目錄爆滿的情況,所以猜測他這個同一個事務裡面之前還有涉及到寫binlog的操作(update、delete等)。
官方的說明:
https://dev.mysql.com/doc/refman/5.6/en/binary-log.html
650) this.width=650;" src="https://s5.51cto.com/wyfs02/M01/99/39/wKioL1lF_rbCcs8ZAAAYLZg3Ma8340.png" title="3.png" alt="wKioL1lF_rbCcs8ZAAAYLZg3Ma8340.png" />
當事務開始時,它將緩衝區語句分配一個binlog_cache_size大小的緩衝區(我這裡設定的是16777216bytes,即16MB)。 如果一個語句大於此,線程將開啟一個臨時檔案來儲存事務(預設是存放在/tmp/目錄下)。 當線程結束時,臨時檔案會自動被刪除。
上面就是因為事務裡面的臨時檔案超過16MB了,被放到/tmp目錄下了,但是這個臨時檔案實在太大了,導致磁碟空間不足警示了。
解決方案:
等上面的查詢結束後,我們先關閉mysqld。(條件能允許的話,當然是讓查詢自己結束。如果直接kill掉的話,估計復原也要話挺長時間的)
然後調整mysql的tmpdir到其他更大的磁碟去。
mkdir /bdata/mysql_tmp
chown mysql.mysql /bdata/mysql_tmp -R
chown 1777 -R /bdata/mysql_tmp -R
vim /etc/my.cnf
[mysqld]
tmpdir = /bdata/mysql_tmp
然後啟動mysql即可
再次執行lsof|grep deleted 可以看到臨時檔案的路徑已經改到了/bdata/mysql_tmp目錄下了。
650) this.width=650;" src="https://s2.51cto.com/wyfs02/M02/99/39/wKioL1lF_t_yqanfAABBKYK1EhA286.png" title="4.png" alt="wKioL1lF_t_yqanfAABBKYK1EhA286.png" />
一個mysql /tmp目錄爆滿問題的處理