使用WT工具恢復MongoDB資料

MongoDB中文社群發表於2021-12-13

眾所周知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 

      根據所使用的MongoDB版本,應該選擇正確的 wt 分支。例如我當前使用的 MongoDB 4.4.1那麼同樣應該選擇WiredTiger的相應tag mongodb-4.4.1

        > git tag | grep 4.4.1mongodb-4.4.1mongodb-4.4.1-rc0mongodb-4.4.1-rc1mongodb-4.4.1-rc2mongodb-4.4.1-rc3mongodb-4.4.10mongodb-4.4.10-rc0mongodb-4.4.11-rc0> git checkout tags/mongodb-4.4.1 -b v4.4.1

        3. 編譯原始碼

          sh autogen.sh./configure --disable-shared --with-builtins=lz4,snappy,zlib,zstdmake -j $(nproc)make install

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


          編輯資料


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

          • WiredTiger*

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

          • 與要恢復集合相關的index檔案

          則可以直接使用 wt工具恢復資料了:

            wt dump file:collection-10--2280053313118266952.wt

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


            資料恢復



            wt 讀取資料的基本前提條件是要有後設資料,也就是 WiredTiger* 那堆檔案。那我們就來嘗試構造這些檔案:

              mkdir tempcd temptouch WiredTiger WiredTiger.lockwt list

              為了簡單起見,後續步驟我們沒有使用 wt 來完成 ,而是使用 Mon goDB

                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使用經驗。


                            來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69961190/viewspace-2847445/,如需轉載,請註明出處,否則將追究法律責任。

                            相關文章