MySQL Delete 刪數(shù)據(jù)后磁盤空間未釋放的原因
問題描述
在 MySQL 中使用 delete 語句刪除數(shù)據(jù)之后,監(jiān)控視圖中可用的磁盤空間沒有增加,磁盤使用率沒有下降等等。
解決方案
delete 不釋放空間是 MySQL 自身機(jī)制的原因,需要重建表才可以釋放磁盤空間,可以參考的操作:
- 執(zhí)行 optimize table ${table_name}。
- 如果是 InnoDB 的表,執(zhí)行 alter table ${table_name} engine = innodb。
需要注意以下兩個(gè)問題:
這兩個(gè)命令都會(huì)重建表,盡量不要在磁盤空間緊張(>90%)的時(shí)候進(jìn)行操作,先擴(kuò)容磁盤,操作完之后再縮容。
這兩個(gè)命令在開始和結(jié)束的時(shí)候都會(huì)嘗試獲取 metadata lock,所以盡量不要在業(yè)務(wù)高峰期執(zhí)行。
問題分析
在 MySQL 的機(jī)制中,delete 刪除的行只是被標(biāo)記為刪除狀態(tài),如果刪除的行很多,整個(gè)數(shù)據(jù)頁(innodb_page)的行都會(huì)被刪除的時(shí)候,數(shù)據(jù)頁也只會(huì)標(biāo)記為刪除,都不會(huì)真正的物理刪除,而是一直占用,等待被復(fù)用。
例如:
可以看到 delete 前后,data_length 并沒有發(fā)生變化,但是 data_free 增加了很多。這說明數(shù)據(jù)雖然刪了,但是并沒有被釋放,仍舊被 test1 表占用,只是顯示處于 free 狀態(tài),以后再寫入新數(shù)據(jù)的時(shí)候就可以直接復(fù)用,而不需要在申請(qǐng)新的磁盤空間了。
這個(gè)時(shí)候使用alter table test1 engine = innodb
看看效果:
可以看到 data_length 和 data_free 都變成了空表的狀態(tài),僅有一個(gè) innodb_page (默認(rèn) 16k)。
PS:data_free 本身也可以用來評(píng)估表的空間碎片,當(dāng)這個(gè)數(shù)字非常高的時(shí)候,可以考慮用同樣的方法重建表,回收一部分磁盤空間。
以上就是MySQL Delete 刪數(shù)據(jù)后磁盤空間未釋放的原因的詳細(xì)內(nèi)容,更多關(guān)于MySQL 刪數(shù)據(jù)后磁盤空間未釋放的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
mysql 5.6.14 win32 解壓縮版(免安裝)安裝配置教程
這篇文章主要介紹了mysql 5.6.14 win32 解壓縮版(免安裝)安裝配置教程,感興趣的小伙伴們可以參考一下2016-11-11MySQL主從配置及haproxy和keepalived搭建過程解析
這篇文章主要介紹了MySQL主從配置及haproxy和keepalived搭建,本次運(yùn)行環(huán)境是在docker中,也會(huì)介紹一些docker的知識(shí),需要的朋友可以參考下2022-05-05Windows系統(tǒng)下MySQL無法啟動(dòng)的萬能解決方法
這篇文章主要給大家介紹了關(guān)于Windows系統(tǒng)下MySQL無法啟動(dòng)的萬能解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12MySQL: mysql is not running but lock exists 的解決方法
下面可以參考下面的方法步驟解決。最后查到一個(gè)網(wǎng)友說可能和log文件有關(guān),于是將log文件給移除了,再重啟MySQL終于OK了2009-06-06Mysql數(shù)據(jù)庫設(shè)計(jì)三范式實(shí)例解析
這篇文章主要介紹了Mysql數(shù)據(jù)庫設(shè)計(jì)三范式實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04mysql登錄時(shí)報(bào)socket找不到的問題及解決
這篇文章主要介紹了mysql登錄時(shí)報(bào)socket找不到的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07MySQL如何統(tǒng)計(jì)一個(gè)數(shù)據(jù)庫所有表的數(shù)據(jù)量
最近在做統(tǒng)計(jì)想查找一個(gè)數(shù)據(jù)庫里基本所有的表數(shù)據(jù)量,下面這篇文章主要給大家介紹了關(guān)于MySQL如何統(tǒng)計(jì)一個(gè)數(shù)據(jù)庫所有表的數(shù)據(jù)量的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04