为什么mysql不回收ibd文件中的可用空间



我使用的是mysql5,我想缩小ibd文件中一些"已删除"的空间。我已经在搜索"优化表"选项,但现在不能使用它,因为它是一个非常关键的表。它在Mysql中使用19G,但在操作系统中使用33G。我刚刚发现33G正在增长。

我听说它在33G空间重复使用,比如黑色区域。但为什么它每天都在增加?

MySQL不重用这些可用空间?我的意思是,大约24G永远不会重复使用?

谢谢你的阅读,我希望我糟糕的英语不会让你在阅读时感到困惑

如果您使用的MySQL版本足够新,那么您要查找的选项是innodb_use_trim=1innodb_file_per_table=1。这将通过在表空间文件中打孔来释放空页。

表的有效部分分散在.ibd中。文件操作系统无法重用表中间释放的部分。

因此,InnoDB从不收缩表空间,只增长它

同时,新的INSERTs将填充一些释放的空间。

是什么导致了这种情况?你DELETE有很多行吗?如果你想再做一次大型DELETE,请参阅以下建议:http://mysql.rjweb.org/doc.php/deletebig

同时,如果表是用innodb_file_per_table = 1创建的,则OPTIMIZE TABLE将复制该表并将旧副本释放到操作系统。但是你需要额外的磁盘空间来完成这项任务。它将阻止对该表的一些操作。(详细信息取决于您使用的MySQL/MariaDB的版本。(

为什么你需要重新获得空间?如果您的磁盘空间不是不足,那么这真的重要吗?

空间不足

给我们看SHOW CREATE TABLE。也许有一些小技巧可以让桌子变小。(这并不能解决问题,但会延迟将来的问题。(例如,如果可以将INT(4字节(更改为SMALLINT(2字节(,这可能有助于缩小表。或者INDEX可能是冗余的;DROPping会有所帮助。

改变这些事情的CCD_ 15可能同时执行CCD_。(在MySQL 5.0中,实际上所有的ALTERs都是通过复制表来执行的。(

磁盘空间非常紧张时的另一个提示。。。(假设innodb_file_per_table一直处于打开状态(:OPTIMIZE较小的表;其中一些可能会缩小一点,从而给您一些额外的磁盘空间。

另一个提示:

  1. 确定哪些表在它们自己的表空间中
  2. 了解ibdata1中有多少可用空间
  3. SET innodb_file_per_table=OFF;
  4. 对于一些小表的CCD_ 21是步骤1。但是在ibdata1的Data_free下降得太小之前停止

该技巧将为那些可以移动的表释放空间,而不会导致ibdata1增长。

相关内容

  • 没有找到相关文章

最新更新