zoukankan      html  css  js  c++  java
  • 在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 删除即可。

  • 相关阅读:
    字串符相关 split() 字串符分隔 substring() 提取字符串 substr()提取指定数目的字符 parseInt() 函数可解析一个字符串,并返回一个整数。
    表单select相关
    createElement() 创建元素 appendChild()添加元素
    css
    docker基本操作
    redis安装及基本操作
    MongoDB安装 基本操作
    printf输出参数的顺序
    静态库与动态库的制作
    linux下ls、split、readlink、iconv命令
  • 原文地址:https://www.cnblogs.com/cmgg/p/11511711.html
Copyright © 2011-2022 走看看