我开始在我的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:
...
我也尝试从mongo shell运行db.repairDatabase();
并获得相同的结果。
我以前从未见过这个。通常使用mongodb修复大多数问题所以我不确定如何继续或解决这个问题。任何想法?
答案 0 :(得分:1)
如果整体修复失败,您可以使用--repair选项mongodump out个别集合,并尝试隔离问题。您甚至可以通过查询来过滤掉损坏的集合中的损坏数据,主要是处理坏数据,但这是一个增量且通常很慢的过程。这就是为什么始终建议采用备份并在副本集中运行以避免在可能损坏的数据集中留下的情况。
也就是说,如果你无法从备份或其他副本集成员恢复,那么你可以尝试类似的东西(关闭数据库):
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
感谢评论中的Ren,您可以尝试的另一件事是删除/重建索引。表扫描选项(默认情况下mongodump遍历_id索引)将避免使用转储索引。因此,假设您获得了正确的路径和数据库名称,则第二个选项应该有效。