问题背景

收到运维提示数据库服务所在机器磁盘空间不足,在不满足迁移条件的情况下则需要进行冷数据本地备份删除操作,在delete掉冷数据发现磁盘空间并没有进行释放,表的ibd文件大小没有变化。

问题分析

InnoDB 数据库在使用 delete 进行删除操作的时候,只会将已经删除的数据标记为删除,并没有把数据文件删除,因此并不会彻底的释放空间。这些被删除的数据会被保存在一个链接清单中,当有新数据写入的时候,MySQL 会重新利用这些已删除的空间进行再写入。

解决方法

官方推荐可以使用 OPTIMIZE TABLE 命令来优化表,该命令会重新利用未使用的空间,并整理数据文件的碎片。

OPTIMIZE TABLE 是指对表进行优化。如果已经删除了表的一大部分数据,或者如果已经对含有可变长度行的表(含有 VARCHAR 、 BLOB 或 TEXT 列的表)进行了很多更改,就应该使用 OPTIMIZE TABLE 命令来进行表优化。这个命令可以将表中的空间碎片进行合并,并且可以消除由于删除或者更新造成的空间浪费 。

OPTIMIZE TABLE 命令只对 MyISAM 、 BDB 和 InnoDB 表起作用 。表优化的工作可以每周或者每月定期执行,对提高表的访问效率有一定的好处,但是需要注意的是,优化表期间会锁定表,所以一定要安排在空闲时段进行。

操作如下

先查看表的数据量及表ibd文件大小,然后进行冷数据备份删除。

删除前:

mysql删除数据(delete)之后如何释放磁盘空间_删除操作

删除后并进行优化:

OPTIMIZE TABLE tablename;

mysql删除数据(delete)之后如何释放磁盘空间_删除操作_02

mysql删除数据(delete)之后如何释放磁盘空间_删除操作_03