MongoDB 8.0:意外关闭后恢复自管理独立实例

启用了日志(journaling)时,几乎不需要运行修复操作,因为服务器可以利用日志文件,自动把数据文件恢复到一致的正常状态。但如果磁盘层面发生数据损坏,仍可能需要修复。

磁盘层面的损坏或数据文件缺失,可能导致 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 从这类情况中恢复。

对于 WiredTiger 存储引擎,mongod --repair 会:

  • 对具有一个或多个不一致索引的集合,重建该集合的全部索引。
  • 丢弃损坏的数据。
  • 为缺失的数据或元数据文件创建空文件/占位文件。

操作步骤

1. 备份数据文件

先为 --dbpath 指定目录中的数据文件创建备份副本。

2. 使用 --repair 启动 mongod

以 --repair 选项启动 mongod 实例来修复数据文件。对独立实例执行类似以下的命令:

mongod --dbpath /data/db --repair

完成后,dbpath 应包含修复后的数据文件,以及一个空的 mongod.lock 文件。

关于 mongod.lock

通常不应手动删除 mongod.lock,而应按以上步骤恢复数据库。极端情况下,可以删除它,用可能已经损坏的数据文件启动数据库,再尝试从中恢复数据;但在这种情况下,无法预测数据库会处于何种状态。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容