利用硬链接和truncate降低drop table对线上环境的影响

众所周知drop table会严重的消耗服务器IO性能,如果被drop的table容量较大,甚至会影响到线上的正常。

首先,我们看一下为什么drop容量大的table会影响线上服务

直接执行drop table,mysql会将表定义和表数据全都删除,包括磁盘上的物理文件,也包括buffer pool中的内存数据。

这就分两步,第一步从buffer pool中删除,这会涉及到table_cache的lock,如果持有table_cache的lock,这将导致其他查询都无法执行。这种情况在没有innodb_per_table之前尤为严重。另外,mysql5.5.23之后添加lazy drop table功能,这个功能用来解决mutex on the LRU list。其中心思想就是加锁,找到需要被删除的page,删除1024个page之后释放锁让其他thread工作,之后loop。而percona的lazy drop处理起来更优雅一些,其会先加锁,然后找到需要被删除的page,标记,释放锁,后台慢慢删除。

之后就是第二步,这步在大容量表的时候更为消耗时间,那就是在os上删除物理文件。大家都知道在ext3上rm一个200G的文件会非常耗时,这是由于ext3存储数据的结构导致,如果一个很大的文件,ext3的i_block无法直接存放,需要多层嵌套才能完全存储下,在这种情况下由于映射的层次多,并且由于多层映射也不会是顺序存储的,就导致了很大的随机IO,这就导致了删除物理文件非常慢的现象。在这种情况下,建议升级到ext4,这是由于ext4比ext3使用extent分配存储空间,其最大的优势就是顺序存储。

ext3:

ext4:

知道了原因,我们来说说如何解决。具体步骤如下:

1、建立硬链接。

ln table.ibd table.idb.hdlk

2、mysql执行drop table操作。

drop table if exists tablename;

3、使用truncate删除物理文件。

truncate -s 1024*1024*4 filename

其实硬链接和drop table就不用多说了,在建立硬链接之后,mysql会认为rm了硬链接文件之后就算操作完毕,不会真正去删除物理文件从而提高了速度。但是对于服务器来说,实际的物理文件还在,如果手动rm,还是会产生很多的io影响,这时候就用到了truncate这个工具。这个工具会根据指定的size大小进行逐步删除,会将对IO造成的影响降到最低。

Usage: truncate OPTION... FILE...
Shrink or extend the size of each FILE to the specified size

A FILE argument that does not exist is created.

If a FILE is larger than the specified size, the extra data is lost.
If a FILE is shorter, it is extended and the extended part (hole)
reads as zero bytes.

Mandatory arguments to long options are mandatory for short options too.
  -c, --no-create        do not create any files
  -o, --io-blocks        treat SIZE as number of IO blocks instead of bytes
  -r, --reference=RFILE  base size on RFILE
  -s, --size=SIZE        set or adjust the file size by SIZE
      --help     display this help and exit
      --version  output version information and exit

SIZE may be (or may be an integer optionally followed by) one of following:
KB 1000, K 1024, MB 1000*1000, M 1024*1024, and so on for G, T, P, E, Z, Y.

SIZE may also be prefixed by one of the following modifying characters:
`+' extend by, `-' reduce by, `<' at most, `>' at least,
`/' round down to multiple of, `%' round up to multiple of.

Report truncate bugs to bug-coreutils@gnu.org
GNU coreutils home page: <http://www.gnu.org/software/coreutils/>
General help using GNU software: <http://www.gnu.org/gethelp/>
For complete documentation, run: info coreutils 'truncate invocation'

原文链接:http://www.cnblogs.com/billyxp/p/3664672.html

原文发布于微信公众号 - 马哥Linux运维(magedu-Linux)

原文发表时间:2016-05-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT笔记

Lepus搭建企业级数据库慢查询分析平台

Lepus的慢查询分析平台是独立于监控系统的模块,该功能需要使用percona-toolkit工具来采集和记录慢查询日志,并且需要部署一个我们提供的shell脚...

15520
来自专栏深度学习之tensorflow实战篇

Centos7.4 版本环境下安装Mysql5.7操作记录

MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可。开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MyS...

37090
来自专栏北京马哥教育

MySQL/MariaDB数据库备份与恢复

前言 数据库一般存放着企业最为重要的数据,它关系到企业业务能否正常运转,数据库服务器总会遇到一 些不可抗拒因素,导致数据丢失或损坏,而数据库备份可以帮助我们...

58360
来自专栏杨建荣的学习笔记

半自动化运维之快速连接到指定环境(一) (r5笔记第61天)

在大量的分布式环境中,可能存在着大量的主机配置,ip配置,数据库实例配置,甚至操作系统用户,数据库用户密码也不同,这个时候如果记录在10条左右还能应付,但是如果...

37390
来自专栏杂烩

hbase1.2.4安装 原

匹配的hadoop2.6.0,假设hadoop已经正确安装并启动,假设zookeeper已经正确安装并启动。

7930
来自专栏JavaEdge

Mac 下 MySQL5.7.22的安装

1.使用安装包安装mysql(网上下载实在是太慢了,需要安装包的可以在文章底部留言,我发给您) 双击打开安装文件 ? 双击pkg文件安装 一路向下,记得保存最后...

365100
来自专栏雨过天晴

原 数据库主从配置日志

21940
来自专栏pangguoming

mysql主从配置(清晰的思路)

例如:主数据库里的a的数据库里有b,c,d表,那从数据库里的就应该有一个模子刻出来的a的数据库和b,c,d表

18020
来自专栏闵开慧

centos在线安装mysql

Centos5.3在线安装mysql 一、[root@sample ~]# yum -y install mysql-server  ← 安装MySQL .....

45070
来自专栏Web 开发

服务迁移导致数据差异

通常我在dnspod里面,设置的解析缓存时间很短,基本上我修改DNS,是马上生效的。但毕竟用户的DNS不在我们的控制范围,总会有用户解析到旧的服务器上面,杯具就...

11200

扫码关注云+社区

领取腾讯云代金券