事件起因:
今天運維人員找我,說我們的數據庫磁盤空間滿了。於是提供了一些刪除表數據的sql給他,讓他執行下。
執行之後,查詢數據庫,表數據是不在了,但是問題來了。
磁盤空間並沒有釋放,這是爲啥咧????
於是乎,上網查找資料,功夫不負有心人,終於找到問題原因:
使用delete 加上 where條件的刪除都不是真刪除,在刪除數據的時候,mysql並沒有把數據文件刪除,而是將數據文件的標識位刪除,沒有整理文件,因此不會徹底釋放空間。
被刪除的數據將會被保存在一個鏈接清單中,當有新數據寫入的時候,mysql會利用這些已刪除的空間再寫入。刪除操作會帶來一些數據碎片,正是這些碎片在佔用硬盤空間。
解決方法:
執行完delete語句的時候,再執行下:OPTIMIZE TABLE XXXTable(自己的表名)
注意事項:
執行OPTIMIZE TABLE的時候,會導致鎖表,而且沒有必要每次delete之後都執行,一個月定時清理下即可。另外,OPTIMIZE 操作會導致鎖表,建議在訪問量小的時候執行!
自我總結
今天才碰到這樣的問題,mysql的delete方法,之前一直以爲是直接刪除掉了,數據佔用的表空間也自然會釋放,但是今天才發現,delete語句後加where條件刪除的數據會自動加個delete標識而不會真的刪掉。學的太淺了,還需多多努力!