2011-04-01 100 views

回答

19
  1. 是的,这是正确的。
  2. 不,最好给mongodb尽可能多的磁盘空间(如果mongodb可以分配更多的空间而不是更少的磁盘碎片,那么在额外的分配空间中操作会很昂贵)。但是,如果您希望可以从mongodb外壳运行db.repairDatabase()以缩小数据库大小。
  3. 是的,你可以在现场MongoDB实例运行repairDatabase(最好在没有运行高峰时段)
+20

虽然您可以在实时系统上运行修复,但它会使其不可用,因为它在运行时锁定服务器;我认为这实际上意味着如果您打算继续使用该实例,则无法在实例上运行它。 – 2011-04-03 14:39:44

3

我有另一种解决方案可能工作不是做db.repairDatabase(),如果您不能负担的系统更好地被锁定,或者不要没有双倍的存储空间。

您必须使用副本集。

我的想法是,一旦你已经删除了吞噬你的磁盘的所有多余数据,停止一个辅助副本,擦除它的数据目录,启动它并让它与主节点重新同步。重复与其他次级人物,一次一个。

在主设备上,执行rs.stepDown()以将MASTER切换到其中一个同步辅助设备,现在停止此设备,擦除它并重新同步。

该过程非常耗时,但执行rs.stepDown()时应该只花费几秒钟的停机时间。