【mysql】如何回收delete之后mysql所占用的磁盘空间
时间:2015-09-10 03:09:23 作者:vaster 标签: mysql 分类: mysql
我们都知道,当使用 innodb_file_per_table=OFF的时候,数据文件都会存储在ibdata文件中,当我们从表中delete数据之后,除非使用dump/reload的方法,没有其他的办法来释放被占用的磁盘空间,数据只能一直增长。当使用了Innodb_file_per_table=ON的时候,当你delete数据之后,数据删除了,但是磁盘的空间并不会释放,除了dump/reload之外,还有如下的方法来回收这部分的空间。请参考下面的连接。
http://www.mysqlperformanceblog.com/2013/09/25/how-to-reclaim-space-in-innodb-when-innodb_file_per_table-is-on/
注:之前使用optimize回收空间,但是在执行的过程中会锁表,因此会影响正在跑的业务,如下的连接里面介绍了percona toolkit的一个回收磁盘空间的命令,不会锁表
主要的原理是:创建一个triggers,创建一个临时表,将原来表中数据复制到临时表中,触发器的作用是保证执行复制的过程中,源表和临时表中同时插入数据。之后删除源表,重命名一下临时表即可。这个过程中应该保证,磁盘空间能够容下源表的两倍的数据大小
命令:Pt-online-schema-change --alter "ENGINE=InnoDB" D=DatabaseName,t=TableName --execute