目錄html
MongoDB 備份的幾種方式:算法
mongodump 是 MongoDB 官方提供的備份工具,它能夠從 MongoDB 數據庫讀取數據,並生成 BSON 文件,mongodump 適合用於備份和恢復數據量較小的 MongoDB 數據庫,不適用於大數據量備份。mongodb
默認狀況下 mongodump 不獲取 local 數據庫裏面的內容。數據庫
mongodump 僅備份數據庫中的文檔,不備份索引,因此咱們還原後,須要從新生成索引。json
mongodump 備份過程當中會對 mongod 服務的性能產生影響,咱們建議在業務低峯期進行操做。若是咱們備份的數據,大於系統內存,咱們備份的時候容易出現錯誤。併發
在執行 mongodump 的時候,mongod 服務仍是能夠提供服務的,能夠進行修改數據,若是咱們在備份的時候加上參數 --oplog 的話,那麼 oplog 是會記錄這一次操做的,若是咱們想在 restore 的時候也有日誌記錄,咱們可使用 mongorestore --oplogReplay 進行恢復運維
官方文檔:mongodump工具
mongodump 默認輸出的目錄名爲 dump ,若是輸出路徑包含 dump 目錄,會直接覆蓋的。 默認備份是沒有壓縮的。性能
參數:學習
--host <hostname><:port>, -h <hostname><:port> # 指定備份的主機ip和端口號,默認值localhost:27017 --port # 指定端口號 默認27017 --username <username>, -u <username> # 指定用戶名 --password <password>, -p <password> # 指定密碼 --authenticationDatabase <dbname> # 指定認證的數據庫 --authenticationMechanism <name> # 指定認證的算法 ,默認值 SCRAM-SHA-1 --db <database>, -d <database> # 指定備份的數據庫,未指定的話,備份全部的數據庫,但不包含local庫 --collection <collection>, -c <collection> # 指定備份的集合,未指定則備份指定庫中的全部集合。 --query <json>, -q <json> # 指定 json 做爲查詢條件。來備份咱們過濾後的數據。 --queryFile <path> # 指定 json 文檔路徑,以該文檔的內容做爲查詢條件,來備份咱們過濾後的數據。 --quit # 經過抑制 MongoDB的複製,鏈接等活動,來實現備份。 --gzip # 開啓壓縮,3.2版本後可使用,輸出爲文件的話會帶有後綴.gz --out <path>, -o <path> # 輸出的目錄路徑 --repir # 修復數據時使用 下面有詳細介紹 --oplog # mongodump 會將 mongodump 執行期間的 oplog 日誌 輸出到文件 oplog.bson,這就意味着從備份開始到備份結束的數據操做咱們均可以記錄下來。 --archive <file> # 輸出到單個存檔文件或者是直接輸出。 --dumpDbUsersAndRoles # 只有在 使用 --db 時才適用,備份數據庫的包含的用戶和角色。 --excludeCollection string # 排除指定的集合,若是要排除多個,使用多個--excludeCollection --numParallelCollections int, -j int # 並行導出的集合數,默認爲4 --ssl # 指定 TLS/SSL 協議 --sslCAFile filename # 指定認證文件名 --sslPEMKeyFile <filename> --sslPEMKeyPassword <value> --sslCRLFile <filename> --sslAllowInvalidCertificates --sslAllowInvalidHostnames --sslFIPSMode
示例:
排除指定的集合
mongodump --db test --excludeCollection=users --excludeCollection=salaries
指定ip,端口,用戶名,認證,壓縮,輸出目錄
mongodump --host mongodb1.example.net --port 37017 --username user --password "pass" --gzip --out /opt/backup/mongodump-2019-04-17
當咱們的刪除一個集合的數據,這個集合有10000條數據,那麼在 Oplog 裏面也是會有 10000條刪除記錄。
這樣的操做就會致使 Oplog 裏面的以前的操做記錄會被快速覆蓋。
因此咱們在備份的時候,須要注意 備份的間隔時間 和 Oplog 記錄被覆蓋的時間(也就是 Oplog 記錄了多長時間的日誌 )。要後者大於前者。
示例:
咱們的備份計劃是,天天備份一次數據,Oplog 記錄的保持時間要大於1天。
Oplog 的開啓是須要開啓副本集才能開啓的,因此以上備份策略是針對副本集。
咱們能夠直接複製數據文件,可是咱們必須在複製文件前中止對 MongoDB 的操做,不然咱們複製的文件是無效的。
注意如下操做是針對單節點。
在乎外關閉節點後,咱們進行從新節點,發現有以下的日誌錯誤:
2018-10-24T18:05:18.248-0400 W STORAGE [initandlisten] Detected unclean shutdown - mongod.lock is not empty. ... 2018-10-24T17:24:53.122-0400 E STORAGE [initandlisten] Failed to get the cursor for uri: table:collection-2-6854866147293273505 2018-10-24T17:24:53.122-0400 E STORAGE [initandlisten] This may be due to missing data files. ... ... ***aborting after fassert() failure
而且在 數據儲存路徑中有一個 mongod.lock 文件。
咱們可使用 mongod --repair
來恢復數據。
在MongoDB中4.0.3,對 WiredTiger 引擎,使用該命令會進行如下操做
- 重建全部索引
- 丟棄損壞的數據
- 爲殘缺的元數據建立存根文件。
對於MMAPv1 引擎
- 重建全部索引
- 丟棄損壞的數據
數據恢復流程:
先備份現有的數據
咱們能夠用 cp 命令將現有的數據的整個目錄的全部文件都備份一份。
使用 mongod --repair
# 針對 全部數據庫 mongod --repair # 針對 單個數據庫 mongod --dbpath /opt/mongodb/data/djx --repair
通常狀況下,你不該該手動刪除該
mongod.lock
文件。而是,使用上述過程來恢復數據庫。在嚴峻的狀況下,您能夠刪除文件,使用可能損壞的文件啓動數據庫,並嘗試從數據庫中恢復數據,但這存在風險。
咱們部分的數據都是二進制的,咱們直接查看是查看不到的,那麼咱們能夠經過工具 bsondump(安裝 MongoDB 自帶了) 來進行查看。
[root@djx uu_dev]# bsondump order_detail.bson 2019-04-17T16:14:51.430+0800 549 objects found {"_id":{"$oid":"5cae98d0f23d932dscdfc2ff"}} {"_id":{"$oid":"5cae98d0f23d932dscdfca00"}} {"_id":{"$oid":"5cae98d1f23d932dscdfca31"}} {"_id":{"$oid":"5cae98d1f23d932dscdfca32"}}
mongorestore
能夠建立新的數據庫或將數據添加到現有的數據庫,可是 mongorestore
僅僅執行insert
操做,不執行 update
操做。這就意味着若是將文檔還原到現有的數據庫,現有的數據庫中的文檔的_id
的值和要還原的文檔中的_id
值是同樣的,是不會將數據庫原有的值覆蓋的。mongorestore
會重建索引。mongorestore
不恢復 system.profile
的數據--help # 查看幫助 --quiet # 經過抑制 MongoDB的複製,鏈接等活動,來實現數據恢復。 --host <hostname><:port>, -h <hostname><:port> # 指定恢復的主機ip和端口號,默認值localhost:27017 --port # 指定端口號 默認27017 --username <username>, -u <username> # 指定用戶名 --password <password>, -p <password> # 指定密碼 --authenticationDatabase <dbname> # 指定認證的數據庫 --authenticationMechanism <name> # 指定認證的算法 ,默認值 SCRAM-SHA-1 --objcheck # 開啓驗證,驗證還原操做,確保沒有無效的文檔插入數據庫。會有較小的性能影響 --oplogReplay # 恢復備份數據並將 mongodump 執行期間的操做(記錄在導出的日誌)恢復。 --oplogLimit # 指定恢復 --oplogFile # 指定 Oplog 路徑 --keepIndexVersion # 阻止mongorestore在還原過程當中將索引升級到最新版本。 --restoreDbUsersAndRoles # 還原指定的數據庫用戶和角色。 --maintainInsertionOrder # 默認值爲False,若是爲 True,mongorestore 將按照輸入源的文檔順序插入,不然是 隨機執行插入。 --numParallelCollections int, -j int # 指定並行恢復的集合數。 --numInsertionWorkersPerCollection int # 默認值爲 1,指定每一個集合恢復的併發數,大數據量導入增長該值可提升 恢復速度。 --gzip # 從壓縮文檔中 恢復。 --archive # 從歸檔文件中恢復。 --dir # 指定還原數據儲存目錄。
mongorestore --collection people --db accounts dump/ mongorestore --host mongodb1.example.net --port 37017 --username user --password "pass" /opt/backup/mongodump-2011-10-24 mongorestore --gzip --archive=test.20150715.gz --db test mongorestore --archive=test.20150715.archive --db test
做者:理想三旬
出處:https://www.cnblogs.com/operationhome/
若是以爲文章寫得不錯,或者幫助到您了,請點個贊,加個關注哦。運維學習交流羣:544692191
本文版權歸做者全部,歡迎轉載,若是文章有寫的不足的地方,或者是寫得錯誤的地方,請你必定要指出,由於這樣不光是對我寫文章的一種促進,也是一份對後面看此文章的人的責任。謝謝。
分類: mongodb