MySQL刪除超大表操作
========================================================================
問題原因
通常情況下,會使用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/truncatefor 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刪除超大表操作