• 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
  • 相关阅读:
    每日一练ACM 2019.0417
    每日一练ACM 2019.0416
    每日一练ACM 2019.04.13
    每日一练ACM 2019.04.14
    创建线程的方法
    类和对象的概念
    接口的概念
    Mysql添加取消自增属性
    SpringMVC不支持PUT表单提交
    SSM框架整合报org.springframework.beans.factory.NoSuchBeanDefinitionException
  • 原文地址:https://www.cnblogs.com/zmc60/p/15192173.html
Copyright © 2020-2023  润新知