使用WT工具恢復MongoDB數據


眾所周知MongoDB的底層存儲是由WiredTiger負責的,其數據文件也是.wt格式。既然如此,我們就有可能不通過MongoDB服務,而是直接用wt工具從數據文件中恢復數據。雖然我們通常推薦生產環境一定要配置復制集,但是很無奈,技術社區已經數次有人因為單機運行,最后硬盤損壞等原因導致無法啟動。wt工具作為最后一根稻草,可以在放棄治療前再嘗試挽救一下。

編譯

wt工具可以運行於Linux和Windows上。因為各自的操作系統和MongoDB版本不同,可能產生較多的組合。在使用時應該根據自己情況編譯適合的版本。下面以CentOS 7為例演示編譯過程。

1.安裝操作系統依賴
sudo yum install -y epel-release libtool automake snappy snappy-devel lz4 lz4-devel zstd zstd-devel libzstd-devel zlib zlib-devel git make vim-common
2. 准備源碼
git clone https://github.com/wiredtiger/wiredtiger.git
根據所使用的MongoDB版本,應該選擇正確的wt分支。例如我當前使用的MongoDB 4.4.1,那么同樣應該選擇WiredTiger的相應tagmongodb-4.4.1

> git tag | grep 4.4.1
mongodb-4.4.1
mongodb-4.4.1-rc0
mongodb-4.4.1-rc1
mongodb-4.4.1-rc2
mongodb-4.4.1-rc3
mongodb-4.4.10
mongodb-4.4.10-rc0
mongodb-4.4.11-rc0
> git checkout tags/mongodb-4.4.1 -b v4.4.1
  1. 編譯源碼
sh autogen.sh
./configure --disable-shared --with-builtins=lz4,snappy,zlib,zstd
make -j $(nproc)
make install

簡單起見我們使用了--disable-shared來將動態鏈接庫直接打包到執行文件中,這樣可以避免很多后續的麻煩,代價是生成的執行文件較大。

編輯數據

如果有幸dbpath中的其他文件沒有丟失,包括:

WiredTiger*

要恢復的集合的collection-xxx.wt

與要恢復集合相關的index文件

則可以直接使用wt工具恢復數據了:

wt dump file:collection-10--2280053313118266952.wt
不過,如果所有東西都還在的話,為什么還要用wt來恢復呢?所以我相信大部分人到這里都是跑不下去的。所以來看下一步,當你丟到只剩個褲衩子的時候該怎么辦。

數據恢復

wt讀取數據的基本前提條件是要有元數據,也就是WiredTiger*那堆文件。那我們就來嘗試構造這些文件:

mkdir temp
cd temp
touch WiredTiger WiredTiger.lock
wt list

為了簡單起見,后續步驟我們沒有使用wt來完成,而是使用MongoDB:

mongod --dbpath ./
啟動另一個窗口,使用mongo shell連接到當前實例:

mongo
任意創建一個集合,我們將把數據恢復到這個集合中:

db.dump.insert({x: 1});
db.dump.stats().wiredTiger.uri
# statistics:table:collection-7-666354062479792805

collection-7-666354062479792805.wt即我們要使用的目標文件名。此時應:

停止mongod(直接ctrl-c)

使用我們要恢復的文件覆蓋上述文件

cp collection-10--2280053313118266952.wt collection-7-666354062479792805.wt
讓wt幫我們修復文件:

wt salvage file:collection-7-666354062479792805.wt
重啟mongod進程:

mongod --dbpath ./
再次使用shell連接到MongoDB,在dump集合中即可找到我們要恢復的數據。

注意此時集合數據雖然恢復正常,但如果你count()就會發現返回結果是1。不用擔心,這個問題很容易修復:

db.dump.validate({full: true});
下面該怎么辦大家心里有數了嗎?

關於作者:張耀星

MongoDB大中華區首席咨詢顧問,供職於MongoDB售后服務團隊5年+,擁有近10年MongoDB使用經驗。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM