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/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
========================================================================


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM