在意外关闭后恢复自管理的独立运行实例
警告
以下步骤适用于独立运行的 mongod
实例版本 8.0。有关其他 MongoDB 版本,请参阅相应版本的手册。
请勿使用本教程恢复副本集的节点。相反,您应该从备份中恢复,或者从该集的另一个节点重新同步,具体操作请参阅重新同步自管理副本集的节点。
提示
如果您在启用日志记录功能的情况下运行,则几乎无需运行修复,因为服务器可以使用日志文件将数据文件自动恢复到干净状态。但是,如果需要从磁盘级数据损坏中恢复,则可能需要运行修复。
磁盘级数据损坏或丢失数据文件会阻止 mongod
实例启动,且日志文件可能不足以自动恢复:
2018-10-24T18:05:18.248-04:00 W STORAGE [initandlisten] Detected unclean shutdown - mongod.lock is not empty. ... 2018-10-24T17:24:53.122-04:00 E STORAGE [initandlisten] Failed to get the cursor for uri: table:collection-2-6854866147293273505 2018-10-24T17:24:53.122-04:00 E STORAGE [initandlisten] This may be due to missing data files. ... ... ***aborting after fassert() failure
在这种情况下,您的 dbPath
包含一个非空的 mongod.lock
文件。
下面的操作过程使用 mongod --repair
来从这些情况中进行恢复:
警告
仅当您没有其他选择时才使用 mongod --repair
。该操作会在修复过程中删除且不保存任何损坏的数据。
对于 WiredTiger 存储引擎,mongod --repair
:
为存在一个或多个不一致索引的集合重建所有索引。
丢弃损坏的数据。
为缺失的数据/元数据文件创建空/存根文件。
步骤
重要
以平常运行 mongod
进程的同一用户身份运行修复操作,以免更改 MongoDB 数据文件的权限。
注意
如果修复因故未能完成,则必须使用 --repair
选项重新启动实例才能完成修复。
[1] | 通常,您不应手动删除 mongod.lock 文件。相反,请使用上述过程恢复数据库。危急情况下,您可以删除此文件,使用可能损坏的文件启动数据库,并尝试从数据库中恢复数据。但是,在这些情况下将无法预计数据库的状态。 |