广告
返回顶部
首页 > 资讯 > 数据库 >Innodb中mysql如何快速删除2T的大表
  • 874
分享到

Innodb中mysql如何快速删除2T的大表

2024-04-02 19:04:59 874人浏览 薄情痞子
摘要

假设,你有一个表 erp,如果你直接进行下面的命令 drop table erp 这个时候所有的Mysql的相关进程都会停止,直到 drop结束,mysql才会恢复执行。出现这个情况的原

假设,你有一个表 erp,如果你直接进行下面的命令

drop table erp

这个时候所有的Mysql的相关进程都会停止,直到 drop结束,mysql才会恢复执行。出现这个情况的原因就是因为,在 drop table的时候, innodb维护了一个全局drop完毕锁就释放了。
这意味着,如果在白天,访问量非常大的时候,如果你在不做任何处理措施的情况下,执行了删大表的命令,整个 mysql就挂在那了,在删表期间, QPS会严重下滑,然后产品经理就来找你喝茶了。所以才有了漫画中的一幕, 你可以在晚上十二点,夜深人静的时候再删
当然,有的人不服,可能会说:" 你可以写一个删除表的存储过程,在晚上没啥访问量的时候运行一次就行。"
我内心一惊,细想一下,只能说:"大家还是别抬杠了,还是听我说一下业内通用做法。"

一个假设

先说明一下,在这里有一个前提,mysql开启了 独立表空间,MySQL5.6.7之后默认开启。
也就是在 my.cnf中,有这么一条配置(这些是属于mysql优化的知识,后期给大家介绍)

innodb_file_per_table = 1

查看表空间状态,用下面的命令

mysql> show variables like '%per_table';  
+-----------------------+-------+  | Variable_name         | Value |  
+-----------------------+-------+  | innodb_file_per_table | OFF   |  
+-----------------------+-------+

如果 innodb_file_per_tablevalue值为 OFF,代表采用的是 共享表空间
如果 innodb_file_per_tablevalue值为 ON ,代表采用的是 独立表空间
于是,大家要问我, 独立表空间共享表空间的区别?
共享表空间:某一个数据库的所有的表数据,索引文件全部放在一个文件中,默认这个共享表空间的文件路径在data目录下。 默认的文件名为:ibdata1(此文件,可以扩展成多个)。 注意,在这种方式下,运维超级不方便。你看,所有数据都在一个文件里,要对单表维护,十分不方便。另外,你在做 delete操作的时候,文件内会留下很多间隙,ibdata1文件不会自动收缩。换句话说,使用 共享表空间来存储数据,会遭遇 drop table之后,空间无法释放的问题。

独立表空间:每一个表都以独立方式来部署,每个表都有一个.frm表描述文件,还有一个.ibd文件。
.frm文件:保存了每个表的元数据,包括表结构的定义等,该文件与数据库引擎无关。
.ibd文件:保存了每个表的数据和索引的文件。
注意,在这种方式下,每个表都有自已独立的表空间,这样运维起来方便,可以实现单表在不同数据库之间的移动。另外,在执行 drop table操作的时候,是可以自动回收表空间。在执行 delete操作后,可以通过 alter table TableName engine=innodb可以整理碎片,回收部分表空间。

ps: my.cnf中的 datadir就是用来设置数据存储目录

好了,上面巴拉巴拉了一大堆,我只想说一个 事情:

在绝大部分情况下,运维一定会为mysql选择独立表空间的存储方式,因为采用独立表空间的方式,从性能优化和运维难易角度来说,实在强太多。

所以,我在一开始所提到的前提,mysql需要开启 独立表空间。这个假设,百分九十的情况下是成立的。如果真的遇到了,你们公司的mysql采用的是 共享表空间的情况,请你和你们家的运维谈谈心,问问为啥用 共享表空间

正确姿势

假设,我们有 datadir = /data/mysql/,另外,我们有有一个 database,名为 mytest。在数据库 mytest中,有一个表,名为 erp,执行下列命令

mysql> system ls -l /data/mysql/mytest/

得到下面的输出(我过滤了一下)

-rw-r----- 1 mysql mysql          9023  8 18 05:21 erp.frm-rw-r----- 1 mysql mysql 2356792000512  8 18 05:21 erp.ibd

frmibd的作用,上面介绍过了。现在就是 erp.ibd文件太大,所以删除卡住了。
如何解决这个问题呢?
这里需要利用了linux硬链接的知识,来进行快速删除。下面容我上《鸟哥的私房菜》中的一些内容,
软链接其实大家可以类比理解为windows中的快捷方式,就不多介绍了,主要介绍一下硬链接。
至于这个 硬链接,我简单说一下,不想贴一大堆话过来,看起来太累。
就是对于真正存储的文件来说,有一个
Innodb中mysql如何快速删除2T的大表
然后呢有一个 文件名指向上面的 node Index
Innodb中mysql如何快速删除2T的大表
那么,所谓的 硬链接,就是不止一个 文件名指向 node Index,有好几个 文件名指向 node Index
假设,这会又有一个 文件名指向上面的 node Index,即
Innodb中mysql如何快速删除2T的大表
这个时候,你做了删除 文件名(1)的操作,linux系统检测到,还有一个 文件名(2)指向 node Index,因此并不会真正的把文件删了,而是把 步骤(2)的引用给删了,这步操作非常快,毕竟只是删除引用。于是图就变成了这样
Innodb中mysql如何快速删除2T的大表
接下来,你再做删除 文件名(2)的操作,linux系统检测到,没有其他 文件名指向该 node Index,就会删除真正的存储文件,这步操作,是删真正的文件,所以比较慢。

OK,我们用的就是上面的原理。
先给 erp.ibd建立一个硬链接,利用 ln命令

mysql> system ln /data/mysql/mytest/erp.ibd /data/mysql/mytest/erp.ibd.hdlk

此时,文件目录如下所示

-rw-r----- 1 mysql mysql          9023  8 18 05:21 erp.frm-rw-r----- 2 mysql mysql 2356792000512  8 18 05:21 erp.ibd-rw-r----- 2 mysql mysql 2356792000512  8 18 05:21 erp.ibd.hdlk

你会发现,多了一个 erp.ibd.hdlk文件,且 erp.ibderp.ibd.hdlk的inode均为2。
此时,你执行 drop table操作

mysql> drop table erp;Query OK, 0 rows affected (0.99 sec)

你会发现,不到1秒就删除了。因为,此时有两个文件名称( erp.ibderp.ibd.hdlk),同时指向一个inode.这个时候,执行删除操作,只是把引用给删了,所以非常快。
那么,这时的删除,已经把table从mysql中删除。但是磁盘空间,还没释放,因为还剩一个文件 erp.ibd.hdlk

如何正确的删除 erp.ibd.hdlk呢?
如果你没啥经验,一定会回答我,用 rm命令来删。这里需要说明的是,在生产环境,直接用 rm命令来删大文件,会造成磁盘io开销飙升,CPU负载过高,是会影响其他程序运行的。
那么,这种时候,就是应该用 truncate命令来删, truncate命令在 coreutils工具集中。
详情,大家可以去百度一下,有人对 rmtruncate命令,专程测试过, truncate命令对磁盘 IO,CPU负载几乎无影响。
删除脚本如下

TRUNCATE=/usr/local/bin/truncatefor i in `seq 2194 -10 10 `; 
do 
  sleep 2
  $TRUNCATE -s ${i}G /data/mysql/mytest/erp.ibd.hdlk 
done
rm -rf /data/mysql/mytest/erp.ibd.hdlk ;

从2194G开始,每次缩减10G,停2秒,继续,直到文件只剩10G,最后使用 rm命令删除剩余的部分。

您可能感兴趣的文档:

--结束END--

本文标题: Innodb中mysql如何快速删除2T的大表

本文链接: https://www.lsjlt.com/news/48530.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Innodb中mysql如何快速删除2T的大表
    假设,你有一个表 erp,如果你直接进行下面的命令 drop table erp 这个时候所有的mysql的相关进程都会停止,直到 drop结束,mysql才会恢复执行。出现这个情况的原...
    99+
    2022-10-18
  • Innodb中mysql如何删除2T的大表
    这篇文章给大家分享的是有关Innodb中mysql如何删除2T的大表的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。假设,你有一个表erp,如果你直接进行下面的命令drop&nbs...
    99+
    2022-10-18
  • MySQL 超大表快速删除方式
    目录mysql 超大表快速删除表创建一个硬链接执行表删除执行文件删除MySQL快速清空大表数据       清空表数据的五种方式清空表数据语法MySQL 超大表快速删除 MySQL...
    99+
    2022-08-24
  • MySQL超大表快速删除方式
    目录MySQL 超大表快速删除表创建一个硬链接执行表删除执行文件删除MySQL快速清空大表数据       清空表数据的五种方式清空表数据语法...
    99+
    2022-11-13
  • SQL Server大表如何快速删除数据
      在SQL Server中,如何快速删除大表中的数据呢?  回答这个问题前,我们必须弄清楚上下文环境和以及结合实际、具体的需求,不同场景有不同的应对方法。     1: 整张表的数据全部删除     如果是整张表的数据全部清空、...
    99+
    2018-02-07
    SQL Server大表如何快速删除数据
  • linux中如何对大于2T的磁盘快速分区
    这篇文章主要介绍linux中如何对大于2T的磁盘快速分区,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在生产环境中,我们会遇到分区大于2T的磁盘(比如:添加一个10TB的存储),由于MBR分区表只支持2T磁盘,所以大...
    99+
    2023-06-13
  • linux如何快速删除大量文件
    在Linux中,可以使用以下方法快速删除大量文件:1. 使用通配符删除:如果要删除特定文件类型的大量文件,可以使用通配符来匹配文件名...
    99+
    2023-09-26
    linux
  • oracle如何快速删除大量数据
    要在Oracle中快速删除大量数据,可以尝试以下方法:1. 使用TRUNCATE语句:TRUNCATE语句可以快速删除表中的所有数据...
    99+
    2023-10-08
    oracle
  • 如何删除 MySQL 中的表?
    简介 MySQL 是一种流行的开源关系数据库管理系统 (RDBMS),广泛用于开发基于 Web 的应用程序。它最初由 MySQL AB 开发,现在归 Oracle Corporation 所有。 MySQL以其可靠性、可扩展性和易用性而闻...
    99+
    2023-10-22
  • 如何快速删除指定Vista注册表键值
    本篇文章给大家分享的是有关如何快速删除指定Vista注册表键值,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。无论是对Vista还是Windows 7而言,在优化和破解时,注册表...
    99+
    2023-06-14
  • Mysql在大表中删除大量数据的优化
    假设有一个表有3000万条记录,需要在业务不停止的情况下删除其中status=1的所有记录,差不多有600万条。 如果直接使用delete from tab_name where status=1; 会触发lock wa...
    99+
    2023-09-01
    mysql 数据库 sql
  • 浅谈MySQL如何优雅的做大表删除
    随着时间的推移或者业务量的增长,数据库空间使用率也不断的呈稳定上升状态,当数据库空间将要达到瓶颈的时候,可能我们才会发现数据库有那么一两张的超级大表!他们堆积了从业务开始到现在的全部数据,但是90%的数据都是没有业务...
    99+
    2022-05-18
    MySQL 大表删除
  • MySQL:如何快速的查看Innodb数据文件
    欢迎关注我的《深入理解MySQL...
    99+
    2022-10-18
  • MySQL如何优雅的删除大表实例详解
    前言 删除表,大家下意识想到的命令可能是直接使用DROP TABLE "表名",这是初生牛犊的做法,因为当要删除的表达空间到几十G,甚至是几百G的表时候。这样一条命令下去,MySQL可能就直接夯住了,外在表现就是Q...
    99+
    2022-05-11
    mysql 删除大表 mysql删除表的字段 mysql删除表内的数据语句
  • MySQL如何删除表中的数据
    目录如何删除表中的数据一、delete删除表中的数据二、drop删除表中的数据三、truncate删除表中的数据删除表数据但不删除表结构SQL语句下面是两种SQL语句如何删除表中的数据 mysql删除表中的数据...
    99+
    2022-11-09
  • MySQL中怎么有效的删除一个大表
    MySQL中怎么有效的删除一个大表,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在MySQL中如何有效的删除一个大表? 在DR...
    99+
    2022-10-18
  • php中如何删除mysql表格
    这篇文章主要介绍php中如何删除mysql表格,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php删除mysql表格的方法:首先通过“mysql_connect”函数连接数据库;然后使用“mysql_query()”...
    99+
    2023-06-15
  • mysql如何删除数据库中的表
    小编给大家分享一下mysql如何删除数据库中的表,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!基本语法当需要删除一个表的时候,可...
    99+
    2022-10-18
  • Linux 如何快速找到被删除的文件?
        日常运维过程中,我们经常需要处理磁盘空间问题,当接到告警后,第一时间会去找那些大文件,一般比如 Centos,可能大文件就是 /var/log/messages。    但有...
    99+
    2022-10-24
  • 如何快速删除电脑的temp文件夹
    这篇文章给大家分享的是有关如何快速删除电脑的temp文件夹的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是temp文件夹?其实就是专门用来存放缓存文件的文件夹,如果想要减少电脑中被占用的进程的话,就可以将te...
    99+
    2023-06-27
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作