OPTIONS
翻译或纠错本页面

从意外的关闭中恢复数据

如果MongoDB意外关闭 [1] 在磁盘上的数据文件可能会反映出不一致状态,这将会导致数据损坏。 [2]

为了防止数据的不一致和损坏,请正常关闭数据库并且使用 durability journaling 。默认情况下数据写入日志的周期为100ms,以此保证MongoDB在任何状态下可以恢复至一致状态,甚至是是由于电源切断或其他系统故障。

如果你*并未*运行 replica set 并且*并未*打开日志功能,使用以下的步骤恢复不一致状态的数据。如果你已经运行复制集,你需要*经常*从备份恢复数据或者在空的 dbPath 下启动 mongod instance 实例,并让MongoDB执行初始同步来恢复数据。

参见

The Administration documents, including Replica Set Syncing, and the documentation on the --repair repairPath and storage.journal.enabled settings.

[1]

为确保正常关闭,在 mongo shell中使用 db.shutdownServer() ,在Linux系统中选择 mongod --shutdown 选项,”Control-C”在互动模式下运行 mongod,或者 kill $(pidof mongod)kill -2 $(pidof mongod)

[2]

你同样可以使用 db.collection.validate() 方法来测试单个集合的完整性。该操作比较耗时,在没有日志的情况下,你能认为数据处于不可用状态并且你需要运行修复操作或者在复制集成员中初始同步

处理

现象

在未开启日志的情况下,如果发现 mongod 意外停止,并且你也未启用复制集,在MongoDB重新运行之前需要启动修复程序。如果你已经启用复制集,你需要从备份中恢复数据并且让复制集进入 :ref:`sync <replica-set-syncing>`状态以恢复数据

在默认情况下 dbPath 的默认路径为``/data/db`` , mongod.lock 文件将在此,并且为非空文件,之后 mongod 将会拒绝启动,你将会在MongoDB记录中看到如下信息的输出:

Unclean shutdown detected.

这表示你需要运行 mongod 并启用 --repair 选项。如果修复石 mongodb.lock 文件存在于 dbPath ,或者 --repairpath 选项开启,你将会看到以下信息:

old lock file: /data/db/mongod.lock. probably means unclean shutdown

如果你看到该信息,作为万不得已的方法,移除锁文件并且在正常启动数据库前启动修复程序,步骤如下:

概述

警告

恢复复制集成员

请不要使用本过程去恢复 replica set 成员。而是应该从 backup 中恢复,或者执行初始化同步,并使用完整的数据及成员中的数据,详情见 复制集成员的重新同步

有两种处理方法修复从意外关闭中恢复数据

  1. 使用 --repair--repairpath 选项。 mongod 将会读取存在的数据文件,并且将其写入新的数据文件中。该操作将不会更改现有数据文件。

    在执行该步骤前,你不需要移除 mongod.lock

  2. 使用 --repair 选项。 mongod 将会读取现有的数据文件,并将其写入新的文件中,该操作会用新文件取代可能损坏的文件。

    在执行以下步骤前,请移除 mongod.lock 文件

注解

--repair 功能同样在shell中 repairDatabase 命令下的 db.repairDatabase() 有效

过程

重要

运行 mongod 时,请尽量使用相同的用户,以避免MongoDB文件的权限更改。

修复数据时如果让原数据不被修改,请使用 --repairpath 选项

  1. 启动 mongod ,使用 --repair 选项读取现有的数据文件。

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

    当这些都完成时,修复好的数据文件将会在 /data/db0 目录中。

  2. 打开 mongoddbPath 指向``/data/db0``:

    mongod --dbpath /data/db0
    

    当你确认数据文件是可操作的,在 /data/db 目录下你可以删除或者存档旧的数据文件,你可能还希望将恢复的文件导入到旧的数据库中或者更新 dbPath 来指定新的路径。

如果修复数据时,不想保存原有文件,请不要使用 --repairpath 选项,请使用以下步骤

  1. 移除老旧的锁文件:

    rm /data/db/mongod.lock
    

    dbPath 的默认 /data/db ,替换成MongoDB实例数据文件驻村的地方

    警告

    在移除 mongod.lock 文件后,你*必须*要在使用数据库前运行 --repair

  2. 启动 mongod ,使用 --repair 选项读取现有的数据文件。

    mongod --dbpath /data/db --repair
    

    当这些完成时,在``/data/db``目录中,修复的数据文件将会替代原有数据文件

  3. 打开 mongoddbPath 指向 /data/db0

    mongod --dbpath /data/db
    

mongod.lock

通常情况下,你*不能*移除 mongod.lock 文件,并启动 mongod 。请考虑上述方法来恢复数据库和移除锁文件。在最差的情况下,你可以移除锁文件,在有损坏数据的情况下启动数据库,并且试图恢复数据,但是在这种情况下数据库的状态将会变得不可预测。

如果不启用日志,并且数据库因为*任何*原因意外关闭,而你还要继续使用,但是你的数据库可能不一致并且处于损坏状态。尽最大可能从 backup 恢复,或者从具有完整数据的 replica set 中恢复,详见 复制集成员的重新同步