Mongodb

在 mongodb 中手動恢復丟棄的集合

  • August 6, 2019

一些集合被意外地從 mongodb 中刪除。雖然集合不存在,但在 dbpath 中有 6GB 的 dbname.0、dbname.1、…和 ​​dbname.ns

我們嘗試執行 mongod –repair 但沒有恢復文件,而是刪除了它們。

有沒有辦法恢復這些數據?也許部分?

我們正在使用獨立的 mongodb。

謝謝

我們嘗試執行 mongod –repair 但沒有恢復文件,而是刪除了它們。

修復和備份過程將(按設計)忽略已刪除的數據。根據您的問題中引用的文件名,您正在使用MMAP 儲存引擎。當在 MMAP 中刪除記錄時,記錄的前幾個字節將被覆蓋,並且預分配的儲存空間在空閒列表中被標記為可重複使用。您可以編寫自定義腳本來嘗試從已刪除的記錄中恢復有用的字節,但不支持這樣做的“撤消”過程。

希望您在執行之前備份了數據文件--repair。修復 MMAP 數據文件會導致數據文件的完全重建,並會釋放已刪除的集合和文件使用的預分配空間。在任何情況下,如果您嘗試從獨立的 MongoDB 部署中恢復或修復數據庫文件,建議您從停止 MongoDB 實例並對數據文件進行文件複製備份開始。

有沒有辦法恢復這些數據?也許部分?

您最好的選擇是從您最近的 MongoDB 備份中恢復。

在沒有備份的獨立 MMAP 部署中,唯一的其他可能性是編寫自定義數據恢復腳本來嘗試辨識和挽救已刪除的文件。這涉及到一些重要的猜測和手動清理數據的工作。刪除的記錄將失去一些基本資訊,例如相關 BSON 文件的大小,並且內部儲存可能會根據數據的來源而有所不同(例如,如果所有數據都是在特定版本的 MongoDB 中創建的,而不是數據通過連續主要版本升級的文件)。

請參閱StackOverflow:有沒有辦法恢復已刪除的文件?一些可能的方法。

也許,因為您使用的是 MMAPv1 和舊版本 (<3.0) mongodump,您可以使用 –dbPath 參數直接連接到這些文件。將數據轉儲到文件中,然後將其導入目前數據庫。

這是理論上的。

您是否嘗試過再次創建該數據庫,然後將這些文件(.ns 除外,只是 .)複製到新文件上?

引用自:https://dba.stackexchange.com/questions/189483