在網上看到的一個思想
- 大表的刪除過程中,innodb存儲引擎會維護一個全局獨佔鎖,由於大表刪除時間長。使得其他操作夯住,造成線上的業務的不可用,所以我們要縮短大表的刪除時間。
- DROP TABLE的內部原理:
1.清除buffer pool中的flush list中與drop table有關的頁面
2.刪除數據文件.ibd - 解決方法:
關於flush list的頁面刪除我們無法對源碼進行修改來加速,所以只能從縮短刪除數據文件.ibd的時間下手,我們利用系統的硬鏈接的特性來刪除大表的.ibd文件。 - 具體步驟:
#建立Nums.ibd文件的硬鏈接
1. ln /mysqldata/node1/Nums/Nums.ibd /mysqldata/node1/Nums/Nums.ibd.bak
#此時刪除表,只會刪除Nums.ibd和Nums.ibd.bak所共同指向的源文件的一個link節點Nums.ibd,也就是隻會進行一個減1操作
2. drop table Nums;
#在業務空閒時後臺循環分塊刪除.ibd,使用truncate
3.使用腳本實現。。
每天早上6點去練車,回來之後學習學到晚上10點,蠻累得,堅持把。