當磁盤空間寫滿了之後,MySQL是無法再寫入任何資料的,包括對表資料的寫入,以及binlog、binlog-index等檔案。
當然了,因為InnoDB是可以把髒資料先放在記憶體裡,是以不會立刻表現出來無法寫入,除非開啟了binlog,寫入請求才會被阻塞。
當MySQL檢測到磁盤空間滿了,它會:
- 每分鐘:檢查空間是否得到釋放,以便寫入新資料。當發現有剩餘空間了,就會繼續寫入資料,一切照舊。
- 每十分鐘:如果還是發現沒剩餘空間,則會在日志中寫入一條記錄,報告磁盤空間滿(這時候隻寫入幾個位元組還是夠的)。
- 如果sync_binlog=1,第一個insert會被hang住,在commit階段等待磁盤空出空間,向磁盤flush binlog
- 後續向磁盤刷髒頁導緻server崩潰
應該怎麼辦
那麼,當發現磁盤空間滿了之後,我們應該怎麼處理呢,建議:
- 提高監控系統檢測頻率,預防再次發生;
- 及時删除不用的檔案,釋放空間;
- 若有線程因磁盤滿的問題被阻塞了,可先殺掉,等到下一分鐘重新檢測時它可能又可以正常工作了;
- 可能因磁盤滿導緻某些線程被阻塞,引發其他線程也被阻塞,可把導緻阻塞的線程殺掉,其他被阻塞的線程也就能繼續工作了。