广告
返回顶部
首页 > 资讯 > 数据库 >MySQL大表删除问题的解决方法
  • 322
分享到

MySQL大表删除问题的解决方法

2024-04-02 19:04:59 322人浏览 安东尼
摘要

这篇文章主要讲解了“Mysql大表删除问题的解决方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql大表删除问题的解决方法”吧!一、表删除问题汇总

这篇文章主要讲解了“Mysql大表删除问题的解决方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql大表删除问题的解决方法”吧!

一、表删除问题汇总

(1)、mysql如何删除表

(2)、删除大表如何优化、解决

二、删除表原理与优化

删除表原理上分为2部分

<1>buffer pool页面清除过程

在删除表的时候,Innodb 会将文件在buffer pool中对应的页面清除。对于删除表的页面清除,只需要将页面从flash队列中删除即可,而不需要去做flush操作,减小对系统的冲击。

问题1:如果buffer pool很大,或者是在buffer pool中有很多需要被flush的页面,那么此时遍历扫描页面时就会占用比较长的时间,导致其他事务在用到相应buffer pool实例时被阻塞,从而影响整个数据库性能。

优化:涉及源码,优化困难

<2>删除ibd磁盘文件的过程

问题1:表文件过大,直接删除会瞬时占用大量io,造成IO阻塞

优化:使用硬链

原理:一个磁盘上的文件,可以由多个文件系统的文件引用,这多个文件的完全相同的,都指向同一个磁盘上的文件,当我们删除任何一个文件的时候,都不会影响真实的文件,只是会将其引用数据减1,只有当被引用数目变为1的时候,再次删除文件,才会真正被删除。删除时,这两种情况的区别很明显,一个是在减少被引用数目,一个是真正做IO来删除它

操作

ln /data/mydata/my3306/testdb/table1.ibd     /data/mydata/my3306/testdb/table1.ibd.hdlk

ls -lh    /data/mydata/my3306/testdb 查看文件引用数(应该为2)


问题2:做完硬链,真正的大文件删除问题,直接rm 删除,会造成IO瞬时高峰

优化:使用工具多次少量的删除

原理:利用系统文件的truncate,脚本工具为slowrm

三、slowrm

3.1、需求

缓解大表删除带来的IO瞬间压力

3.2、slowrm功能

<1>将大文件按照指定速度进行删除,降低IO瞬间压力

3.3、slowrm实现

3.3.1、背景描述

先简要介绍下slowrm工具开发的背景。

我们曾在《linux_mysql_DROP_TABLE操作步骤》中提到,对于大表的删除,应当先建立硬链,drop table后,再删除表数据文件。

对于大表的数据文件,可能会达到10G,也可以是100G级别,甚至更大。在linux下,这样的大文件在使用rm时,无疑会导致IO资源被强行占用,表现为硬盘的io_util基本上是100%左右,会对其它IO操作造成阻塞。更可怕的是,rm单个文件的过程是个原子过程,无法使用kill或kill -9来杀死rm进程,只能乖乖的等待它结束。

如果是在繁忙的线上服务所在的机器上做这样的删除操作,很可能会对线上服务产生影响。因此需要有一个平滑删除大文件的方案。而这样的方案最终是与数据库无关的,而是一个通用方案。

3.3.2、设计思路


对于删除大文件的操作,采用每次将文件截断一点,分多次截断,最终直至文件大小被截断为0。

如下面的过程示例:

block_size = 1024576bytes;

while file_size >=block_size

begin

ftruncate (file, new_size);

(其中(old_size -new_size = block_size)

sleep 0.05 seconds;

end

ftruncate(file, 0);

因为既然rm一个文件是不可中断的,那么我们就将删除过程打散,分多次删除一个,每次删除一点。幸好现在的linux提供了支持该思路的api,truncate/ftruncate函数,可以对文件截断至任意长度()。经过测试,发现每次截断一点,分多次截断,最终直至文件大小被截断为0,这样删除大文件需要更多的时间,但是对磁盘IO的影响却大大减小了。因此采用该思路是可行的。


3.4、slowrm使用

slowrm  [OPTIONS]  FILES
对删除文件的方式与rm类似。

3.4.1、选项及参数

该工具的使用主要涉及两个参数:

 -b   #size

每次需要截断掉的文件大小,单位为字节,参数值需要是整数,默认值4096 * 256Bytes( = 1MB);

 -s   #seconds

每两次截断操作之间的时间间隔,单位为秒,参数值可以为小数。这两个参数用以控制删除速度,及删除过程对磁盘IO的压力。默认值0.1 second

 -h, --help

查看帮助信息。


直接输入slowrm,或输入slowrm –h或slowrm --help可以查看帮助。

MySQL大表删除问题的解决方法

3.4.2、删除速度

     实际上,可以看出,由#size * #seconds = #ioBPS Bytes/s,

即可计算得出每秒该操作消耗的IO吞吐量(字节数),也即大约每秒文件所减小的字节数。

    可以看到默认删除速度是: 4096 * 256Bytes / 0.1second= 10MB/s,被删除的文件每秒钟可以减少10MB。

用户可以通过上述两个参数来控制删除的速度以及对磁盘IO的压力。

3.5、slowrm与rm对比

使用方式    
slowrm     rm     备注
提示是否删除    
默认支持     rm -i     默认slowrm会询问用户是否删除每一个指定文件
删除单个文件
slowrm file     rm file     相同
删除多个文件  显示指定文件     slowrm file1 file2 file3 rm file1 file2 file3
使用通配符     slowrm file*     rm file*
删除硬链  硬链数大于1 删除硬链同rm     删除硬链 实际执行的就是unlink
硬链数等于1    

低速删除文件    

全速删除文件     实质上在判断硬链数上逻辑是一样的,只是最后一个硬链的删除方式不同
强制删除文件
slowrm -f
slowrm --force    
rm -f
rm --force    
相同
控制删除速度 控制速度 slowrm -s 0.1 -b 262144 file (2MB/s) 不支持
默认速度     slowrm file 
对应参数-s 0.1 -b 1048576(10MB/s)
一般使用默认参数即可
删除其他类型文件 目录,软链     不支持

递归删除目录
rm -rf 目录

可见,一般情况下,还是使用rm删除即可。

在需要低IO负载删除大文件时,可以使用slowrm。

slowrm对于rm是起到一个补充的作用。

3.6、注意

3.6.1、删除文件类型

目前,该工具只支持删除具体常规文件,无法对目录进行递归删除,但可以支持对多个文件进行删除,如slowrm *.logmysql.err.2014*

也无法对软链接,文件等进行删除。

3.6.2、硬链的删除

如果slowrm要删除的文件的硬链接数目大于1,那么就会直接删除该硬链;

如果待删除的文件硬链数目等于1,那么会按照平滑删除的方式,逐步截断该文件。



3.7、测试使用

制造大文件

MySQL大表删除问题的解决方法

 开始删除

MySQL大表删除问题的解决方法

大小情况

MySQL大表删除问题的解决方法

压力情况

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await  svctm  %util

MySQL大表删除问题的解决方法


3.8、日常使用

1、开启一个screen

screen -S slowrm_test


2、开始删除文件

slowrm file 

或者指定速度,正常默认即可(10MB/s)

感谢各位的阅读,以上就是“MySQL大表删除问题的解决方法”的内容了,经过本文的学习后,相信大家对MySQL大表删除问题的解决方法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL大表删除问题的解决方法

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

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

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

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

下载Word文档
猜你喜欢
  • MySQL大表删除问题的解决方法
    这篇文章主要讲解了“MySQL大表删除问题的解决方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL大表删除问题的解决方法”吧!一、表删除问题汇总 ...
    99+
    2022-10-18
  • Mysql无法删除大表导致DB无法删除的解决方法
    这篇文章主要介绍“Mysql无法删除大表导致DB无法删除的解决方法”,在日常操作中,相信很多人在Mysql无法删除大表导致DB无法删除的解决方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,...
    99+
    2022-10-18
  • 删除MySQL超大表的具体方法
    本文主要给大家简单讲讲删除MySQL超大表的具体方法,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望删除MySQL超大表的具体方法这篇文章可以给大家带来一些实...
    99+
    2022-10-18
  • 解决mysql删除用户 bug的问题
    作者在使用mysql添加用户的时候,发现用户名给我写错了 强迫症的我,必须要改过来,但是发现删除用户的时候,命令是成功的 但是在此创建同名用户的时候,会报错,网上查了很多,说这是mysql的官方bug,不知道是作者水...
    99+
    2022-05-23
    mysql 删除用户
  • mysql无法删除表如何解决
    本篇内容主要讲解“mysql无法删除表如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql无法删除表如何解决”吧! my...
    99+
    2023-02-14
    mysql
  • MySQL大表清空和删除正确方法
    MySQL大表清空和删除正确方法 1 清空大表 1.1 truncate 删除表中的数据的方法有delete,truncate, 其中TRUNCATE TABLE用于删除表中的所有行,而不记录单个行删除操作...
    99+
    2022-10-18
  • hbase删除表报错的解决方法
    hbase建表时,如果snappy或者其他压缩没有安装好,在建表时会出现挂起的状态,并且这张表也删除不掉,还会给集群带来影响,最明显的影响是无法平衡,下面是报错的现状,和解决方法: 详细内容请参考:http...
    99+
    2022-10-18
  • 如何解决mysql删除用户的bug问题
    这篇文章将为大家详细讲解有关如何解决mysql删除用户的bug问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。删除了user的用户之后 无法再次创造相同的用户名在mysql 数据库中有一张user表,可...
    99+
    2023-06-14
  • mysql删除操作其实是假删除问题怎么解决
    本篇内容介绍了“mysql删除操作其实是假删除问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!mysql删除操作其实是假删除在 I...
    99+
    2023-07-06
  • mysql 大表批量删除大量数据的实现方法
    问题参考自:https://www.zhihu.com/question/440066129/answer/1685329456 ,mysql中,一张表里有3亿数据,未分表,其中一个字段是企业类型,企业类型是一般企业...
    99+
    2022-05-11
    mysql 大表批量删除 mysql 大表批量
  • 解决Windows下删除文件提示无法删除问题
      我们在平时的电脑操作过程中,有时会碰到想要删除某个文件时,系统却提示无法删除(如图1),在切换到DOS状态下或者是在安全模式中虽然可以删除,但是这样操作起来却有点麻烦。   图1 无法删除   我们不妨想一想,用一...
    99+
    2023-06-03
    windows 删除文件 问题 文件
  • MySql中删除数据表的方法详解
    目录定义:1 删除一个或多个没有被其他表关联的数据表1.1 新建一张表1.2 执行删除命令1.3 结果检查2 删除被其他表关联的主表2.1 创建两张具有关联关系的表2.2 执行删除DROP TABLE命令2.3 取消外键...
    99+
    2022-08-09
    mysql怎么删除数据库中的表 mysql删除数据表的方法 MySQL删除数据表
  • mysql删除注册表的方法
    这篇文章主要介绍mysql删除注册表的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!-----------------------------------------------...
    99+
    2022-10-18
  • mysql删除数据表的方法
    这篇文章主要介绍mysql删除数据表的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在mysql中可以使用“DROP TABLE”来删除一个或多个数据表,语法格式“DROP TA...
    99+
    2022-10-18
  • vue项目无法删除的问题及解决
    目录vue项目无法删除vue新增与删除问题vue项目无法删除 问题 今天删除本地的vue项目,一直提示“操作无法完成,因为其中的文件夹或文件已在另一个程序组打开,请关闭该...
    99+
    2022-11-13
  • 如何解决删除mysql服务失败的问题
    小编给大家分享一下如何解决删除mysql服务失败的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!解决方法:1、以管理员身份运...
    99+
    2022-10-18
  • MySQL分表自增ID问题的解决方法
    这篇文章主要讲解了“MySQL分表自增ID问题的解决方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL分表自增ID问题的解决方法”吧! 当我们对...
    99+
    2022-10-18
  • 解决MYSQL大表改字段慢的问题!
    Mysql如何加快大表的ALTER TABLE操作速度 MYSQL的ALTER TABLE操作的性能对大表来说是个大问题。MYSQL执行大部分修改表结构操作的方法是用新的表结构创建一个空表,从旧表中查出所有数据插入新表,然后删除旧表。这样...
    99+
    2023-10-03
    mysql 数据库 java 开发语言
  • MYSQL大表改字段慢问题的解决
    mysql如何加快大表的ALTER TABLE操作速度 MYSQL的ALTER TABLE操作的性能对大表来说是个大问题。MYSQL执行大部分修改表结构操作的方法是用新的表结构创建一个空表,从旧表中查出所有数据插入新表,...
    99+
    2023-03-21
    MYSQL大表改字段慢 MYSQL 字段慢
  • MySQL数据库无法删除的解决方法
    本篇内容介绍了“MySQL数据库无法删除的解决方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作