備注:來自知數堂老師的總結,這裡搬到本部落客要是為了備忘。
一個無業務的大表,在系統不繁忙的情況下,如何盡可能的占用較少的磁盤IO,并快速的drop掉?
建議方案:
0. 一定要提前做好備份啊
1. rename table xx to xx_1;
2. create table xx like xx_1;
3. os 層建立硬連結
4. drop table xx;
5. os 層循環truncate資料檔案
具體例子參考牛人部落格:
https://blog.csdn.net/zyz511919766/article/details/40539333這裡再稍作解釋:
1.有個InnoDB表prod_table,先把表重新命名,防止還有應用在使用表
rename table prod_table to example_table;
2.隻建立表結構,不含資料
create table prod_table like example_table;
3.對100G的ibd資料檔案做個硬連結
#sudo ls -lh /data/mysql/testdb
-rw-rw---- 1 mysql mysql 8.4K Oct 28 13:26 example_table.frm
-rw-rw---- 1 mysql mysql 100G Oct 28 13:26 example_table.ibd
#sudo ln /data/mysql/testdb/example_table.ibd /data/mysql/testdb/example_table.ibd.hdlk
-rw-rw---- 2 mysql mysql 100G Oct 28 13:26 example_table.ibd
-rw-rw---- 2 mysql mysql 100G Oct 28 13:26 example_table.ibd.hdlk
4.幹掉大表,這個過程會比較快,因為有硬連結檔案
DROP TABLE example_table;
-rw-rw---- 1 mysql mysql 100G Oct 28 13:26 example_table.ibd.hdlk
5.使用truncate指令收縮檔案,從100G開始,每次縮減1G,停2秒,繼續,直到檔案隻剩1G,最後使用rm指令删除剩餘的部分
#for i in `seq 100 -1 1 `; do sleep 2; sudo truncate -s ${i}G /data/mysql/testdb/example_table.ibd.hdlk; done
#sudo rm -rf /data/mysql/testdb/example_table.ibd.hdlk;