1. 程式人生 > >MongoDB數據庫文件損壞恢復數據全過程

MongoDB數據庫文件損壞恢復數據全過程

catalog ces term oss 實用 關閉 roc 通過 特征

一.故障描述

客戶設備環境為一臺操作系統為Windows Server 2008的服務器,部署MongoDB數據庫。由於業務需要,客戶在未關閉MongoDB數據庫服務的情況下,對數據庫文件進行了拷貝。將數據庫文件拷貝到其他分區後,客戶對原數據庫分區進行了格式化操作,後將數據庫文件拷回原分區,重新啟動MongoDB服務,這時,客戶發現服務無法啟動。報錯如下:
技術分享圖片
圖一:

二.故障檢測

一般來說,在服務沒有關閉的情況下,直接對MongoDB數據庫文件進行拷貝,由於服務還在運行,會導致mongod.lock文件以及WiredTiger.lock文件拷貝出現錯誤,這個時候在拷貝出的文件中刪除這兩個文件,再次啟動服務,由MongoDB自行重新生成即可。

但是通過對客戶拷貝出的文件進行現場檢測發現,客戶拷貝出的數據庫文件中,_mdb_catalog.wt文件丟失。
mdb_catalog.wt文件裏存儲了MongoDB中所有集合的元數據,數據庫啟動時需要從這個文件中讀取相關的信息。由於此文件丟失,導致數據庫無法獲取數據庫中集合對應的名字,集合的創建選項,集合的索引信息等元數據,數據庫無法啟動。

三.數據恢復

首先我們嘗試從文件系統的角度對_mdb_catalog.wt文件進行恢復。
使用專業數據恢復軟件對數據庫分區進行掃描,查看掃描結果,並沒有_mdb_catalog.wt文件的信息。根據MongoDB數據庫中,數據文件的特征值,對數據庫分區進行掃描,也沒有發現_mdb_catalog.wt相關的數據區域。由此判斷,_mdb_catalog.wt文件已經被徹底覆蓋破壞,無法恢復。

此時只能從數據庫的層面想辦法提取其中的數據了。
客戶所部署的MongoDB數據庫是基於WT存儲引擎的數據庫系統,這樣的話我們就可以使用WT實用工具包提取數據庫中的數據。
首先下載WT實用工具包,然後再windows環境下編譯出可執行的wt工具。
技術分享圖片
圖二:
編譯完成後,使用wt工具,先對數據庫的集合文件中的數據進行清洗,完成後,直接讀取文件中的數據,寫入到一個dump文件中。
這個時候我們就已經把數據庫的各個集合文件中的全部可用數據提取出來了,下一步我們要做的就是還原數據庫環境。
重新創建一個MongoDB數據庫,根據我們提取出的集合文件,創建對應數量的空集合,然後使用wt工具,將提取出來的dump文件一一寫入到新創建的空集合中。這個時候就可以通過查詢集合中的數據,確認這些集合與元數據庫中集合的對應關系,修改集合名稱,重建索引信息,到這,數據恢復基本就已經完成了。
通過查詢集合中的記錄,確定記錄類型,從而確定fs.files和fs.chunks集合的位置後,修改這兩個集合名稱為xxx.files和xxx.chunks後,重建集合索引,集合恢復完成,可以正常查看其中數據:
技術分享圖片
圖三:
技術分享圖片
圖四:

四.數據驗證

協助客戶對全部集合進行索引重建之後,客戶對數據庫整體進行查詢驗證,數據無誤,此次數據恢復圓滿成功。

MongoDB數據庫文件損壞恢復數據全過程