2012-07-26 93 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