• 在mysql 上如何在不影响生产的情况下删除一个大表


    mysql 中常用的删除的方法基本上有下面三种方式:

    1、delete  

      一般用于删除少量表中的数据

      优化建议,一定要加上where 条件,并且where条件的列上 一定要有主键或者索引。否则会出现全表扫描的情况

    2、drop   

      直接将表删除,包括表的数据和表的定义。

      这种操作,MySQL 会加上一个全局锁,删除期间会阻塞操作,所以对大表来说这样操作一定会对生产造成很大的影响

      优化建议,大表不要使用drop  table 这种方式,可以考虑 truncate  table的方式

    3、truncate  

      这种方式要优于 drop table,风险较之 drop 要小一点,不需要加锁,所以删除表的速度很快

      注意事项:这种方式虽然很快,但是需要考虑删除大文件对IO产生的影响

    使用下面的骚操作更安全吆!

    以上三种方式的各有适用的场景,下面介绍一种删除大表又同时能够规避删除大文件带来 IO 过载风险的方式。

    1、对表的 idb 文件创建硬链接,这样实际存储的文件上有两个inode指向这个文件。当文件有两个及以上硬连接时,对文件删除,操作系统只会删除这个硬链接,而不是实际上的文件

    2、drop   table   table_name;这样实际上删除的是ibd 文件的硬链接,速度会非常快,不用考虑锁操作

    3、这样 drop 掉表之后,数据文件实际上还是存在的,所以我们还要删除文件系统中的文件

    4、使用操作系统的 truncate 工具可以指定将文件削减到指定大小,所以我们可以使用这个工具控制删除文件的速度,也就是说可以控制 IO 的占用

      truncate 工具使用实例:

      

    for i in  `seq    300 -10 10`;
    do
     sleep 2
     truncate -s ${i}G /data/test.ibd.hardlk
    done
    rm -rf /data/mysql/mytest/erp.ibd.hardlk
    上面代码就是讲一个 300G的文件每次减小 10G,间隔 2秒,最后剩余 10G 用rm -rf 删除即可。

  • 相关阅读:
    Linq 实例
    VS的无用文件
    我在vs文本编辑中常用的快捷键----常更新
    EF+MVC学习中的不理解的问题
    Lambda表达式
    Linq学习(主要参考linq之路)----2LINQ方法语法
    WPF编译时提示“...不包含适合于入口点的静态‘Main’方法 ...”
    SQL
    SQL Server
    sql 判断表是否存在
  • 原文地址:https://www.cnblogs.com/cmgg/p/11511711.html
Copyright © 2020-2023  润新知