1. 程式人生 > >MySQL刪除超大表操作

MySQL刪除超大表操作

存儲引擎 長時間 時間 span 命令 cal usr -s 文件

========================================================================

問題原因

通常情況下,會使用innodb_file_per_table=ON來將每張InnoDB表數據和索引數據保存到一個獨立的文件中,而當MySQL運行在Linux版本時,使用DROP TABLE刪除表時,會同時刪除磁盤上的數據文件來回收磁盤空間。
當刪除超大表時:
1、Linux刪除超大文件會在一段時間內嚴重消耗磁盤IO,引發磁盤性能問題。
2、MySQL刪除表期間,InnoDB存儲引擎需要維護一個全局鎖直到刪除完成,長時間持有全局鎖會引發嚴重的阻塞。

========================================================================

優化原理

在Linux中,每個存儲文件都會有指向該文件的Inode Index,多個文件名可以通過相同Inode Index指向相同一個存儲文件。
當按照文件名刪除文件時:
1、如果該文件名引用的Inode Index上還被其他文件名引用,則只會刪除該文件名和Inode Index之間的引用
2、如果該文件名引用的Inode Index上沒有被其他文件名引用,則刪除該文件名和Inode Index之間的引用並刪除Inode Index指向的存儲文件。

技術分享圖片

========================================================================

操作步驟

1、創建硬連接指向要刪除表的ibd文件
ln /data/mysql/mytest/erp.ibd /data/mysql/mytest/erp.ibd.hdlk

2、使用DELETE刪除表
DROP TABLE mytest.erp;

3、使用truncate命令小批量刪除文件,最後用rm刪除整個文件
##seq 2194 -10 10 表示:從2194開始循環,每次遞減10,直到循環至10
TRUNCATE=/usr/local/bin/truncate  
for i in `seq 2194 -10 10 `; do sleep 2 $TRUNCATE -s ${i}G /data/mysql/mytest/erp.ibd.hdlk done rm -rf /data/mysql/mytest/erp.ibd.hdlk;

========================================================================

PS1:在Window上刪除表時,Window只需要刪除該文件指針並將該存儲區域表示為可重用即可,因此在Windows上刪除超大表無需過多操作。 參考鏈接:
https://www.cnblogs.com/digdeep/p/9588709.html ========================================================================

MySQL刪除超大表操作