2012-07-26 71 views
3

我开始看到这在我的MongoDB生产数据库日志MongoDB的断言错误

ns:my_app_production.artists query:{ $query: {}, $orderby: { semester: 1, name: 1 } } 
Wed Jul 25 19:20:59 [conn199] Assertion: 10334:Invalid BSONObj spec size: -286331154 (EEEEEEEE) first element:_id: "agelio-batle" 
Wed Jul 25 19:20:59 [conn199] assertion 10334 Invalid BSONObj spec size: -286331154 (EEEEEEEE) first element:_id: "agelio-batle" 

开始我尝试运行修复

mongo --repair 
... 
Wed Jul 25 22:20:39 [initandlisten] Assertion: 10334:Invalid BSONObj spec size: -286331154 (EEEEEEEE) first element:_id: "agelio-batle" 
0x467eaa 0x4183ca 0x62dd82 0x643478 0x532b22 0x64d196 0x6578b7 0x65ac31 0x65cd75 0x65d6d9 0x51a419 0x6195f5 0x61b0c5 0x61bd3d 0x4914c8 0x47ad9a 0x5e2e7c 0x5e60b9 0x5e78ad 0x6346a2 
[0x467eaa] 
# several more what i assume memory addresses omitted 
[0x6346a2] 
Wed Jul 25 22:20:39 [initandlisten] assertion 10334 Invalid BSONObj spec size: -286331154 (EEEEEEEE) first element:_id: "agelio-batle" ns:my_app_production.artists query:{} 
Wed Jul 25 22:20:39 [initandlisten] exception in initAndListen std::exception: nextSafe(): { $err: "Invalid BSONObj spec size: -286331154 (EEEEEEEE) first element:_id: "a...", code: 10334 }, terminating 
Wed Jul 25 22:20:39 dbexit: 
... 

我也尝试从相同的结果蒙戈shell中运行db.repairDatabase();

我从来没有见过这个。通常用mongodb修复可以修复大多数问题,所以我不知道如何继续或解决这个问题。有任何想法吗?

+1

每当文档被删除时,大小将被设置为0xEEEEEEEE。查询使用的索引可能无法正确更新,并且指向此已删除的记录。修复应该已经解决了这个问题,但是你可以尝试重建索引吗?如果这仍然没有帮助,你会介意创建服务器票证(https://jira.mongodb.org/secure/CreateIssue!default.jspa)吗?如果您可以提供相关的数据文件,它也将非常有帮助。 – Ren 2012-07-26 15:19:19

+0

所以在转储/恢复和几次修复尝试后,我仍然有同样的问题。我对提交票据感到相当恐惧,所以我把它留下来,但我上传了涉及该问题所需的所有文件(我希望)https://jira.mongodb.org/browse/SERVER-6617 – brewster 2012-07-27 04:54:15

回答

1

如果整体修复失败,您可以使用--repair选项清除各个集合并尝试隔离问题。您甚至可以通过查询来过滤掉已损坏集合中的损坏数据,主要是处理不良数据,但这是一个增量且通常很慢的过程。这就是为什么总是建议采取备份并运行副本集以避免您留下潜在损坏数据集的情况。

也就是说,如果你有没有办法可以从备份或其他副本集成员恢复,那么你可以尝试喜欢(与数据库关闭)的东西:

mongodump --dbpath /path/to/source/data/files --repair --db <dbname> --out /path/to/repaired 

如果不工作,然后跳过读取索引(这可能会绊倒你):

mongodump --forceTableScan --dbpath /path/to/source/data/files --repair --db <dbname> --out /path/to/repaired 

由于仁的评论,你可以尝试在下降/重建索引其他的事情。表扫描选项(默认情况下mongodump会走_id索引)将避免使用转储的索引。所以假设你的路径和数据库名称是正确的,第二个选项应该工作。

+0

hmm ..那只是用我的dbname创建了一个空目录。 “试图恢复:艺术家的数据,然后直接到'dbexit' – brewster 2012-07-26 15:27:18