MySQL DROP 大表時的注意事項


  對於表的刪除,因為InnoDB引擎會在table cache層面維護一個全局獨占鎖一直到DROP TABLE完成為止,這樣,對於表的其他操作會被HANG住。對於較大的表來說,DROP TABLE操作可能需要很長的時間,因此需要一種有效的辦法來提升大表的刪除速度,以盡可能降低HANG住的時間。可以通過設置硬鏈接來達到此目的。比如有一個樣例表:example_table

使用InnoDB引擎且指定innodb_file_per_table=ON時在數據目錄中與該表對應的有如下兩個文件,分別為表定義文件和數據文件:

1 sudo ls  -lh /data/mysql/testdb  
2 -rw-rw---- 1 mysql mysql 8.4K Oct 28 13:26 example_table.frm  
3 -rw-rw---- 1 mysql mysql 100G Oct 28 13:26 example_table.ibd 

  該表有100G這么大,直接使用DROP TABLE來完成刪表動作,那么這條語句要執行很長時間。此時便可以通過在該表對應的數據文件上設置硬鏈接來進行刪除。

1 sudo ln /data/mysql/testdb/example_table.ibd /data/mysql/testdb/example_table.ibd.hdlk  
2 sudo ls  -lh /data/mysql/testdb  
3 -rw-rw---- 1 mysql mysql 8.4K Oct 28 13:26 example_table.frm  
4 -rw-rw---- 2 mysql mysql 100G Oct 28 13:26 example_table.ibd  
5 -rw-rw---- 2 mysql mysql 100G Oct 28 13:26 example_table.ibd.hdlk 

  發現多了一個example_table.ibd.hdlk文件,且example_table.ibd.hdlk和example_table.ibd的innode均為2。也即當有多個文件名(如硬鏈接)指向同一innode時,這個innode的引用數大於1,此時,刪除其中任何一個文件名都只會刪除指向innode的指針而並不會直接刪除物理文件塊,因此會非常快,直至innode的引用計數等於1時才會真正刪除對應的物理文件塊,真正刪除物理文件塊時才會比較耗時。

在建立了硬鏈接后再執行DROP TABLE操作:

1 DROP TABLE example_table;

發現會很快的完成,查看對應的表定義和數據文件:

sudo ls  -lh /data/mysql/testdb  
-rw-rw---- 1 mysql mysql 100G Oct 28 13:26 example_table.ibd.hdlk

只剩下example_table.ibd.hdlk,且innode的引用計數變為了1。也即剛才的DROP TABLE操作實施刪除了物理文件的一個指針example_table.ibd ,因而非常快。

  剩下的任務就是刪除真正的物理文件了,因為此時innode的引用計數已經變為了1,直接刪除example_table.ibd.hdlk便會真正的刪除物理文件。但因為物理文件較大,刪除大文件仍會引起較高的磁盤IO開銷。因此可以使用少量逐次刪除的方式來刪除大的數據文件。truncate工具可以用於增加或縮減指定文件的尺寸,可以用於此目的:

1 for i in `seq 100 -1 1 ` ;do sleep 2;sudo truncate -s ${i}G /data/mysql/testdb/example_table.ibd.hdlk;done  
2 sudo rm -rf /data/mysql/testdb/example_table.ibd.hdlk;

  從100G開始,每次縮減1G,停2秒,繼續,直到文件只剩1G,最后使用rm命令刪除剩余的部分。

  對於整個數據庫的刪除可以先刪除其中較大的表,最后在執行DROP DATABASE刪除整個庫,對大表的刪除可參見上面的方法。

轉自《http://blog.csdn.net/zyz511919766/article/details/40539333》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM