Mongo DB不变失败

时间:2015-07-07 16:11:32

标签: mongodb

我们的+ - 400Gb数据库正在我们的服务器上停止。

来自日志:

2015-07-07T09:09:51.072+0200 I STORAGE  [conn10] _getOpenFile() invalid file index requested 8388701
2015-07-07T09:09:51.072+0200 I -        [conn10] Invariant failure false src/mongo/db/storage/mmap_v1/mmap_v1_extent_manager.cpp 201
2015-07-07T09:09:51.082+0200 I CONTROL  [conn10]

我应该开始寻找什么?存储问题?

2 个答案:

答案 0 :(得分:2)

我正在回答这个问题,以防有些人再次犯同样的非技术性错误:

我尝试将scp目录中的所有文件/data/db发送到服务器。由于文件很多(dbname.1dbname.55,大约100GB),它在中间被中断(上一个成功的文件dbname.22),我重新启动并上传dbname.23dbname.55。当我在mongo客户端中运行查询时,它适用于某些情况,并且对于其他一些显示错误消息的问题与查询中的错误信息相同。我以为它可能是文件传输中的某个文件损坏,但是md5检查没问题。只有在我花了很长时间完成所有md5检查后才找到原因。

结果是scp上传dbname.21dbname.29上传了dbname.2,因此dbname.3 dbname.9从未上传$("#modalConfirm").hide(); 到服务器。我要上传它们,这应该可以解决问题。

答案 1 :(得分:1)

我今天遇到了这个变种。神秘地我的一个数据文件消失了(或者没有从另一个服务器迁移它)。没有任何修复/恢复过程可以工作,因为您引用的同一错误失败。幸运的是,我有一个单独的mongod,它有一个同名的集合,所以作为一个廉价的黑客,我把(不可否认的错误的)数据文件复制到另一台服务器,虽然我知道我不会得到任何数据,修复工具(例如mongod --repair)然后能够发挥他们的魔力,但正如预期的那样,他们从我复制的坏文件中恢复了一些数据,因此我不得不清除一些文档。幸运的是它是“mycollection.1”文件,只有128MB。

我不认为这适用于您的情况,因为您的日志所讨论的丢失数据文件的索引非常高。您的日志实际上是说无法找到/data/dbname/mycollection.8388701。你说你的数据集只有400GB,所以一个高的索引没有意义。您应该只有大约200个数据文件,因为默认情况下大多数都是2GB。 db.stats()(特别是fileSize属性)的结果是什么?

mongolab blog entry帮助我理解了数据文件结构。

我建议你应该从哪里开始寻找:

  1. 运行db.stats()命令以了解您的数据有多大 盘实际上是。
  2. 您的服务器是否有意义寻找具有疯狂高指数的数据文件?如果没有,问题不在于存储,而在于集合/数据库的范围和元数据。
  3. 您的维修工具有效吗?如果您的可用磁盘空间至少与数据集的大小相同(在磁盘上),请尝试使用mongod --repairdb.repairDatabase()工具开始修复。我假设它不起作用,因为我的修复尝试因同一个invalid file index requested错误而崩溃。
  4. 尝试像我一样复制一个“坏”文件,大致匹配丢失文件的样子(记住数据文件的文件大小不一样,尽力匹配它和试试修理)。如果这样做,您的数据文件将被清除(但它确实占用了大量磁盘空间)。
  5. 希望这有助于指明你正确的方向。