MySQL使用OPTIMIZE表回收磁盘空间

时间:2015-05-24 13:53:47

标签: mysql innodb

我需要你的建议。需要以最少的停机时间回收实时服务器上的磁盘空间。我们正在使用:

mysql -- 5.5
innodb table per file -- on

是一个巨大的表(70%的insers / 30%删除 - 这意味着有时我们从这个表中删除行),这个表被删除了“drop table”命令,正如我们所料,mysql没有释放磁盘操作系统的空间,但现在我们需要释放空闲空间。 OPTIMIZE命令是可能的方式 - 但是现在我们不能100%确定磁盘上是否有足够的可用空间来执行此命令,因为前一个表很大。但是在mysql文档中写道:

  

您可以运行OPTIMIZE TABLE来压缩或重新创建每个表的文件表空间。当您运行OPTIMIZE TABLE时,InnoDB会创建一个带有临时名称的新.ibd文件,仅使用存储实际数据所需的空间。优化完成后,InnoDB将删除旧的.ibd文件并将其替换为新文件。

我在文档中突出了令人困惑的时刻,这是否意味着,“OPTIMIZE dropped_table;”将仅使用空间用于真正需要的数据,对于这种情况,如果我们提前删除表,则没有实际数据?

1 个答案:

答案 0 :(得分:0)

如果在innodb_file_per_tableOFF时表已创建,则表格将写入ibdata1,并且该空间不会返回到操作系统DROP TABLE

如果是ON,则会有.ibd个文件。您在DROP之前看到该文件了吗?它还存在吗? (它不应该存在。)

DROP删除.ibd文件时,等待操作系统实际释放数据时会有轻微的延迟(取决于操作系统)。 du和/或df反映了这种滞后。

OPTIMIZE TABLE会将表格复制到tmpdir(我认为),然后放弃旧桌面并播放RENAME个游戏。这需要额外的空间 - 足以用于表的竞争副本。假设你确实有一个.ibd文件,它将创建另一个.ibd文件(带有临时名称)和shuffle文件。如果tmpdir指向不同的"文件系统",则shuffle将涉及副本,而不仅仅是移动。

如果我没有充分解释,请提供更多详细信息 - 您提出的实际命令,相关表格的大小,.ibd是否存在等等。