【數(shù)據(jù)庫數(shù)據(jù)恢復(fù)】MongoDB數(shù)據(jù)庫數(shù)據(jù)恢復(fù)案例

MongoDB數(shù)據(jù)庫數(shù)據(jù)恢復(fù)環(huán)境:
MongoDB數(shù)據(jù)庫部署在一臺虛擬機(jī)上,虛擬機(jī)操作系統(tǒng)為Windows Server2012。

由于業(yè)務(wù)發(fā)展需求,需要對MongoDB數(shù)據(jù)庫內(nèi)的文件進(jìn)行遷移,在MongoDB服務(wù)開啟的狀態(tài)下用戶將數(shù)據(jù)庫文件復(fù)制到其他分區(qū),將MongoDB數(shù)據(jù)庫之前所在分區(qū)進(jìn)行了格式化操作。遷移后用戶發(fā)現(xiàn)數(shù)據(jù)庫文件無法使用,將數(shù)據(jù)庫文件拷貝回原分區(qū)后MongoDB數(shù)據(jù)庫依然無法正常使用,報(bào)錯“Windows無法啟動MongoDB服務(wù)(位于 本地計(jì)算機(jī) 上)錯誤1067:進(jìn)程意外終止。”

Tips:在MongoDB服務(wù)開啟狀態(tài)下拷貝數(shù)據(jù)庫文件會導(dǎo)致mongod.lock和WiredTiger.lock這兩個文件拷貝出錯,如果出現(xiàn)這種情況,我們可以在拷貝文件中找到這兩個文件并刪除,然后再次嘗試啟動MongoDB數(shù)據(jù)庫,在數(shù)據(jù)庫重新啟動后會自動重新生成這兩個文件,數(shù)據(jù)庫即可正常使用。
數(shù)據(jù)庫數(shù)據(jù)恢復(fù)工程師檢查用戶遷移出的數(shù)據(jù)庫文件后沒有找到_mdb_catalog.wt文件。mdb_catalog.wt文件是專門用于存儲MongoDB數(shù)據(jù)庫中所有集合元數(shù)據(jù)的文件,數(shù)據(jù)庫啟動時所必須讀取的相關(guān)信息都存儲于mdb_catalog.wt文件中。所以,北亞數(shù)據(jù)恢復(fù)工程師推斷導(dǎo)致MongoDB數(shù)據(jù)庫啟動報(bào)錯的原因應(yīng)該是mdb_catalog.wt文件丟失,數(shù)據(jù)庫無法讀取集合對應(yīng)的WT table名字,集合的創(chuàng)建選項(xiàng),集合的索引信息等元數(shù)據(jù)。
MongoDB數(shù)據(jù)庫數(shù)據(jù)恢復(fù)過程:
1、掃描MongoDB數(shù)據(jù)庫分區(qū)的底層數(shù)據(jù),結(jié)果沒有找到關(guān)于_mdb_catalog.wt文件的信息。多次調(diào)整掃描方式進(jìn)行掃描仍然無法查找到_mdb_catalog.wt的相關(guān)信息,數(shù)據(jù)恢復(fù)工程師判斷該文件已被覆蓋,無法通過_mdb_catalog.wt文件修復(fù)MongoDB數(shù)據(jù)庫。
2、數(shù)據(jù)恢復(fù)工程師調(diào)整策略,由于該MongoDB數(shù)據(jù)庫是基于WiredTiger存儲引擎,于是北亞數(shù)據(jù)恢復(fù)工程師在Windows環(huán)境下編譯出可執(zhí)行的wt工具。

3、借助編譯后的wt工具清洗回寫MongoDB數(shù)據(jù)庫集合文件內(nèi)所有數(shù)據(jù),讀取數(shù)據(jù)結(jié)果并寫入到文件中。
4、創(chuàng)建一個全新的MongoDB數(shù)據(jù)庫并創(chuàng)建相應(yīng)數(shù)據(jù)量的集合,將文件逐一寫入到集合中,查詢數(shù)據(jù)集并重建索引信息。
5、通過查詢集合中的記錄,確定記錄類型,重建集合索引,集合恢復(fù)完成后可以正常查看其中數(shù)據(jù):


6、協(xié)助用戶對全部集合進(jìn)行索引重建后,由用戶對MongoDB數(shù)據(jù)庫進(jìn)行查詢驗(yàn)證,確定數(shù)據(jù)無誤,本次數(shù)據(jù)恢復(fù)工作完成。