repairDatabase

在本页面

Definition

  • repairDatabase
    • 通过丢弃无效或损坏的数据来重建数据库和索引,这些数据可能由于系统意外重启或崩溃而存在。 repairDatabase类似于文件系统的fsck命令。

Warning

  • 在使用repairDatabase之前,请备份 dbpath 目录中的文件。

  • 如果您在启用journaling的情况下运行,则几乎不需要运行repairDatabase,除非您需要从磁盘级数据损坏中恢复。如果发生异常关闭,服务器将能够自动将数据文件还原到干净状态。

  • 避免对副本集运行repairDatabase。如果您要修复replica set成员,并且可以访问数据的完整副本(例如,最近的备份或replica set的完整成员),则应从该完整副本中恢复(请参见重新同步副本集的成员),并且 使用repairDatabase

  • 如果没有其他选择,则只能使用repairDatabase命令和associated wrappers。这些操作将在修复过程中删除并且不会保存任何损坏的数据。

repairDatabase采用以下形式:

{ repairDatabase: 1 }

repairDatabase具有以下字段:

FieldTypeDescription
preserveClonedFilesOnFailureboolean如果为true,则repairDatabase不会错误删除备份目录中的临时文件,并且所有新文件都使用“ backup”而不是“ _tmp”目录前缀创建。默认情况下,repairDatabase不会删除临时文件,而是对新文件使用“ _tmp”命名前缀。


在版本 3.0 中更改:preserveClonedFilesOnFailure仅可用于mmapv1存储引擎。
| backupOriginalFiles |布尔值|当true时,repairDatabase将旧数据库文件移动到备份目录,而不是在将新文件移动到位之前删除它们。使用“备份”而不是“ _tmp”目录前缀创建新文件。默认情况下,repairDatabase保留临时文件不变,并为新文件使用“ _tmp”命名前缀。
在版本 3.0 中更改:backupOriginalFiles仅可用于mmapv1存储引擎。

您可以如下明确设置选项:

{ repairDatabase: 1,
  preserveClonedFilesOnFailure: <boolean>,
  backupOriginalFiles: <boolean> }

有关这些相关选项的信息,请参见mongod --repairmongodump --repair

repairDatabase Wrappers

您可以从多个上下文调用repairDatabase

  • 如上所述,使用mongo shell 运行命令。

  • mongo shell 中使用db.repairDatabase()

  • 直接从系统的 Shell 运行mongod。确保mongod尚未运行,并且以具有访问 MongoDB 数据文件访问权限的用户身份调用mongod

mongod --repair

对于 MMAPv1,可以指定命令在修复操作期间将使用的临时工作目录:

mongod --repair --repairpath /opt/vol2/data

有关更多信息,请参见repairPath

Behavior

Warning

该命令获得全局写锁定,并将阻止其他操作,直到完成为止。

repairDatabase的时间要求取决于数据集的大小。

repairDatabase重新创建数据库中的所有索引。

MMAPv1

repairDatabase要求的可用磁盘空间等于您当前数据集的大小再加上 2 GB。如果保存 dbpath 的卷缺少足够的空间,则可以装入单独的卷并将其用于修复。为repairDatabase挂载单独的卷时,必须从命令行运行repairDatabase并使用--repairpath开关指定用于存储临时修复文件的文件夹。

WiredTiger

repairDatabase原位执行操作,不需要额外的磁盘空间。

repairDatabase and compact

repairDatabase命令重建数据库,对于 MMAPv1,该数据库具有压缩所有集合的辅助作用。

对于 WiredTiger,该操作将重建数据库,但不会导致数据库中集合的压缩。

See also

Example

Warning

如果您尝试修复replica set成员,并且可以访问数据的完整副本(例如,最近的备份或replica set的完整成员),请参见重新同步副本集的成员

如果您在启用journaling的情况下运行,则几乎不需要运行repairDatabase,除非您需要从磁盘级数据损坏中恢复。如果发生异常关闭,服务器将能够自动将数据文件还原到干净状态。

如果没有其他选择,请使用repairDatabase

使用repairDatabase之前,请在 dbpath 中制作数据文件的备份副本。

db.runCommand( { repairDatabase: 1 } )