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

備註:來自知數堂老師的總結,這裏搬到本博客主要是爲了備忘。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;

相關文章
相關標籤/搜索