MongoDb腐败收藏?

时间:2014-01-29 13:59:56

标签: mongodb

我有一个分片的Mongo 2.4.3设置

当我想尝试在我的某个集合上运行查询时,我收到错误exception: BSONObj size: 0 (0x00000000) is invalid. Size must be between 0 and 16793600(16MB) First element: EOO

我已经运行了db.repairDatabase,但这似乎没有多大帮助。

当我做db.collection.findOne()时,它运行良好,但是当我做db.collection.find({'_id': {'$gte': ObjectId("52631d000000000000000000")}},我收到上述错误。

我读过这可能是因为索引损坏,所以我试过了:

db.collection.reIndex();
{
    "raw" : {
        "rs0/ec2-xx-xxx-xxx-xxx.us-west-2.compute.amazonaws.com:27017,ec2-xx-xxx-xxx-xxx.us-west-2.compute.amazonaws.com:27017,ec2-xx-xx-xxx-xx.us-west-2.compute.amazonaws.com:27017" : {
            "nIndexesWas" : 2,
            "errmsg" : "exception: BSONObj size: 0 (0x00000000) is invalid. Size must be between 0 and 16793600(16MB) First element: EOO",
            "code" : 10334,
            "ok" : 0
        }
    },
    "ok" : 0,
    "errmsg" : "{ rs0/ec2-xx-xxx-xxx-xxx.us-west-2.compute.amazonaws.com:27017,ec2-xx-xxx-xxx-xxx.us-west-2.compute.amazonaws.com:27017,ec2-xx-xxx-xxx-xx.us-west-2.compute.amazonaws.com:27017: \"exception: BSONObj size: 0 (0x00000000) is invalid. Size must be between 0 and 16793600(16MB) First element: EOO\" }"
}

在执行此操作之前,我还删除了所有索引,只剩下_id上的那个

db.collection.getIndexes();
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "ns" : "db.collection",
        "name" : "_id_"
    }
]

仍然没有运气,我这里的想法已经不多了。有人有另一个建议吗?该集合有大约900M文档,所以我真的需要恢复这个

1 个答案:

答案 0 :(得分:6)

如果您已经成功运行修复,那么您已经从头开始重写了所有数据,然后重建了索引,因此您已经拥有了全新的_id索引 - 您已经有效地删除并重建了索引已经。

你有一个副本集(rs0),那么如果你降低当前的主要版本会发生什么? - 也是其他节点上的损坏,或只是一个?

如果只有一个,(或者至少你有一个没有问题的节点)然后用腐败擦除实例并让它们resync,它将从剩下的一个中提取数据“良好的“节点,摆脱腐败。这将是摆脱这种腐败的首选方法(到目前为止),它首先是副本集的预期用途之一。

如果这不是一个选项,并且所有节点都显示相同的问题(这很奇怪),那么您应该尝试执行以下操作:

  1. 使用--repair运行整个实例(即关闭mongod进程,然后重新启动),并让它从头开始重建所有数据(本地,所有数据库,所有索引)。
  2. 如果且仅当没有删除损坏时,那么最后的方法是尝试mongodump --repair - 此方法将尝试所有合理的方法来解决问题,并且可能会产生重复的文件(取决于腐败程度)。因此,您可能需要比mongod最初用于存储的磁盘空间更多的磁盘空间。
  3. 最后,您应该升级到更高版本的MongoDB,特别是在分片环境中。在撰写此答案时,当前版本为2.4.9并且有几个重要的错误修复 - 完整的详细信息可以在mongodb-announce上的发布公告中找到。