从表中删除数据行后,MySQL的InnoDB中不释放磁盘空间(MySQL InnoDB not re

2019-06-18 10:31发布

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

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

我在一个糟糕的情况; 这个应用程序在约50不同的位置上运行,现在的磁盘空间不足的问题出现在几乎所有的人。

Answer 1:

MySQL不降低ibdata1中的大小。 永远。 即使您使用optimize table来释放从已删除的记录使用的空间,这将在以后重新使用它。

另一种方法是将服务器配置为使用innodb_file_per_table ,但这将需要备份,删除数据库和恢复。 正侧是,表中的的.ibd文件是一个后减少optimize table



Answer 2:

刚刚有同样的问题我自己。

什么情况是,即使你删除数据库,InnoDB的仍不会释放磁盘空间。 我不得不出口,阻止MySQL中,手动删除文件,启动mysql,创建数据库和用户,然后导入。 感谢上帝,我只有行的200MB的价值,但它不遗余力的InnoDB文件的250GB。

设计失败。



Answer 3:

如果你不使用innodb_file_per_table ,回收磁盘空间是可能的,但相当繁琐,需要停机的显著量。

该如何为深入漂亮-但我粘贴下面的相关部分。

此外,请务必保留您的架构的副本转储。

目前,您无法从系统中删除表空间的数据文件。 为了减少系统表空间的大小,使用此过程:

使用mysqldump转储所有InnoDB表。

停止服务器。

删除所有现有的表空间文件,包括ibdata和ib_log文件。 如果你想保留的信息进行备份,然后将所有IB *文件复制到其他位置,MySQL安装在删除文件之前。

删除所有.FRM文件InnoDB表。

配置新的表空间。

重新启动服务器。

导入转储文件。



Answer 4:

基于范围,基于价值的分区和刚落/截断分区回收空间,这将释放由储存在特定分区整个数据使用的空间 - 其他解决空间回收的问题,创建表中的多个分区的方式。

会有在表模式需要一些改变,当你介绍分区为你喜欢的表 - 独特的键,索引,包括分区列等。



Answer 5:

有几种方法可以删除从表中的数据为MySQL Inodb发动机后回收磁盘空间

如果不从一开始就使用innodb_file_per_table,倾倒所有数据,删除所有文件,重新创建数据库,并导入数据又是唯一的出路(检查上面FlipMcF的答案)

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

  1. 如果你能删除所有数据截断命令将删除数据,以回收磁盘空间为您服务。
  2. ALTER TABLE命令会删除并重新创建表,以便它可以回收磁盘空间。 因此后删除更改没有释放hardisk数据,运行alter table(即:表TBL_A已字符集uf8,删除后的数据上运行ALTER TABLE TBL_A字符集UTF8 - >从表中该命令改变什么,但它使MySQL的重新创建表,并恢复磁盘空间
  3. 创建TBL_B像TBL_A。 插入你想从TBL_A保持到TBL_B选择数据。 降TBL_A,并重新命名TBL_B到TBL_A。 这种方式是非常有效的,如果一个需要删除TBL_A和数据大(删除MySQL的InnoDB的命令是非常糟糕的表现)


文章来源: MySQL InnoDB not releasing disk space after deleting data rows from table