原文地址:http://ace105.blog.51cto.com/639741/1172724
mysql在對大表做DROP TABLE 過程中,所有操作都會被HANG住为障。
這是因為INNODB會維護(hù)一個全局獨(dú)占鎖(在table cache上面)查乒,直到DROP TABLE完成才釋放。
在我們常用的ext3,ext4苔可,ntfs文件系統(tǒng)萌衬,要刪除一個大文件(幾十G,甚至幾百G)還是需要點時間的。
下面我們介紹一個快速DROP table 的方法浪漠; 不管多大的表,INNODB 都可以很快返回,表刪除完成霎褐;
實現(xiàn):巧用LINK(硬鏈接)
我們首先構(gòu)建一張大表
mysql>create table aa as select * from SuperAgentWebSite;
Query?OK,?5505 rows affected?(1.75?sec)
Records:?5505??Duplicates:?0??Warnings:?0
mysql>insert into aa select * from aa?;
Query?OK,?5505 rows affected?(1.60?sec)
Records:?5505??Duplicates:?0??Warnings:?0
mysql>insert into aa select * from aa?;
Query?OK,?11010 rows affected?(3.91?sec)
Records:?11010??Duplicates:?0??Warnings:?0
mysql>insert into aa select * from aa?;
Query?OK,?22020 rows affected?(8.02?sec)
Records:?22020??Duplicates:?0??Warnings:?0
mysql>insert into aa select * from aa?;
Query?OK,?44040 rows affected?(16.36?sec)
Records:?44040??Duplicates:?0??Warnings:?0
mysql>insert into aa select * from aa?;
Query?OK,?88080 rows affected?(34.15?sec)
Records:?88080??Duplicates:?0??Warnings:?0
查看一下表的大小
[root@db15?test]#?du?-sh?aa*
16K?aa.frm
3.8G????aa.ibd
關(guān)鍵地方來了址愿,對aa表做一個硬鏈接
[root@db15?test]#?ln?aa.ibd??aa.hdlk
這個時候發(fā)現(xiàn)本身mysql的aa.ibd文件變小了。文件存貯到了我們的硬鏈接文件上冻璃。
[root@db15?test]#?du?-sh?aa*
16K?aa.frm
3.8G????aa.hdlk
刪除aa表响谓,我們發(fā)現(xiàn)瞬間就搞定了。
mysql>drop table aa;
Query?OK,?0 rows affected?(0.33?sec)
最后去硬鏈接目錄下面把我們的硬鏈接數(shù)據(jù)文件aa.hdlk刪除掉省艳。 我們發(fā)現(xiàn)上面刪除表的droptableaa;?只是刪除了aa.frm文件娘纷。
[root@db15?test]#?rm?-rfv?aa*
已刪除“aa.hdlk”
雖然DROP TABLE 多繞了幾步。(如果你有一個比較可靠的自運(yùn)行程序(自動為大表建立硬鏈接跋炕,并會自動刪除過期的硬鏈接文件)赖晶,就會顯得不那么繁瑣。)
這樣做能大大減少M(fèi)YSQL HANG住的時間辐烂; 相信還是值得的遏插。
至于原理: 就是利用OS HARD LINK的原理,
當(dāng)多個文件名同時指向同一個INODE時,這個INODE的引用數(shù)N>1, 刪除其中任何一個文件名都會很快.
因為其直接的物理文件塊沒有被刪除.只是刪除了一個指針而已;
當(dāng)INODE的引用數(shù)N=1時, 刪除文件需要去把這個文件相關(guān)的所有數(shù)據(jù)塊清除,所以會比較耗時;