1. 程式人生 > >MongoDB資料庫檔案損壞恢復資料全過程

MongoDB資料庫檔案損壞恢復資料全過程

一.故障描述

客戶裝置環境為一臺作業系統為Windows Server 2008的伺服器,部署MongoDB資料庫。由於業務需要,客戶在未關閉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工具。
MongoDB資料庫檔案損壞恢復資料全過程


圖二:
編譯完成後,使用wt工具,先對資料庫的集合檔案中的資料進行清洗,完成後,直接讀取檔案中的資料,寫入到一個dump檔案中。
這個時候我們就已經把資料庫的各個集合檔案中的全部可用資料提取出來了,下一步我們要做的就是還原資料庫環境。
重新建立一個MongoDB資料庫,根據我們提取出的集合檔案,建立對應數量的空集合,然後使用wt工具,將提取出來的dump檔案一一寫入到新建立的空集合中。這個時候就可以通過查詢集合中的資料,確認這些集合與元資料庫中集合的對應關係,修改集合名稱,重建索引資訊,到這,資料恢復基本就已經完成了。
通過查詢集合中的記錄,確定記錄型別,從而確定fs.files和fs.chunks集合的位置後,修改這兩個集合名稱為xxx.files和xxx.chunks後,重建集合索引,集合恢復完成,可以正常檢視其中資料:
MongoDB資料庫檔案損壞恢復資料全過程

圖三:
MongoDB資料庫檔案損壞恢復資料全過程
圖四:

四.資料驗證

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