15

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

4

5 回答 5

15

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

这个问题的原始答案在这里: Reducing MongoDB database file size

除此之外,真的没有任何东西repair可以回收空间。这compact应该允许您在现有空间上走更长的时间。否则,您将不得不迁移到更大的驱动器。

一种方法是使用副本集中的离线辅助节点。这应该为您提供一个完整的维护窗口来迁移、修复、移回和恢复。

如果您没有运行副本集,那么是时候考虑这样做了。

于 2012-07-23T18:35:02.140 回答
13

您可以在单个集合上运行该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/

于 2012-07-23T18:04:08.193 回答
12

您也可以手动执行 mongodump 和 mongorestore。这与 repairDatabase 所做的基本相同。这样,您可以将其转储到/从具有足够磁盘空间的不同机器上恢复。

于 2013-02-27T13:01:38.507 回答
3

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

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

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

于 2014-10-22T21:22:56.163 回答
1

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

如果您走这条路,我的建议是在执行此操作以回收磁盘空间之前拥有一个 3 成员副本集,以便在成员从头开始同步的任何时候,您都有 2 个成员集完全正常工作。

如果您没有副本集,我建议创建一个,带有两个辅助节点。当您最初同步它们时,您将创建一个很好的未碎片化和未填充的数据版本。更多在这里:

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

于 2012-07-24T00:27:51.470 回答