zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    后台管理UI
    14.6.3.2 Configuring Multiple Buffer Pool Instances 配置多个Buffer Poll 实例:
    14.6.3.1 The InnoDB Buffer Pool
    innodb_buffer_pool_instances and innodb_buffer_pool_size的关系
    猪肉都被绑上了“家族标签”,大数据已波及到农牧业!
    14.6.2 Configuring InnoDB for Read-Only Operation
    jquery EasyUI datagrid重新加载传参问题
    分布式系统事务一致性解决方案
    面试题整理
    dump iot表
  • 原文地址:https://www.cnblogs.com/zmc60/p/15192173.html
Copyright © 2011-2022 走看看