問題背景
收到運維提示數據庫服務所在機器磁盤空間不足,在不滿足遷移條件的情況下則需要進行冷數據本地備份刪除操作,在delete掉冷數據發現磁盤空間並沒有進行釋放,表的ibd文件大小沒有變化。
問題分析
InnoDB 數據庫在使用 delete 進行刪除操作的時候,只會將已經刪除的數據標記為刪除,並沒有把數據文件刪除,因此並不會徹底的釋放空間。這些被刪除的數據會被保存在一個鏈接清單中,當有新數據寫入的時候,MySQL 會重新利用這些已刪除的空間進行再寫入。
解決方法
官方推薦可以使用 OPTIMIZE TABLE 命令來優化表,該命令會重新利用未使用的空間,並整理數據文件的碎片。
OPTIMIZE TABLE 是指對表進行優化。如果已經刪除了表的一大部分數據,或者如果已經對含有可變長度行的表(含有 VARCHAR 、 BLOB 或 TEXT 列的表)進行了很多更改,就應該使用 OPTIMIZE TABLE 命令來進行表優化。這個命令可以將表中的空間碎片進行合並,並且可以消除由於刪除或者更新造成的空間浪費 。
OPTIMIZE TABLE 命令只對 MyISAM 、 BDB 和 InnoDB 表起作用 。表優化的工作可以每周或者每月定期執行,對提高表的訪問效率有一定的好處,但是需要注意的是,優化表期間會鎖定表,所以一定要安排在空閑時段進行。
操作如下
先查看表的數據量及表ibd文件大小,然后進行冷數據備份刪除。
刪除前:
刪除后並進行優化:
OPTIMIZE TABLE tablename;