天天看點

MySQL如何drop一個上百GB的大表

備注:來自知數堂老師的總結,這裡搬到本部落客要是為了備忘。

一個無業務的大表,在系統不繁忙的情況下,如何盡可能的占用較少的磁盤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;

繼續閱讀