MongoDB 備份與還原
一、 MongoDB 備份
MongoDB 備份的幾種方式:
- mongodump
- 系統快照(這里不做詳細介紹,具體內容見官網:Back Up with Filesystem Snapshots)
- cp 或者 rsync
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
示例:
-
排除指定的集合
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
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 引擎
- 重建所有索引
- 丟棄損壞的數據
數據恢復流程:
-
先備份現有的數據
我們可以用 cp 命令將現有的數據的整個目錄的所有文件都備份一份。
-
使用 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