快速drop mysql大表
這是因為INNODB會維護一個全域性獨佔鎖(在table cache上面),直到DROP TABLE完成才釋放。
在我們常用的ext3,ext4,ntfs檔案系統,要刪除一個大檔案(幾十G,甚至幾百G)還是需要點時間的。
下面我們介紹一個快速DROP table 的方法; 不管多大的表,INNODB 都可以很快返回,表刪除完成;
實現:巧用LINK(硬連結)
實測:
root@127.0.0.1 : test 21:38:00> show table status like ‘tt’ \G
*************************** 1. row ***************************
Name: tt
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 151789128
Avg_row_length: 72
Data_length: 11011096576
Max_data_length: 0
Index_length: 5206179840
Data_free: 7340032
Auto_increment: NULL
Create_time: 2011-05-18 14:55:08
Update_time: NULL
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.22 sec)
root@127.0.0.1 : test 21:39:34> drop table tt ;
Query OK, 0 rows affected (25.01 sec)
刪除一個11G的表用時25秒左右(硬體不同,時間不同);
下面我們來對另一個更大的表進行刪除;
但之前,我們需要對這個表的資料檔案做一個硬連線:
root@ # ln stock.ibd stock.id.hdlk
root@ # ls stock.* -l
-rw-rw—- 1 mysql mysql 9196 Apr 14 23:03 stock.frm
-rw-r–r– 2 mysql mysql 19096666112 Apr 15 09:55 stock.ibd
-rw-r–r– 2 mysql mysql 19096666112 Apr 15 09:55 stock.id.hdlk
你會發現stock.ibd的INODES屬性變成了2;
下面我們繼續來刪表。
root@127.0.0.1 : test 21:44:37> show table status like ‘stock’ \G
*************************** 1. row ***************************
Name: stock
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 49916863
Avg_row_length: 356
Data_length: 17799577600
Max_data_length: 0
Index_length: 1025507328
Data_free: 4194304
Auto_increment: NULL
Create_time: 2011-05-18 14:55:08
Update_time: NULL
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.23 sec)
root@127.0.0.1 : test 21:39:34> drop table stock ;
Query OK, 0 rows affected (0.99 sec)
1秒不到就刪除完成; 也就是DROP TABLE不用再HANG這麼久了。
但table是刪除了,資料檔案還在,所以你還需要最後資料檔案給刪除。
root # ll
total 19096666112
-rw-r–r– 2 mysql mysql 19096666112 Apr 15 09:55 stock.id.hdlk
root # rm stock.id.hdlk
雖然DROP TABLE 多繞了幾步。(如果你有一個比較可靠的自執行程式(自動為大表建立硬連結,並會自動刪除過期的硬連結檔案),就會顯得不那麼繁瑣。)
這樣做能大大減少MYSQL HANG住的時間; 相信還是值得的。
至於原理: 就是利用OS HARD LINK的原理,
當多個檔名同時指向同一個INODE時,這個INODE的引用數N>1, 刪除其中任何一個檔名都會很快.
因為其直接的物理檔案塊沒有被刪除.只是刪除了一個指標而已;
當INODE的引用數N=1時, 刪除檔案需要去把這個檔案相關的所有資料塊清除,所以會比較耗時;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29096438/viewspace-1763466/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle資料庫快速Drop 大表Oracle資料庫
- MySQL Drop 大表的解決方案MySql
- mysql恢復drop表MySql
- MYSQL下如何安全的快速刪除大表MySql
- mysql drop keyMySql
- 故障分析 | DROP 大表造成資料庫假死資料庫
- MySQL中使用undrop來恢復drop的表(上)MySql
- Oracle大表快速建立索引Oracle索引
- mysql 無備份恢復drop資料-共享表空間MySql
- oracle 誤刪表 drop tableOracle
- MySQL大表設計MySql
- 在MYSQL中快速建立空表薦MySql
- Oracle Drop表(purge)恢復(ODU)Oracle
- ZT:處理Oracle資料庫中一張有效的Drop大表Oracle資料庫
- MySQL大表優化方案MySql優化
- db2 表被誤刪(drop)DB2
- 恢復oracle中drop掉的表Oracle
- mysql 大表mysqldump遷移方案MySql
- MySQL 對大表做歸檔MySql
- MySQL大表最佳化方案MySql
- 【Flashback】使用Flashback Drop技術閃回被DROP表的指定版本資料
- Mysql資料庫大表最佳化方案和Mysql大表最佳化步驟MySql資料庫
- MySQL DROP TABLE刪除表報錯'ERROR 1051 (42S02): Unknown table'MySqlError
- MySQL千萬級大表線上變更表結構MySql
- MySQL資料災難挽救之drop tableMySql
- 在MySQL中 Truncate Delect Drop 的區別MySql
- MySQL 5.6對大表做歸檔MySql
- MySQL 查詢大表注意事項MySql
- MySQL大表刪除解決方案MySql
- MySQL 大表優化方案探討MySql優化
- Mysql大表查詢注意事項MySql
- SQL快速入門 ( MySQL快速入門, MySQL參考, MySQL快速回顧 )MySql
- GreatSQL資料庫DROP表後無法重建SQL資料庫
- MySQL 5.6 drop database時,table metadata lock等待MySqlDatabase
- 乾貨!MySQL大表優化方案(1)MySql優化
- MySQL如何優雅的刪除大表MySql
- MySQL 上億大表優化實踐MySql優化
- 檢視mysql哪張表比較大MySql