1.前言
在Mysql运维中,有时我们会碰到这样的一个需求,就是一张表基本上是没有用了,我们需要删除它,但是呢?这种表非常大(可能几百个G或者几个T),因此我们直接执行drop table命令进行给它删除时,往往可能会导致数据卡主或者宕机
2.正确操作
- 尽可能地选择Mysql 8.0版本
- 如果低于MySQL8.0版本,请在删除时关闭自适应哈希索引特性,删除完了再打开, 参数:innodb_adaptive_hash_index
- 执行命令drop table之前,先创建对应表空间的硬链接,接着实行drop table ,最后通过命令ionice,或者惹味地、慢慢地删除文件,做到对业务尽可能少地影响
3.具体操作
这里只介绍第三步操作
例如这里有个表t1,该表的大小有2T,
查看表的大小可以通过:show table status like 't1'命令查看字段data_length字段或者直接用du -sh t1
1. 给表t1创建硬链接 ln t1.ibd t1.ibd.hdlk
2. 删除表 drop table t1; 如果创建硬链接后再直接删除表的话,会发现该操作是瞬间完成的。
3. 删除硬链接文件(这里一般不建议用rm -rf删除,在生产环境,直接用rm命令来删大文件,会造成磁盘IO开销飙升,CPU负载过高,是会影响其他程序运行的)
那么,这种时候,就是应该用truncate命令来进行删除。需要说明的是,truncate命令在coreutils工具集中,需要另外安装。
详情,大家可以去百度一下安装教程。另外,网上有流传一些文章,这些文章对rm和truncate命令专程测试过,truncate命令对磁盘IO,CPU负载几乎无影响。
TRUNCATE=/usr/local/bin/truncate
for i in `seq 2194 -10 10 `; do -->这里的2194是用du -sh t1.ibd 查出来的大小
sleep 2
$TRUNCATE -s ${i}G /data/mysql/mytest/t1.ibd.hdlk
done
rm -rf /data/mysql/mytest/t1.ibd.hdlk ; --->这里使用rm -rf 是因为文件比较小了,所以直接删除的话对系统没有什么影响了
以上命令的意思是:从2194G开始,每次缩减10G,停2秒,继续,直到文件只剩10G,最后使用rm命令删除剩余的部分
4.其实对于删除硬链接文件,这里也可以用如下命令进行删除(这个需要在业务低峰期进行操作)
ionice -c 2 -n 6 rm t1.ibd.hdlk