MongoDB 備份與還原 mongodump、mongorestore


MongoDB 備份與還原

一、 MongoDB 備份

MongoDB 備份的幾種方式:

1、mongodump

​ mongodump 是 MongoDB 官方提供的備份工具,它可以從 MongoDB 數據庫讀取數據,並生成 BSON 文件,mongodump 適合用於備份和恢復數據量較小的 MongoDB 數據庫,不適用於大數據量備份。

默認情況下 mongodump 不獲取 local 數據庫里面的內容。

​ mongodump 僅備份數據庫中的文檔,不備份索引,所以我們還原后,需要重新生成索引。

​ mongodump 備份過程中會對 mongod 服務的性能產生影響,我們建議在業務低峰期進行操作。如果我們備份的數據,大於系統內存,我們備份的時候容易出現錯誤。

在執行 mongodump 的時候,mongod 服務還是可以提供服務的,可以進行修改數據,如果我們在備份的時候加上參數 --oplog 的話,那么 oplog 是會記錄這一次操作的,如果我們想在 restore 的時候也有日志記錄,我們可以使用 mongorestore --oplogReplay 進行恢復

1.1、mongodump常用命令和參數

官方文檔: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

示例:

  1. 排除指定的集合

    mongodump  --db test --excludeCollection=users --excludeCollection=salaries
    
  2. 指定ip,端口,用戶名,認證,壓縮,輸出目錄

    mongodump --host mongodb1.example.net --port 37017 --username user --password "pass" --gzip --out /opt/backup/mongodump-2019-04-17
    

1.2 、注意

當我們的刪除一個集合的數據,這個集合有10000條數據,那么在 Oplog 里面也是會有 10000條刪除記錄。

這樣的操作就會導致 Oplog 里面的之前的操作記錄會被快速覆蓋。

所以我們在備份的時候,需要注意 備份的間隔時間 和 Oplog 記錄被覆蓋的時間(也就是 Oplog 記錄了多長時間的日志 )。要后者大於前者。

示例:

​ 我們的備份計划是,每天備份一次數據,Oplog 記錄的保持時間要大於1天。

Oplog 的開啟是需要開啟副本集才能開啟的,所以以上備份策略是針對副本集。

2 、cp 或者rsync

​ 我們可以直接復制數據文件,但是我們必須在復制文件前停止對 MongoDB 的操作,否則我們復制的文件是無效的。

3、單節點意外關閉后,如何恢復數據

注意以下操作是針對單節點。

在意外關閉節點后,我們進行重新節點,發現有如下的日志錯誤:

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 引擎

  • 重建所有索引
  • 丟棄損壞的數據

數據恢復流程:

  1. 先備份現有的數據

    我們可以用 cp 命令將現有的數據的整個目錄的所有文件都備份一份。

  2. 使用 mongod --repair

    # 針對 所有數據庫
    mongod --repair 
    # 針對 單個數據庫
    mongod --dbpath /opt/mongodb/data/djx  --repair
    

一般情況下,你不應該手動刪除該mongod.lock文件。而是,使用上述過程來恢復數據庫。在嚴峻的情況下,您可以刪除文件,使用可能損壞的文件啟動數據庫,並嘗試從數據庫中恢復數據,但這存在風險。

4、查看備份數據

我們部分的數據都是二進制的,我們直接查看是查看不到的,那么我們可以通過工具 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"}}

二、MongoDB 還原

1、mongorestore特點

  • mongorestore 可以創建新的數據庫或將數據添加到現有的數據庫,但是 mongorestore 僅僅執行insert 操作,不執行 update操作。這就意味着如果將文檔還原到現有的數據庫,現有的數據庫中的文檔的_id的值和要還原的文檔中的_id 值是一樣的,是不會將數據庫原有的值覆蓋的。
  • 重建索引,mongorestore 會重建索引。
  • mongorestore 不恢復 system.profile 的數據

2、mongorestore 常用參數

--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 # 指定還原數據儲存目錄。

3、還原示例

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


免責聲明!

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



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