在意外关闭后恢复自管理独立实例
警告
以下步骤适用于独立实例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数据文件的权限。
1
创建数据文件的备份。
在 --dbpath
中创建数据文件的备份。
注意
如果由于任何原因修复未能完成,您必须使用 --repair
选项重新启动实例以完成修复。
[1] | 通常,您不应手动删除 mongod.lock 文件。相反,应使用上述过程恢复数据库。在紧急情况下,您可以删除文件,使用可能已损坏的文件启动数据库,并尝试从数据库中恢复数据。然而,在这种情况下,数据库的状态是无法预测的。 |