【數(shù)據(jù)庫(kù)數(shù)據(jù)恢復(fù)】MongoDB數(shù)據(jù)庫(kù)啟動(dòng)失敗的數(shù)據(jù)恢復(fù)案例

數(shù)據(jù)庫(kù)數(shù)據(jù)恢復(fù)環(huán)境:
Windows Server操作系統(tǒng)服務(wù)器,部署MongoDB數(shù)據(jù)庫(kù)。
數(shù)據(jù)庫(kù)故障&分析:
在MongoDB數(shù)據(jù)庫(kù)服務(wù)未關(guān)閉的情況下,管理員將MongoDB數(shù)據(jù)庫(kù)文件從原分區(qū)拷貝到其他分區(qū),然后將MongoDB數(shù)據(jù)庫(kù)所在原分區(qū)格式化,格式化完成又將MongoDB數(shù)據(jù)庫(kù)文件拷回原分區(qū),啟動(dòng)MongoDB服務(wù)失敗并報(bào)錯(cuò)。

在MongoDB數(shù)據(jù)庫(kù)服務(wù)沒(méi)有關(guān)閉的情況下,直接拷貝MongoDB數(shù)據(jù)庫(kù)文件,mongod.lock和WiredTiger.lock這2個(gè)文件拷貝出來(lái)是有問(wèn)題的。正確的操作方法是:在拷貝出的數(shù)據(jù)庫(kù)文件中將這兩個(gè)文件刪除后再次啟動(dòng)服務(wù),這2個(gè)文件會(huì)由MongoDB自行重新生成。
通過(guò)檢測(cè)拷貝出的MongoDB數(shù)據(jù)庫(kù)文件發(fā)現(xiàn)_mdb_catalog.wt文件丟失。
_mdb_catalog.wt文件里存儲(chǔ)了MongoDB數(shù)據(jù)庫(kù)中所有集合的元數(shù)據(jù),MongoDB數(shù)據(jù)庫(kù)啟動(dòng)時(shí)需要從_mdb_catalog.wt文件中讀取相關(guān)信息。如果_mdb_catalog.wt文件丟失,MongoDB數(shù)據(jù)庫(kù)就無(wú)法獲取數(shù)據(jù)庫(kù)中集合對(duì)應(yīng)的名字、集合的創(chuàng)建選項(xiàng)、集合的索引信息等元數(shù)據(jù),數(shù)據(jù)庫(kù)無(wú)法啟動(dòng)。
數(shù)據(jù)庫(kù)數(shù)據(jù)恢復(fù)過(guò)程:
1、對(duì)MongoDB數(shù)據(jù)庫(kù)所涉及的硬盤(pán)以只讀方式進(jìn)行全盤(pán)鏡像備份,后續(xù)的數(shù)據(jù)分析和數(shù)據(jù)恢復(fù)操作都基于鏡像文件進(jìn)行,避免在恢復(fù)數(shù)據(jù)的過(guò)程中對(duì)原始數(shù)據(jù)造成二次破壞。
2、嘗試從文件系統(tǒng)的層面恢復(fù)_mdb_catalog.wt文件。掃描數(shù)據(jù)庫(kù)分區(qū)沒(méi)有發(fā)現(xiàn)和_mdb_catalog.wt文件相關(guān)的信息。根據(jù)MongoDB數(shù)據(jù)庫(kù)數(shù)據(jù)文件的特征值掃描數(shù)據(jù)庫(kù)分區(qū),也沒(méi)有發(fā)現(xiàn)和_mdb_catalog.wt相關(guān)的數(shù)據(jù)區(qū)域。所以可以斷定_mdb_catalog.wt文件已經(jīng)被徹底破壞,無(wú)法恢復(fù),只能從數(shù)據(jù)庫(kù)層面恢復(fù)數(shù)據(jù)了。
3、該案例中部署的MongoDB數(shù)據(jù)庫(kù)基于WT存儲(chǔ)引擎,可以使用WT實(shí)用工具包提取數(shù)據(jù)庫(kù)中的數(shù)據(jù)。下載WT實(shí)用工具包并在windows環(huán)境下編譯出可執(zhí)行的wt工具。

4、編譯完成后,北亞企安數(shù)據(jù)恢復(fù)工程師使用wt工具清洗數(shù)據(jù)庫(kù)的集合文件中的數(shù)據(jù),完成清洗后直接讀取文件中的數(shù)據(jù)并寫(xiě)入到一個(gè)dump文件中。將數(shù)據(jù)庫(kù)的各個(gè)集合文件中的全部可用數(shù)據(jù)提取出來(lái)。
5、創(chuàng)建一個(gè)MongoDB數(shù)據(jù)庫(kù),根據(jù)提取出的集合文件創(chuàng)建對(duì)應(yīng)數(shù)量的空集合。使用wt工具將提取出來(lái)的dump文件一一寫(xiě)入到新創(chuàng)建的空集合中。
6、通過(guò)查詢(xún)集合中的數(shù)據(jù)來(lái)確認(rèn)這些寫(xiě)入dump文件的集合與元數(shù)據(jù)庫(kù)中集合的對(duì)應(yīng)關(guān)系,修改集合名稱(chēng)并重建索引信息。
7、通過(guò)查詢(xún)集合中的記錄,確定記錄類(lèi)型。確定fs.files和fs.chunks集合的位置后,修改這兩個(gè)集合名稱(chēng)為xxx.files和xxx.chunks后并重建集合索引,集合恢復(fù)完成后就可以正常查看其中數(shù)據(jù)。


協(xié)助用戶(hù)方工程師對(duì)全部集合進(jìn)行索引重建之后,由用戶(hù)對(duì)數(shù)據(jù)庫(kù)進(jìn)行查詢(xún)驗(yàn)證,確認(rèn)數(shù)據(jù)無(wú)誤,本次數(shù)據(jù)恢復(fù)工作完成。