【问题标题】:Mongodb - Empty collections after EC2 crashMongodb - EC2 崩溃后的空集合
【发布时间】:2022-02-04 10:45:08
【问题描述】:

我有一个在 Elastic Beanstalk 管理的 EC2 上运行的节点应用程序。 由于某些问题,弹性豆茎删除了一个实例并重新创建了一个新实例。

我让 mongo 将它的数据库存储在一个单独的 Elastic Block Store 卷中,并且确实重新附加了卷、挂载等。

但是,当我尝试使用 systemctl 启动 mongodb 时,我遇到了各种错误。 我尝试了 --repair,将数据目录 chown 到 mongod,它终于工作了,但现在用户 db 已经消失,应用程序重新创建它并且所有集合都是空的,但我确实看到了大的 collection-x-xxxxxxx.wt 和 index-x-xxxxx.wt 文件在数据目录中。

我做错了什么? 有什么办法可以恢复数据。

PS:我确实尝试过 --repair 之前我看到了关于它如何删除所有损坏数据的警告

【问题讨论】:

  • 听起来您需要从备份中恢复。
  • 嗯,谢谢..,不过,我没有任何最近的备份.. 它只是我个人项目的数据库..

标签: node.js mongodb amazon-web-services


【解决方案1】:

我能够从collection-x-xxxxx.wt 文件中恢复......

在我“损坏”的 mongo 数据目录中,有一个 WiredTiger.wt.orig 文件和 WiredTiger.wt 文件。

如果我尝试通过删除 'orig' 扩展名来启动 mongod,mongod 将无法启动并开始显示像 WiredTiger.wt read error: failed to read 4096 bytes at offset 73728: WT_ERROR: non-specific WiredTiger error 这样的错误。

在搜索损坏的“WiredTiger”文件时,我遇到了this medium article关于在损坏的 WiredTiger 文件后修复 MongoDB。

文章中的步骤,我遵循它们:

  1. 停止 mongod。 (有空集合的那个)

  2. 将 mongod 指向一个新的数据目录

  3. 启动 mongod 并创建新的 db,以及与损坏的 mongo db 中的名称相同的新集合。

  4. 在每个集合中插入至少一个虚拟记录。

  5. 使用db.<insert-collectionName>.stats() 在这个新位置查找集合*.wt 文件的名称,查看输出的uri 属性。

  6. 停止 mongod。

  7. 将collection-x-xxxxx.wt从损坏的目录复制到新目录,并将它们重命名为步骤5中的相应目录。

    7.1。也就是说,如果您的名为“testCollection”的集合在损坏的目录中的 wt 集合文件名为 collection-1-1111111.wt,在新目录中的名称为 collection-6.6666666.wt,则您必须将“collection-1-1111111.wt”复制到新目录并将其重命名为collection-6.6666666.wt

    7.2。要查找“testCollection”的集合 wt 文件名,您可以在文本编辑器中打开 collection-x.xxxx.wt 文件并滚动查看“乱码”以查看与“testCollection”中的数据匹配的实际数据。 (我的在静止时没有加密)。

  8. 对您拥有的所有集合重复复制 - 重命名步骤。

  9. 使用 --repair 开关在新的数据库路径中运行修复,您可以在日志中看到 mongo 修复内容。

  10. 启动数据库。

  11. 完成后,验证集合,mongodump 从新数据库和 mongorestore 到新数据库并重新创建索引。

那篇文章是上帝派来的,我不敢相信它有效。感谢来自 Medium 的 Ido Ozeri

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 2012-09-05
    • 2020-06-19
    • 1970-01-01
    • 2023-01-18
    相关资源
    最近更新 更多