在數據庫運維過程中,如果運維不規范,未建立容災環境并未制定合適的備份策略并備份,在某些極端情況下(比如主機異常斷電),可能導致數據庫實例無法啟動。此時,怎么盡最大的可能拯救數據?
在Oracle中,提供了一些隱含參數或者方法讓數據庫強制啟動,并在撈出數據后重建數據庫,或者利用DUL等工具盡可能的進行數據提取。那么在mongodb數據庫的運維過程中,遭遇數據庫文件損壞,實例無法啟動的時候怎么辦?我們都知道Mongodb從3.2版開始,默認使用的wiredTiger開源存儲引擎,通過在github上下載wt引擎的源碼,可以編譯生成一個wt工具,利用該工具可以從mongodb數據文件中撈出數據。
軟件下載地址:https://github.com/wiredtiger/wiredtiger,安裝方法:
安裝依賴包
yum-y install snappy.x86_64 snappy-devel.x86_64
編譯安裝
./configure--enable-snappy –prefix=/usr/local/wiredTiger
make&&makeinstall
數據恢復
在mongodb數據目錄的文件結構中,包括數據庫文件和WiredTiger.wt等元數據文件,若元數據文件丟失,則會導致wt工具也無法恢復數據,出現類似如下報錯:
[1600001107:222670][28965:0x7f7a4a987740],file:WiredTiger.wt, connection: __posix_open_file, 715:/data/mongodb/WiredTiger.wt: handle-open: open: No such file ordirectory
如上圖所示,需保證紅框外的文件都在,才能從數據文件中抓取數據。
wt -v -h /data/mongodb -C"extensions=[/usr/local/wiredtiger/lib/libwiredtiger_snappy.so]"list –列出所有的對象名稱,由于WT引擎默認使用了snappy壓縮算法,所以需要使用extensions顯示指定類文件位置。
從數據文件中導出數據:
/usr/local/wiredtiger/bin/wt -v -h /data/mongodb -C"extensions=[/usr/local/wiredtiger/lib/libwiredtiger_snappy.so]" dump -f /home/mongo/a.dmp test/collection/7-6614138329248103296
導出的文件在此時不是json文件,不能直接讀取,需導入一個臨時數據庫中
>show dbs;
admin 0.000GB
config 0.000GB
local 0.000GB
>use test
>db.createCollection("test");
{"ok" : 1 }
>show tables;
test
>db.test.stats().wiredTiger.uri;
statistics:table:test/collection/0--2648066414802528487 --獲取臨時集合的數據文件信息
[mongo@node1~]$ mongod -f /etc/mongodb/mongodb1.conf ---shutdown##停止臨時數據庫,否則在導入的時候會報資源忙
[1600004969:259849][25396:0x7f9657853740],wiredtiger_open: __posix_file_lock, 410:/data/mongodb1/WiredTiger.lock: handle-lock: fcntl: Resourcetemporarily unavailable
[1600004969:259905][25396:0x7f9657853740],wiredtiger_open: __conn_single, 1720: WiredTiger database is alreadybeing managed by another process: Device or resource busy
數據導入:
[mongo@node1~]$ /usr/local/wiredtiger/bin/wt -v -h /data/mongodb1 -C"extensions=[/usr/local/wiredtiger/lib/libwiredtiger_snappy.so]"-R load -f /home/mongo/a.dmp -rtest/collection/0--2648066414802528487
file:test/collection/0--2648066414802528487:100002 --提示導入了100002個document
啟動數據庫,但是我們發現此時導入的數據可以find,但是count為0,如下圖:
此時,我們采用導出和導入的方法更新元數據
再次查詢,集合文檔數據量count可正常顯示,見下圖:
注:wt工具導出和導入數據只能按集合逐一進行,mongodump和mongorestore修復元數據,可以按庫多個集合同時修正。
本文檔使用的案例是在測試環境的測試案例。本文僅僅是提供一種在極端情況下盡可能救援數據的一種方法,但使用過程中也有諸多限制。本人認為,成熟的運維應該是制定完善的運維方案,建立合適的數據庫備份策略和數據庫容災架構,不到萬不得已,不使用此類非常規的手段恢復數據。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/130142.html
摘要:現在已經成為的官方標準,如,以及的擴展協議。作者簡介李會軍,聯合創始人,關注團隊協作領域,致力于用工具解決中小團隊的協作問題。 Worktile自上線兩年多以來,以良好的用戶體驗和穩定的服務,獲得了用戶的認可和喜愛。截止筆者寫這篇文章的時候,已經有超過10萬家團隊在使用Worktile。作為團隊協作工具,從技術上分析首先要解決如下幾個問題: 基于Web的跨平臺設計,讓用戶在任何地方都...
摘要:通過指定,并在生產線上關閉的接口來達到規避網絡進口的安全問題。避免同樣的悲劇在發生。上海小胖原創地址歡迎各位大神前來評論。每周五,敬請期待,上海小胖獨更。 序 原本這周想寫一個系列關于 GDPR(General Data Protection Regulation) MongoDB 的,但是昨天(2017.09.05)又爆出超2.6W 個MongoDB 節點被劫持。所以臨陣變卦,決定寫...
閱讀 1346·2023-01-11 13:20
閱讀 1684·2023-01-11 13:20
閱讀 1132·2023-01-11 13:20
閱讀 1858·2023-01-11 13:20
閱讀 4100·2023-01-11 13:20
閱讀 2704·2023-01-11 13:20
閱讀 1385·2023-01-11 13:20
閱讀 3597·2023-01-11 13:20