45.如何优雅的删除一张大表?

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
原文地址:https://www.cnblogs.com/zmc60/p/15192173.html