【原创】Innodb中mysql如何快速删除2T的大表 (2)

此时,文件目录如下所示

-rw-r----- 1 mysql mysql 9023 8 18 05:21 erp.frm -rw-r----- 2 mysql mysql 2356792000512 8 18 05:21 erp.ibd -rw-r----- 2 mysql mysql 2356792000512 8 18 05:21 erp.ibd.hdlk

你会发现,多了一个erp.ibd.hdlk文件,且erp.ibd和erp.ibd.hdlk的inode均为2。
此时,你执行drop table操作

mysql> drop table erp; Query OK, 0 rows affected (0.99 sec)

你会发现,不到1秒就删除了。因为,此时有两个文件名称(erp.ibd和erp.ibd.hdlk),同时指向一个inode.这个时候,执行删除操作,只是把引用给删了,所以非常快。
那么,这时的删除,已经把table从mysql中删除。但是磁盘空间,还没释放,因为还剩一个文件erp.ibd.hdlk。
如何正确的删除erp.ibd.hdlk呢?
如果你没啥经验,一定会回答我,用rm命令来删。这里需要说明的是,在生产环境,直接用rm命令来删大文件,会造成磁盘IO开销飙升,CPU负载过高,是会影响其他程序运行的。
那么,这种时候,就是应该用truncate命令来删,truncate命令在coreutils工具集中。
详情,大家可以去百度一下,有人对rm和truncate命令,专程测试过,truncate命令对磁盘IO,CPU负载几乎无影响。
删除脚本如下

TRUNCATE=http://www.likecs.com/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 ;

从2194G开始,每次缩减10G,停2秒,继续,直到文件只剩10G,最后使用rm命令删除剩余的部分。

其他情况

这里指的是,如果数据库是部署在windows上怎么办。这个问题,我来回答,其实不够专业。因为我出道以来,还没碰到过,生产环境上,mysql是部在windows上的。假设真的碰到了,windows下有一个工具叫mklink,是在windows下创建硬链接锁用,应该能完成类似功能

总结

本文所讲的内容,中小型公司的研发比较容易遇到。因为中小型公司没有专业的DBA,研发童鞋啥都得干。希望大家有所收获吧。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxfww.html