启用了日志(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











暂无评论内容