广告
返回顶部
首页 > 资讯 > 数据库 >MySQL中怎么有效的删除一个大表
  • 754
分享到

MySQL中怎么有效的删除一个大表

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

Mysql中怎么有效的删除一个大表,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在MySQL中如何有效的删除一个大表? 在DR

Mysql中怎么有效的删除一个大表,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

在MySQL中如何有效的删除一个大表?

在DROP TABLE 过程中,所有操作都会被HANG住。

这是因为INNODB会维护一个全局独占(在table cache上面),直到DROP TABLE完成才释放。
在我们常用的ext3,ext4,ntfs文件系统,要删除一个大文件(几十G,甚至几百G)还是需要点时间的。
下面我们介绍一个快速DROP table 的方法; 不管多大的表,INNODB 都可以很快返回,表删除完成;
实现:巧用LINK(硬链接)

实测:

root@127.0.0.1 : test 21:38:00> show table status like ‘tt’ \G
*************************** 1. row ***************************
Name: tt
Engine: InnoDB
Version: 10
Row_fORMat: Compact
Rows: 151789128
Avg_row_length: 72
Data_length: 11011096576
Max_data_length: 0
Index_length: 5206179840
Data_free: 7340032
Auto_increment: NULL
Create_time: 2011-05-18 14:55:08
Update_time: NULL
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.22 sec)

root@127.0.0.1 : test 21:39:34> drop table tt ;
Query OK, 0 rows affected (25.01 sec)

删除一个11G的表用时25秒左右(硬件不同,时间不同);

下面我们来对另一个更大的表进行删除;
但之前,我们需要对这个表的数据文件做一个硬连接:

root@ # ln stock.ibd stock.id.hdlk
root@ # ls stock.* -l
-rw-rw—- 1 mysql mysql        9196 Apr 14 23:03 stock.frm
-rw-r–r– 2 mysql mysql 19096666112 Apr 15 09:55 stock.ibd
-rw-r–r– 2 mysql mysql 19096666112 Apr 15 09:55 stock.id.hdlk

你会发现stock.ibd的InodeS属性变成了2;

下面我们继续来删表。

root@127.0.0.1 : test 21:44:37> show table status like ‘stock’ \G
*************************** 1. row ***************************
Name: stock
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 49916863
Avg_row_length: 356
Data_length: 17799577600
Max_data_length: 0
Index_length: 1025507328
Data_free: 4194304
Auto_increment: NULL
Create_time: 2011-05-18 14:55:08
Update_time: NULL
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.23 sec)

root@127.0.0.1 : test 21:39:34> drop table stock ;
Query OK, 0 rows affected (0.99 sec)

1秒不到就删除完成; 也就是DROP TABLE不用再HANG这么久了。
但table是删除了,数据文件还在,所以你还需要最后数据文件给删除。

root # ll
total 19096666112
-rw-r–r– 2 mysql mysql 19096666112 Apr 15 09:55 stock.id.hdlk
root # rm stock.id.hdlk
虽然DROP TABLE 多绕了几步。(如果你有一个比较可靠的自运行程序(自动为大表建立硬链接,并会自动删除过期的硬链接文件),就会显得不那么繁琐。)
这样做能大大减少MYSQL HANG住的时间; 相信还是值得的。

至于原理: 就是利用OS HARD LINK的原理,
当多个文件名同时指向同一个INODE时,这个INODE的引用数N>1, 删除其中任何一个文件名都会很快.
因为其直接的物理文件块没有被删除.只是删除了一个指针而已;
当INODE的引用数N=1时, 删除文件需要去把这个文件相关的所有数据块清除,所以会比较耗时;



【问题隐患】

    由于业务需求不断变化,可能在DB中存在超大表占用空间或影响性能;对这些表的处理操作,容易造成MySQL性能急剧下降,IO性能占用严重等。先前有在生产库drop table造成服务不可用;rm 大文件造成io跑满,引发应用容灾;对大表的操作越轻柔越好。

    【解决办法】

    1.通过硬链接减少mysql DDL时间,加快锁释放

    2.通过truncate分段删除文件,避免IO hang

    【生产案例】

    某对mysql主备,主库写入较大时发现空间不足,需要紧急清理废弃大表,但不能影响应用访问响应:

    $ll /u01/mysql/data/test/tmp_large.ibd

    -rw-r-– 1 mysql dba 289591525376 Mar 30  2012 tmp_large.ibd

    270GB的大表删除变更过程如下:

    #(备库先做灰度)

    ln tmp_large.ibd /u01/bak/tmp_tbl.ibd  #建立硬链接

    -rw-r-– 2 mysql dba 289591525376 Mar 30  2012 tmp_large.ibd

    set session sql_log_bin=0;

    #不计入bin log节省性能,并且防止主备不一致

    desc test.tmp_large;

    drop table test.tmp_large;

    Query OK, 0 rows affected (10.46 sec)  mysql -uroot -e “start slave;”

    cd /u01/bak;screen -S weixi_drop_table  for i in `seq 270 -1 1 ` ;

    do sleep 2;truncate -s ${i}G tmp_tbl.ibd;done

    rm -rf tmp_tbl.ibd

    【性能比较】

    中间ctrl-C一次,可以看到truncate前后io的对比情况,基本上影响不大

    文件大小也成功更新

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网数据库频道,感谢您对编程网的支持。

您可能感兴趣的文档:

--结束END--

本文标题: MySQL中怎么有效的删除一个大表

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

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

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

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

下载Word文档
猜你喜欢
  • MySQL中怎么有效的删除一个大表
    MySQL中怎么有效的删除一个大表,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在MySQL中如何有效的删除一个大表? 在DR...
    99+
    2022-10-18
  • mysql中怎么删除一个表
    mysql中删除一个表的方法:1.打开运行窗口;2.输入“cmd”打开命令行窗口;3.输入“mysql -u root -p”命令;4.再输入密码进入mysql控制台;5.通过“DROP TABLE+表名;”的命令删除一个表即可。...
    99+
    2022-10-05
  • Mysql中怎么删除大表
    本篇文章给大家分享的是有关Mysql中怎么删除大表,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。    【解决办...
    99+
    2022-10-18
  • MySQL怎么删除表中一行
    小编给大家分享一下MySQL怎么删除表中一行,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!Sql语句中怎么删除表中一行数据,一般情况只需要加一个条件就可以完成删除一行的操作。首先你要确定能够唯...
    99+
    2022-10-18
  • linux中怎么删除一个大文件
    这篇文章主要为大家展示了“linux中怎么删除一个大文件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“linux中怎么删除一个大文件”这篇文章吧。删除一个大文件...
    99+
    2022-10-19
  • 怎么在MySql中删除表中的一行
    这期内容当中小编将会给大家带来有关怎么在MySql中删除表中的一行,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。DELETE FROM 表名 WHERE ...
    99+
    2022-10-18
  • MySql怎么批量删除多个表
    项目场景: 使用Navicat工具直接在界面中删除,只能单张表删除,不能多选。 解决方案: 我们可以通过MySQL的语句来批量删除多个表,其中test替换成你要查询的数据库名字。 生成删除某个数据库下所有的表SQL -- 查询构建批...
    99+
    2023-09-15
    mysql 数据库 批量删除 多表删除 drop
  • Mysql怎么删除数据库表中的某一列
    本篇内容主要讲解“Mysql怎么删除数据库表中的某一列”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Mysql怎么删除数据库表中的某一列”吧!删除数据库表中的某一列删除某一字段的值update&...
    99+
    2023-07-02
  • 批量删除mysql一个库所有数据表方法
    批量删除mysql一个库所有数据表方法删除表的命令drop table 表名;如果有100张表,手工执行100次,想想就崩溃。下面提供一个使用information_schema库的方案来批量删除...
    99+
    2022-10-18
  • Innodb中mysql如何删除2T的大表
    这篇文章给大家分享的是有关Innodb中mysql如何删除2T的大表的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。假设,你有一个表erp,如果你直接进行下面的命令drop&nbs...
    99+
    2022-10-18
  • sql语言中删除一个表的命令怎么写
    小编给大家分享一下sql语言中删除一个表的命令怎么写,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!sql语言中,删除一个表的命令...
    99+
    2022-10-18
  • Mysql在大表中删除大量数据的优化
    假设有一个表有3000万条记录,需要在业务不停止的情况下删除其中status=1的所有记录,差不多有600万条。 如果直接使用delete from tab_name where status=1; 会触发lock wa...
    99+
    2023-09-01
    mysql 数据库 sql
  • MySQL怎么创建多个表的更新与删除
    本篇内容主要讲解“MySQL怎么创建多个表的更新与删除”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL怎么创建多个表的更新与删除”吧!1.涉及多个表的更...
    99+
    2022-10-19
  • 怎么删除MySQL的注册表
    这篇文章主要介绍了怎么删除MySQL的注册表的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么删除MySQL的注册表文章都会有所收获,下面我们一起来看看吧。 ...
    99+
    2023-04-28
    mysql
  • MySQL中怎么删除多表数据
    MySQL中怎么删除多表数据,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。  MySQL删除多表数据有哪些问题  1、delete...
    99+
    2022-10-18
  • Innodb中mysql如何快速删除2T的大表
    假设,你有一个表 erp,如果你直接进行下面的命令 drop table erp 这个时候所有的mysql的相关进程都会停止,直到 drop结束,mysql才会恢复执行。出现这个情况的原...
    99+
    2022-10-18
  • mysql删除表中某一字段的方法
    这篇文章给大家分享的是有关mysql删除表中某一字段的方法的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。mysql删除表中的某一字段的方法:可以通过执行【alter table ...
    99+
    2022-10-18
  • 如何删除mysql表中的一条数据
    要删除MySQL表中的一条数据,可以使用DELETE语句。以下是删除表中一条数据的基本语法:```DELETE FROM 表...
    99+
    2023-08-09
    mysql
  • mysql删除库中所有表的方法
    小编给大家分享一下mysql删除库中所有表的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!mysql删除库中的所有表的方法:...
    99+
    2022-10-18
  • 怎么在mongodb中删除一个用户
    在mongodb中删除用户的方法:1.启动mongodb;2.登录mongodb数据库;3.使用数据库;4.查看所有用户;5.执行命令删除指定用户;具体步骤如下:首先,在命令行中启动mongodb服务;net start MongoDBmo...
    99+
    2022-10-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作