删除表格后,MySQL中的可用空间列?

时间:2010-12-02 18:49:17

标签: sql mysql mysqldump

我有一个大约20GB的数据库。我需要删除5个表格和在其他3个表格中删除几列。

删除5个表,释放3 GB,在其他表中删除列应释放另外8GB。

如何从MySQL中回收此空间。

我已经读过转储数据库并将其恢复为解决方案之一,但我不确定它是如何工作的,我甚至不确定这是否仅适用于删除整个数据库或只是部分数据库?

请建议如何解决这个问题。感谢。

2 个答案:

答案 0 :(得分:5)

从评论中,听起来你在没有每个表格选项的情况下使用InnoDB。

在此模式下,通常无法从innodb表空间中回收空间。您唯一的做法是转储整个数据库,打开每个表文件模式,并重新加载它(使用一个完全干净的mysql实例)。对于大型数据库,这需要很长时间; mk-parallel-dump和restore工具可能会更快一些,但仍需要一段时间。请务必先在非生产服务器上测试此过程。

答案 1 :(得分:2)

编辑:没有file_per_table不适用,马克就在那里。

正在发生的事情是,一旦MySQL占用空间,它就不会回馈它。这样,如果删除500行然后立即插入500,则不必将该空间返回给文件系统,然后再请求它。这是一种避免文件系统开销的优化,当你删除少量内容时效果很好。

如果删除大量数据,最后再次使用所有空间将花费很长时间,这可能很烦人。这可以通过两种方式修复:删除表并重新加载内容,或优化表(我相信基本上会在内部重新加载表)。

要从表中获取空间,您需要做的就是:

OPTIMIZE TABLE my_big_table;

请注意,这可能需要一段时间,而不是近乎即时的操作。基本上,计划一些停机时间。如果你的桌子只是几个演出,它不应该太长(可能是几分钟)。这也会重建索引并进行其他一些内务管理。

您可以看到有关优化on the MySQL site的更多信息。这是建议:

  

如果删除了表的大部分,或者对具有可变长度行的表(具有VARCHAR,VARBINARY,BLOB或TEXT列的表)进行了许多更改,则应使用OPTIMIZE TABLE。删除的行在链表中维护,随后的INSERT操作重用旧的行位置。您可以使用OPTIMIZE TABLE回收未使用的空间并对数据文件进行碎片整理。