我有一个分片的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文档,所以我真的需要恢复这个
答案 0 :(得分:6)
如果您已经成功运行修复,那么您已经从头开始重写了所有数据,然后重建了索引,因此您已经拥有了全新的_id
索引 - 您已经有效地删除并重建了索引已经。
你有一个副本集(rs0),那么如果你降低当前的主要版本会发生什么? - 也是其他节点上的损坏,或只是一个?
如果只有一个,(或者至少你有一个没有问题的节点)然后用腐败擦除实例并让它们resync,它将从剩下的一个中提取数据“良好的“节点,摆脱腐败。这将是摆脱这种腐败的首选方法(到目前为止),它首先是副本集的预期用途之一。
如果这不是一个选项,并且所有节点都显示相同的问题(这很奇怪),那么您应该尝试执行以下操作:
mongod
最初用于存储的磁盘空间更多的磁盘空间。最后,您应该升级到更高版本的MongoDB,特别是在分片环境中。在撰写此答案时,当前版本为2.4.9并且有几个重要的错误修复 - 完整的详细信息可以在mongodb-announce上的发布公告中找到。