對于innodb獨立表空間來說,delete 是不能回收其在磁盤所占用的空間,采用truncate (原理是先删除,或重建)倒是可以;
這裡不讨論直接drop表的情況,直接alter table ....engine=innodb 是可以整理碎片,回收部分表空間,在資料量小或者buffer pool 比較小的時候(小于30G)倒是很不錯;
在這裡我介紹一種安全高效的碎片整理方法;pt-online-schema-change
percona這款工具本身是用來進行非阻塞的online ddl的,但由于隻有alter table ...語句才能回收表空間,那可以采用該工具的原理:建立一張臨時表,以觸發器來保證與原表的資料一緻,最後renmame替換掉;用過這款工具的朋友可能會有疑問,“online ddl”最後的操作時 drop old table;drop trigger;這樣的操作;但可以采用--no-drop-old-table,讓其不會删除舊表,等有其他時間的時候,采用腳本形式批量删除記錄,最後在drop掉剩餘的“小表”;這樣就避免了hang 住系統;
本人親測,版本2.2.1,60G表,2個小時左右回收至21G;
本文轉自 位鵬飛 51CTO部落格,原文連結:http://blog.51cto.com/weipengfei/1310579,如需轉載請自行聯系原作者