備註:來自知數堂老師的總結,這裏搬到本博客主要是爲了備忘。mysql
一個無業務的大表,在系統不繁忙的狀況下,如何儘量的佔用較少的磁盤IO,並快速的drop掉? sql
建議方案:ide
0. 必定要提早作好備份啊spa
1. rename table xx to xx_1;.net
2. create table xx like xx_1;blog
3. os 層創建硬連接 get
4. drop table xx;博客
5. os 層循環truncate數據文件it
具體例子參考牛人博客:table
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
#sudo ls -lh /data/mysql/testdb
-rw-rw---- 1 mysql mysql 8.4K Oct 28 13:26 example_table.frm
-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;
#sudo ls -lh /data/mysql/testdb
-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;