ITPUB 2017-06-19 16:51

一、表删除问题汇总

(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.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使用

3.4.1、选项及参数

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

-b #size

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

-s #seconds

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

-h, --help

查看帮助信息。

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

3.4.2、删除速度

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

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

<div font-size:15px;line-height:24px;white-space:normal;widows:1;"="" style="word-wrap: break-word; color: rgb(102, 102, 102); font-size: 13.3333px; line-height: 26px; white-space: normal; margin: 0px; font-family: Helvetica;">

可以看到默认删除速度是: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 -fslowrm --force rm -frm --force 相同
控制删除速度 控制速度 slowrm -s 0.1 -b 262144 file (2MB/s) 不支持  
默认速度 slowrm file 对应参数-s 0.1 -b 1048576(10MB/s) 一般使用默认参数即可    
删除其他类型文件 目录,软链 不支持    
递归删除目录   rm -rf 目录    

3.6、注意

3.6.1、删除文件类型

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

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

3.6.2、硬链的删除

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

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

3.7、测试使用

制造大文件

开始删除

大小情况

压力情况

3.8、日常使用

1、开启一个screen

screen -S slowrm_test

2、开始删除文件

slowrm file

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

MySQL大表删除解决方案相关推荐

  1. MySQL千万级大表优化解决方案

    MySQL千万级大表优化解决方案 参考文章: (1)MySQL千万级大表优化解决方案 (2)https://www.cnblogs.com/yliucnblogs/p/10096530.html 备忘 ...

  2. 史上最全MySQL 大表优化方案(长文)

    转载自  史上最全MySQL 大表优化方案(长文) 当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 一.单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑 ...

  3. MySQL大表历史数据迁移这么做

    历史数据迁移 项目地址:https://gitee.com/xl-echo/dataMigration 历史迁移解决方案.微服务的架构为基础,使用多种设计模式,如:单利.桥接.工厂.模板.策略等.其中 ...

  4. 解决MYSQL大表问题-实战篇(二)

    #首先上表结构 CREATE TABLE `sys_history` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`did` bigint(20) NOT NUL ...

  5. delete mysql 大表_无语了,直到今天,我才揪出MySQL磁盘消耗迅猛的“真凶”!

    作者:dbapower 链接:https://blog.51cto.com/suifu/2135599 背景 Part1:写在最前 当一张单表10亿数据量的表放在你面前,你将面临着什么? Part2: ...

  6. MySQL 大表优化方案(1)

    转载自  干货!!!MySQL 大表优化方案(1) 当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分 ...

  7. mysql 大表 备份_MySQL大表备份的简单方法

    MySQL大表备份是一个我们常见的问题,下面就为您介绍一个MySQL大表备份的简单方法,希望对您学习MySQL大表备份方面能有所帮助. 这里所说的大表是超过4G以上的表,我目前见到过最大为60多G的单 ...

  8. 【开源项目】mysql大表数据迁移

    历史数据迁移 项目地址:https://gitee.com/xl-echo/dataMigration 历史迁移解决方案.微服务的架构为基础,使用多种设计模式,如:单利.桥接.工厂.模板.策略等.其中 ...

  9. 从云数据迁移服务看MySQL大表抽取模式

    摘要:MySQL JDBC抽取到底应该采用什么样的方式,且听小编给你娓娓道来. 小编最近在云上的一个迁移项目中被MySQL抽取模式折磨的很惨.一开始爆内存被客户怼,再后来迁移效率低下再被怼.MySQL ...

最新文章

  1. 京东抢购服务高并发实践
  2. 【量化投资】策略四(聚宽)
  3. UNITY引擎变量调用产生不必要内存分配
  4. res里面的drawable(ldpi、mdpi、hdpi、xhdpi、xxhdpi)
  5. 后台启动_Windows10中如何阻止程序在后台运行
  6. 用Java创建MongoDB上限集合
  7. gis计算各省河流长度_用河流和各方解释安全漏洞
  8. .net core高并发_高并发下的Node.js与负载均衡
  9. 可支持任意级选择器级联的控件函数
  10. 所以進入到二十一世紀之後
  11. 客快物流大数据项目(二十九):下载CDH的安装包
  12. 计算机图形学--全局光照(屏幕空间:SSDO,SSR)
  13. 常见计算机英语词汇翻译,常见计算机英语词汇翻译.doc
  14. python PPT批量制作封面图及导出视频教程
  15. win7 与xp 互联步骤
  16. Spring boot 集成邮件通知及线程异步发送
  17. idea 一直在updating index的问题
  18. 解决戴尔电脑蓝牙消失问题
  19. 消防基础知识——燃烧与火灾
  20. supermap gis

热门文章

  1. 1nm以下制程重大突破!台积电官宣「铋」密武器
  2. odoo创建模块(八)--关系字段
  3. 编写一个程序,求出200到300之间的数,且满足条件:它们三个数字之积为42,三个数字之和为12...
  4. c语言指针,return以及函数返回值
  5. 关于CSS中关于定位的总结
  6. 初学者选黑卡还是微单_索尼微单相机如何选择?哪款性价比高?(5000字选购指南)...
  7. Silo2.2菜单中英对照
  8. Orleans 2.0 官方文档 —— 6.8.4 部署 - 多集群支持 - silo的配置
  9. autocad不能画图_不想加班画图?CAD命令使用技巧看看吧!
  10. netsh的工具的利用