MySQL InnoDB在从表中删除数据行后不释放磁盘空间

我有一个使用InnoDB存储引擎的MySQL表; 它包含大约2M数据行。 当我从表中删除数据行时,它没有释放分配的磁盘空间。 在运行optimize table命令之后,ibdata1文件的大小也没有减小。

有没有办法从MySQL回收磁盘空间?

我处境不好, 此应用程序运行在大约50个不同的位置,现在几乎所有的磁盘空间出现问题。

MySQL不会减小ibdata1的大小。 永远。 即使您使用optimize table来释放已删除logging中使用的空间,它将在稍后重用。

另一种方法是将服务器configuration为使用innodb_file_per_table ,但这需要备份,删除数据库和恢复。 积极的一面是, optimize table后,表格的.ibd文件被减less。

我自己也有同样的问题。

会发生什么,即使你删除了数据库,innodb仍然不会释放磁盘空间。 我不得不导出,停止mysql,手动删除文件,启动mysql,创build数据库和用户,然后导入。 感谢上帝,我只有200MB的行数,但是它保留了250GB的innodb文件。

devise失败。

如果你不使用innodb_file_per_table ,回收磁盘空间是可能的,但是非常繁琐,并且需要大量的停机时间。

如何深入 – 但我粘贴下面的相关部分。

一定要保留你的转储模式的副本。

目前,您无法从系统表空间中删除数据文件。 要减小系统表空间大小,请使用以下过程:

使用mysqldump来转储所有的InnoDB表。

停止服务器。

删除所有现有的表空间文件,包括ibdata和ib_log文件。 如果要保留信息的备份副本,则在删除MySQL安装中的文件之前,将所有的ib *文件复制到另一个位置。

删除InnoDB表的任何.frm文件。

configuration一个新的表空间。

重新启动服务器。

导入转储文件。

解决空间回收问题的其他方法是,在表中创build多个分区 – 基于范围的,基于值的分区,只是删除/截断分区来回收空间,这将释放存储在特定分区中的全部数据所使用的空间。

当您为表格引入分区时,表格模式需要进行一些更改,例如 – 唯一键,包含分区列的索引等。

删除MySQL Inodb引擎表中的数据后,有几种方法可以回收磁盘空间

如果从一开始就没有使用innodb_file_per_table,那么所有数据的转储,删除所有的文件,重新创build数据库和重新导入数据都是唯一的办法(查看上面的FlipMcF的答案)

如果你正在使用innodb_file_per_table,你可以试试

  1. 如果你可以删除所有的数据truncate命令将删除数据并为你回收磁盘空间。
  2. 更改表命令将删除并重新创build表,以便它可以回收磁盘空间。 所以在删除数据后,运行alter table即可释放硬盘(即:表TBL_A有charset uf8,删除数据后运行ALTER TABLE TBL_A charset utf8 – >这个命令不会改变你的表,但是这会让mysql重新创build你的表并重新获得磁盘空间
  3. 像TBL_A一样创buildTBL_B。 将要保留的select数据从TBL_A插入到TBL_B中。 丢弃TBL_A,并将TBL_B重命名为TBL_A。 如果TBL_A和需要删除的数据很大,这种方式非常有效(MySQL innodb中的删除命令性能很差)