2012-12-03 190 views
2

以前我的磁盤空間不足,mongodb停止工作。然後我增加了磁盤大小,但mongodb沒有開始工作。MongoDB修復命令失敗

雖然我已經啓用日誌記錄,我有執行以下命令
須藤-u的MongoDB的mongod --dbpath的/ var/lib中/的MongoDB/--repair

但這個修復命令得到了一個異常並停止修理和然後退出。

Fri Nov 30 13:29:36 [initandlisten] build index bd_production.news { _id: 1 } 

    Fri Nov 30 13:29:36 [initandlisten]  fastBuildIndex dupsToDrop:0 

    Fri Nov 30 13:29:36 [initandlisten] build index done. scanned 2549 total 
    records. 0.008 secs 

    Fri Nov 30 13:29:36 [initandlisten] bd_production.change_sets 
    Assertion failure isOk() src/mongo/db/pdfile.h 360 

    0x879d86a 0x85a9835 0x85e441e 0x84caa02 0x84c7d19 0x8229b5a 0x822bfd8 
0x875bd51 0x875f0c7 0x8760df4 0x83e6523 0x83b6c3b 0x8753b07 0x83b92bf 
0x8827ab7 0x882a53b 0x882d4bf 0x882d691 0x85ed280 0x81719dc 

mongod(_ZN5mongo15printStackTraceERSo+0x2a) [0x879d86a] 

mongod(_ZN5mongo10logContextEPKc+0xa5) [0x85a9835] 
... 
... 
... 
    ... some error msg 

    Fri Nov 30 13:29:36 [initandlisten] assertion 0 assertion 
    src/mongo/db/pdfile.h:360 ns:bd_production.change_sets 
    query:{} 

    Fri Nov 30 13:29:36 [initandlisten] problem detected during query over 
    bd_production.change_sets : { $err: "assertion 
    src/mongo/db/pdfile.h:360" } 

    Fri Nov 30 13:29:36 [initandlisten] query 
    bd_production.change_sets ntoreturn:0 keyUpdates:0 exception: 
    assertion src/mongo/db/pdfile.h:360 reslen:71 197ms 

    Fri Nov 30 13:29:36 [initandlisten] exception in initAndListen: 13106 
    nextSafe(): { $err: "assertion src/mongo/db/pdfile.h:360" }, terminating 

    Fri Nov 30 13:29:36 dbexit: 
    ... 
    ... 

新聞收集已成功修復,但'change_set'不能成功修復。

如何修復特定集合(change_set)或數據庫?

UPDATE: 當我運行--repair mongodump爲change_set收集我得到了以下錯誤消息:

Tue Dec 4 10:45:21 [tools]   backwards extent pass 
Tue Dec 4 10:45:21 [tools]    extent loc: 5:1181e000 
Tue Dec 4 10:45:21 [FileAllocator] allocating new datafile /home/suvankar/dd/bd_production.5, filling with zeroes... 
Tue Dec 4 10:45:21 [FileAllocator] creating directory /home/suvankar/dd/_tmp 
Tue Dec 4 10:45:21 [FileAllocator] done allocating datafile /home/suvankar/dd/bd_production.5, size: 511MB, took 0.042 secs 
Tue Dec 4 10:45:21 [tools]     warning: Extent not ok magic: 0 going to try to continue 
Tue Dec 4 10:45:21 [tools]     length:0 
Tue Dec 4 10:45:21 [tools]      ERROR: offset is 0 for record which should be impossible 
Tue Dec 4 10:45:21 [tools]      wrote 1 documents 
Tue Dec 4 10:45:21 [tools]    extent loc: 0:0 
Tue Dec 4 10:45:21 [tools]     ERROR: invalid extent ofs: 0 
Tue Dec 4 10:45:21 [tools]     5 objects 
Tue Dec 4 10:45:21 dbexit: 
Tue Dec 4 10:45:21 [tools] shutdown: going to close listening sockets... 
Tue Dec 4 10:45:21 [tools] shutdown: going to flush diaglog... 
Tue Dec 4 10:45:21 [tools] shutdown: going to close sockets... 
Tue Dec 4 10:45:21 [tools] shutdown: waiting for fs preallocator... 
Tue Dec 4 10:45:21 [tools] shutdown: lock for final commit... 

回答

4

如果mongod與維修不這樣做,那麼它運行到某個級別的腐敗,它無法修復或解決方法是啓動一組有效且正確的數據庫文件。

您可以運行mongodump with repair,在嘗試解決損壞問題時更具侵略性,並且不會啓動mongod實例(因此不需要文件是正確的以便繼續)。

mongodump --repair --dbpath /var/lib/mongodb/ <other options here> 

請注意,由於試圖繞過腐敗的方式,最終可能會有多個文檔副本。隨着mongorestore的工作方式,這不是一個問題,但根據腐敗的程度,最終可能會得到遠大於預期的轉儲文件。在極端極端的情況下,我曾經看到過10倍的數據,儘管這是例外而非規則。

一旦你把所有東西都拋棄到你滿意的程度,開始mongod清理並重新導入以恢復到良好的狀態。

+0

當我運行以下命令時,出現以下錯誤消息:$ sudo mongodump --repair --dbpath/var/lib/mongodb '如果您在同一路徑上運行mongod,則應該連接到該路徑而不是直接數據文件訪問 Mon Dec 3 21:53:14 dbexit: Mon Dec 3 21:53:14 [tools] shutdown:要關閉監聽套接字... Mon Dec 3 21:53:14 [tools] shutdown :要衝洗diaglog ... 。 Mon Dec 3 21:53:14 [tools] shutdown:關閉所有文件... Mon Dec 3 21:53:14 [tools] closeAllFiles()finished Mon Dec 3 21:53:14 dbexit:現在真的退出' – suvankar

+1

好的,所以有幾件事情 - 1.當你嘗試這個時,MongoDB不應該運行 - 我不認爲它是,但只是爲了確定; 2.您應該指定我們的輸出目錄(請參閱鏈接的命令頁上的選項); 3.你應該指定你試圖轉儲的數據庫(帶'--db')和可選的集合('--collection') - 基本上我的示例命令就是這樣一個示例,你需要提供一個完整的命令根據您的需求進行工作 –

+0

我已更正命令以運行修復與mongodump ...但沒有運氣!我得到的錯誤消息是在我的問題的更新部分。在執行命令後,它創建一個空的change_set.bson文件,但沒有創建元數據文件。其他收集工作正常。 – suvankar