如何在没有`db.repairDatabase()`的情况下回收已删除的空间?

时间:2012-07-23 17:57:28

标签: mongodb

我希望通过回收已删除的空间来缩小数据文件大小,但我无法运行db.repairDatabase(),因为可用磁盘空间不足。

5 个答案:

答案 0 :(得分:11)

您可以在单个集合上运行compact命令,也可以在要缩小的所有集合中逐个运行。

http://www.mongodb.org/display/DOCS/Compact+Command

db.runCommand( { compact : 'mycollectionname' } )

正如评论中所指出的,我错了,compact实际上并没有回收磁盘空间,它只对碎片整理和重建集合索引进行碎片整理。

相反,如果您有另一个可用的可用空间驱动器,则可以使用“--repairpath”选项。

例如:

mongod --dbpath /data/db --repair --repairpath /data/db0

此处显示:http://docs.mongodb.org/manual/tutorial/recover-data-following-unexpected-shutdown/

答案 1 :(得分:11)

更新:使用WiredTiger,compact 可用空间。

这个问题的原始答案如下: Reducing MongoDB database file size

repair以外的任何东西都无法收回空间。 compact应该允许您在现有空间上花费更长时间。否则,您将不得不迁移到更大的驱动器。

执行此操作的一种方法是使用副本集中的脱机辅助。这应该为您提供整个维护窗口,以便迁移,修复,移回并重新启动。

如果您没有运行副本集,则应该考虑这样做。

答案 2 :(得分:11)

您也可以手动mongodump和mongorestore。这与repairDatabase的功能基本相同。这样,您就可以将其转储到具有足够磁盘空间的其他计算机上并从中恢复。

答案 3 :(得分:4)

如果您正在运行副本集,则需要在每个辅助节点上发出一次重新同步,一次一个。完成此操作后,请降级主要服务器并重新同步新分配的辅助服务器。

要重新同步,请停止您的mongod实例,删除本地并重新启动该过程。观察日志以确保一切正常启动并重新启动重新同步。

如果您有大量数据/索引,请确保您的oplog足够大,否则它可能会过时。

答案 4 :(得分:1)

还有另外一个选项,如果您使用的是副本集,但有很多警告。您可以故障转移到另一个集成员,然后删除现在以前的主要文件上的文件并执行完全重新同步。完全重新同步以与修复类似的方式从头开始重写文件,但您还必须重建索引。这不是轻易做到的。

如果沿着这条路走下去,我的建议是在为磁盘空间回收做这个之前设置一个3成员副本,这样在成员从头开始同步的任何时候你都有2个成员完全正常运行。

如果您没有副本集,我建议创建一个副本集,其中包含两个副词。最初同步它们时,您将创建一个很好的未分段和未填充的数据版本。更多信息:

http://www.mongodb.org/display/DOCS/Replica+Set+Configuration