我使用的是mysql5,我想缩小ibd
文件中一些"已删除"的空间。我已经在搜索"优化表"选项,但现在不能使用它,因为它是一个非常关键的表。它在Mysql中使用19G,但在操作系统中使用33G。我刚刚发现33G正在增长。
我听说它在33G空间重复使用,比如黑色区域。但为什么它每天都在增加?
MySQL不重用这些可用空间?我的意思是,大约24G永远不会重复使用?
谢谢你的阅读,我希望我糟糕的英语不会让你在阅读时感到困惑
如果您使用的MySQL版本足够新,那么您要查找的选项是innodb_use_trim=1
和innodb_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
较小的表;其中一些可能会缩小一点,从而给您一些额外的磁盘空间。
另一个提示:
- 确定哪些表在它们自己的表空间中
- 了解
ibdata1
中有多少可用空间 SET innodb_file_per_table=OFF;
- 对于一些小表的CCD_ 21是步骤1。但是在ibdata1的Data_free下降得太小之前停止
该技巧将为那些可以移动的表释放空间,而不会导致ibdata1增长。