close

在一次機房斷電的過程中,

有一組Mongo Replica Set直接死去了...

本想說只要一個member可以用的話,那還好處理,但事與願違,三個Member都GG了.

所以沒有辦法用最直觀的方式 copy member來重新建立replica set.  ===>>> PASS

接著使用--repair的方式來修復資料,在已修復完成的database重新建立replica set,不幸的--repair也沒有成功,salvage到一半就出現Error了,經過查詢這是因為.wt檔有損壞的緣故.

而出現的Error為WiredTiger error (-31802) 與 WiredTiger error (0) . 然後提到了哪個.wt file出問題.   ===>>> PASS

 

後來看到了 MongoDB无法启动,如何恢复数据?與 MongoDB 无法启动,WiredTiger 如何恢复数据(二)? 兩篇文章,

決定來試試,這邊使用的mongodb 版本為4.0.9

WiredTiger公用工具修復

首先到  https://github.com/wiredtiger/wiredtiger  找到需要的wiredTiger工具

git clone https://github.com/wiredtiger/wiredtiger.git
cd wiredtiger
git tag -l  
git checkout tag_name

這邊注意盡量選擇與損壞的mongodb相同版本對應的tag, 以免採坑之類的,

接著編譯,

sh autogen.sh
yum install snappy-devel -y  ===>>> 必須安裝, 因為wt檔是有經過壓縮的
./configure --enable-snappy && make

接下來,就是從損壞的wt檔中打撈資料了

0. 先準備需要的檔案,裡面與網路上不同少了WiredTiger.basecfg,這邊使用的是mongodb 4.0.9也沒有這個檔案

wt 救援預備檔案.png

 

1. 先從damaged.wt中回復數據可使用的數據,並蓋掉原來的damaged.wt檔

./wt -v -h /root/tmp_mongo -C "extensions=[./ext/compressors/snappy/.libs/libwiredtiger_snappy.so]" -R salvage local/collection-0-1190597990432009500.wt
會出現
WT_SESSION.salvage 262500的字樣就是順利執行了

2. 將修復的wt檔內容dump出來(因為wt檔無法直接接上instance內,所以需要dump出來,再load回去,這邊會需要很多倍的空間= =)

./wt -v -h /root/tmp_mongo -C "extensions=[./ext/compressors/snappy/.libs/libwiredtiger_snappy.so]" -R dump -f /root/dump_file.dump local/collection-0-1190597990432009500

3. 在instance上新建一個collection,用來load回資料

use Recovery
db.recoveried.insert({test: 1})
db.recoveried.remove({})
db.recoveried.stats()
===>>> 找到實體檔名稱 ex : collection-xxxxxxx

./wt -v -h /root/mongo -C "extensions=[./ext/compressors/snappy/.libs/libwiredtiger_snappy.so]" -R load -f /root/dump_file.dump -r /root/mongo/Recovery/collection-xxxxxxx
成功後顯示table:collection-xxxxxxx: 10000000 
(這部分沒有實際執行,再dump的過程中,機器沒有足夠空間)

接著
db.repairDatabase() 修正統計數據,

最後

mongodump & mongorestore到運作/提供服務的instance上,收工...
 

參考

github wiredtiger 

WiredTiger Developer Site  

MongoDB 无法启动,WiredTiger 如何恢复数据(二)?

arrow
arrow
    創作者介紹
    創作者 abcg5 的頭像
    abcg5

    Aaron Yang

    abcg5 發表在 痞客邦 留言(0) 人氣()