3

我开始在我的 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: 
...

我也尝试db.repairDatabase();从 mongo shell 运行,结果相同。

我以前从未见过这种情况。通常使用 mongodb 修复可以修复大多数问题,所以我不确定如何继续或解决此问题。有任何想法吗?

4

1 回答 1

1

如果整体修复失败,您可以使用 --repair 选项 mongodump 出单个集合并尝试隔离问题。您甚至可以传入查询以从损坏的集合中过滤掉损坏的数据,本质上是在处理坏数据,但这是一个增量且通常很慢的过程。这就是为什么总是建议进行备份并在副本集中运行以避免留下可能损坏的数据集的情况。

也就是说,如果您无法从备份或另一个副本集成员中恢复,那么您可以尝试类似(关闭数据库):

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 索引)将避免使用转储索引。因此,假设您获得了正确的路径和数据库名称,则第二个选项应该可以工作。

于 2012-07-26T15:15:43.573 回答