返回顶部
首页 > 资讯 > 数据库 >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://lsjlt.com/news/56891.html(转载时请注明来源链接)

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

猜你喜欢
  • MySQL中怎么有效的删除一个大表
    MySQL中怎么有效的删除一个大表,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在MySQL中如何有效的删除一个大表? 在DR...
    99+
    2024-04-02
  • mysql中怎么删除一个表
    mysql中删除一个表的方法:1.打开运行窗口;2.输入“cmd”打开命令行窗口;3.输入“mysql -u root -p”命令;4.再输入密码进入mysql控制台;5.通过“DROP TABLE+表名;”的命令删除一个表即可。...
    99+
    2024-04-02
  • Mysql中怎么删除大表
    本篇文章给大家分享的是有关Mysql中怎么删除大表,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。    【解决办...
    99+
    2024-04-02
  • mysql中怎么删除表中一个数据
    mysql 中使用 delete 语句删除表一行数据,语法为 delete from table_name where condition;步骤包括:指定要删除数据的...
    99+
    2024-05-01
    mysql
  • mysql中删除一个表的命令
    mysql 中删除表命令:drop table。语法:drop table table_name。用法:1. 连接数据库;2. 输入命令:drop table table_name;3....
    99+
    2024-04-29
    mysql
  • MySQL怎么删除表中一行
    小编给大家分享一下MySQL怎么删除表中一行,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!Sql语句中怎么删除表中一行数据,一般情况只需要加一个条件就可以完成删除一行的操作。首先你要确定能够唯...
    99+
    2024-04-02
  • mysql中删除一个表的命令是
    mysql 中删除表使用 drop table 命令。该命令会永久删除表及其数据,使用前应备份数据。删除表之前,需删除外键约束和引用该表的其他对象。 MySQL 中删除表 DROP T...
    99+
    2024-05-02
    mysql
  • linux中怎么删除一个大文件
    这篇文章主要为大家展示了“linux中怎么删除一个大文件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“linux中怎么删除一个大文件”这篇文章吧。删除一个大文件...
    99+
    2024-04-02
  • 怎么在MySql中删除表中的一行
    这期内容当中小编将会给大家带来有关怎么在MySql中删除表中的一行,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。DELETE FROM 表名 WHERE ...
    99+
    2024-04-02
  • oracle中怎么删除一个表的字段
    在 oracle 中删除表的字段需要以下步骤:确定要删除的字段。使用 alter table table_name drop column column_name 语句。提交更改。删除字...
    99+
    2024-05-03
    oracle
  • MySQL怎么删除表中个别数据
    要删除表中的个别数据,可以使用DELETE语句。语法如下: DELETE FROM table_name WHERE...
    99+
    2024-05-21
    MySQL
  • mysql怎么删除所有表
    使用 mysql 删除所有表:1. 连接到数据库。2. 执行 drop table 命令,指定要删除的表名称。3. 运行 show tables 命令确认删除。 如何使用 MySQL ...
    99+
    2024-05-22
    mysql
  • oracle怎么删除一个表的主键
    要删除一个表的主键,可以使用以下步骤: 首先,使用以下语法查看表的主键名称: SELECT constraint_name...
    99+
    2024-03-12
    oracle
  • sql中删除一个表的语句
    sql 中删除表的语句是 drop table table_name,其中 table_name 是要删除的表的名称。例如,drop table customers 将删除名为 "cus...
    99+
    2024-05-08
  • MySql怎么批量删除多个表
    项目场景: 使用Navicat工具直接在界面中删除,只能单张表删除,不能多选。 解决方案: 我们可以通过MySQL的语句来批量删除多个表,其中test替换成你要查询的数据库名字。 生成删除某个数据库下所有的表SQL -- 查询构建批...
    99+
    2023-09-15
    mysql 数据库 批量删除 多表删除 drop
  • mysql怎么删除整个表数据
    要删除整个表数据,可以使用DELETE语句,语法如下: DELETE FROM table_name; 其中table_n...
    99+
    2024-05-22
    MySQL
  • mysql怎么删除表中某个字段的数据
    要删除表中某个字段的数据,可以使用DELETE语句。下面是一个示例: 假设我们有一个名为users的表,其中有一个字段名为e...
    99+
    2024-04-09
    mysql
  • Innodb中mysql如何删除2T的大表
    这篇文章给大家分享的是有关Innodb中mysql如何删除2T的大表的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。假设,你有一个表erp,如果你直接进行下面的命令drop&nbs...
    99+
    2024-04-02
  • Mysql怎么删除数据库表中的某一列
    本篇内容主要讲解“Mysql怎么删除数据库表中的某一列”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Mysql怎么删除数据库表中的某一列”吧!删除数据库表中的某一列删除某一字段的值update&...
    99+
    2023-07-02
  • sql语言中删除一个表的命令怎么写
    小编给大家分享一下sql语言中删除一个表的命令怎么写,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!sql语言中,删除一个表的命令...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作