加入收藏 | 设为首页 | 会员中心 | 我要投稿 温州站长网 (https://www.0577zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL大表删除问题的处理方法

发布时间:2022-01-19 21:47:25 所属栏目:MySql教程 来源:互联网
导读:这篇文章主要讲解了MySQL大表删除问题的解决方法,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习MySQL大表删除问题的解决方法吧! 一、表删除问题汇总 (1)、mysql如何删除表 (2)、删除大表如何优化、解决
      这篇文章主要讲解了“MySQL大表删除问题的解决方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL大表删除问题的解决方法”吧!
 
一、表删除问题汇总
(1)、mysql如何删除表
 
(2)、删除大表如何优化、解决
 MySQL大表删除问题的处理方法
二、删除表原理与优化
删除表原理上分为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的影响却大大减小了。因此采用该思路是可行的。

(编辑:温州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读