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

2 浏览
0 Comments

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

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

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

我现在处于困境中,这个应用程序在大约50个不同的位置运行,现在几乎所有位置都出现了磁盘空间不足的问题。

0
0 Comments

在使用MySQL的InnoDB存储引擎时,当我们删除表中的数据行后,InnoDB并不会立即释放磁盘空间。如果不使用innodb_file_per_table参数,想要回收磁盘空间就比较麻烦,且需要较长的停机时间。

具体的解决方法如下:

1. 使用mysqldump命令备份所有的InnoDB表数据。

2. 停止MySQL服务器。

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

4. 删除所有InnoDB表的.frm文件。

5. 配置一个新的表空间。

6. 重新启动MySQL服务器。

7. 导入备份的数据。

感谢提供这些步骤,据我所知,“how to”链接中不再包含这些信息。

0
0 Comments

MySQL InnoDB在从表中删除数据行后不释放磁盘空间的问题是由于MySQL不会减小ibdata1的大小所导致的。即使使用optimize table命令释放已删除记录所使用的空间,它也会在以后重新使用它。解决这个问题的一种方法是配置服务器使用innodb_file_per_table,但这将需要备份、删除数据库和恢复操作。正面的一面是,在optimize table之后,表的.ibd文件大小会减小。这意味着可以打开这个功能,用ALTER TABLE命令将现有表“转换”为使用单独的InnoDB文件,然后使用OPTIMIZE命令来缩小表的大小。但是,一旦完成,您将不得不弄清楚如何删除(巨大的)源InnoDB文件...

我猜这在技术上回答了问题,但我认为大多数搜索这个主题的人都在寻找实际的缩小/回收空间的过程,而这个答案并没有提供。解决这个问题的过程是“配置服务器使用innodb_file_per_table”,备份服务器,“删除数据库”,停止mysql,删除.ibd文件,重新启动服务器并恢复数据库。在MySQL 5.5+版本中,您可以使用Josh所说的方法,在更改所有表之后,停止服务器,删除巨大的.ibd文件,然后重新启动服务器。

对于MySQL 8.0的版本,使用optimize tables命令和重新启动mysql以释放磁盘空间即可解决此问题。

如果没有出现这个问题,那么就不需要downvote,因为这个答案是问题的解决方案。

因为某个未来的解决方案存在而对答案进行downvote是没有意义的。这个答案是2009年的,MySQL 8于2018年发布。

我从一个表中删除了1400万条记录,另一个表中删除了60万条记录。重新启动并没有减小存储空间。也许是我的表无法优化的问题,不确定。

0
0 Comments

MySQL InnoDB在从表中删除数据行后不释放磁盘空间的问题的原因可能是设计上的失败。即使删除数据库,InnoDB仍然不会释放磁盘空间。这可能需要手动导出数据,停止MySQL,手动删除文件,启动MySQL,创建数据库和用户,然后再导入数据。这个问题可能存在于MySQL 5.5版本中。在执行"optimize table"操作时,可能会尝试对原始表进行优化克隆,并使用了分区上的所有空间。即使删除整个数据库,分区上仍然没有空间。这个问题可能在MySQL中已经存在了4年。MS SQL也存在类似的问题。

0