MongoDB 邏輯備份工具mongodump
mongodump是官方提供的一個對資料庫進行邏輯導出的備份工具,導出文件為BSON二進位格式,無法使用文本編輯工具直接查看。mongodump可以導出mongod或者mongos實例的數據,從集群模式來看,可以備份單實例、副本集、分片集集群。
mongodump作為MongoDB官方工具集中的一部分,從版本4.4開始,文檔說明統一到工具分類中:database-tools。本文是基於MongoDB 4.2 社區版本,具體環境如下:
OS:CentOS Linux release 7.6.1810 (Core)
DB version:v4.2.2
因為安裝的二進位版本,所以mongodump可執行文件通過解壓壓縮包就可以得到。
主要選項
mongodump支援的選項不算太多,可以通過--help
選項獲得:
mongodump --help
Usage:
mongodump <options>
Export the content of a running server into .bson files.
選項分為幾個大類:
- general options:通用選項
- connection options:連接選項
- ssl options:安全連接選項
- authentication options:驗證選項
- kerberos options:基於kerboeros驗證選項
- namespace options:命名空間選項
- uri options:mongodb uri連接串選項
- query options:查詢選項
- output options:輸出選項
- verbosity options:顯示選項
general options(通用選項)
--help # 列印工具使用方式,選項說明。
--version # 列印工具版本並退出。
connection options(連接選項)
-h, --host=<hostname> # 指定連接的實例主機名或者IP地址。
--port=<port> # 指定連接的實例埠號。
連接選項也可以分為三種實例模式:單實例、副本集、分片集。
- Standalone(單實例)
只指定選項--host
mongodump --host="192.168.196.128:27017"
同時指定選項--host
和--port
mongodump --host="192.168.196.128" --port=27017
- Replica Set(副本集)
指定選項--host
mongodump --host="dbabdSet/192.168.196.128:27017,192.168.196.128:27018,192.168.196.128:27019"
默認情況下,mongodump讀取Primary節點的數據,如果想讀取Secondary節點的數據,則需要使用選項readPreference
。
mongodump --host="dbabdSet/192.168.196.128:27017,192.168.196.128:27018,192.168.196.128:27019" --readPreference=secondary
- Sharded Cluster(分片集群)
同Replica Set(副本集)相同的指定方式。
注意:
–host選項默認值為:localhost:27017
–port選項默認值為:27017
執行副本集的導出備份時通常單獨連接某個Secondary節點進行導出備份:
mongodump --host="192.168.196.128:27018"
ssl options(安全連接選項)
--ssl
--sslCAFile=<filename>
--sslPEMKeyFile=<filename>
--sslPEMKeyPassword=<password>
--sslCRLFile=<filename>
--sslAllowInvalidCertificates
--sslAllowInvalidHostnames
--sslFIPSMode
關於ssl安全加密協議連接,本文不過多的贅述,詳情可以參考官方文檔://docs.mongodb.com/manual/reference/program/mongodump/index.html#cmdoption-mongodump-ssl。
authentication options(驗證選項)
主要用於驗證連接實例的用戶的合法性。
-u, --username=<username> # 指定連接用戶
-p, --password=<password> # 指定連接用戶密碼
--authenticationDatabase=<database-name> # 指定連接用戶驗證資料庫
--authenticationMechanism=<mechanism> # 指定連接驗證機制
注意:
如果需要在導出時顯示指示輸入密碼,而不是直接寫在選項中,則在指定--username
選項的同時,不指定--password
或者為--password
選項指定一個空值,如:–password “”。
如果沒有驗證資料庫,則mongodump假設指定導出的資料庫中包含用戶的驗證資訊,如果沒有驗證資料庫並且也沒有指定導出資料庫,則mongodump假設admin資料庫包含用戶的驗證資訊。
kerberos options(kerboeros驗證選項)
該選項主要是基於kerberos驗證機制的連接驗證選項,kerberos只有MongoDB企業版才支援,本文基於社區版本,有關kerberos可以參考官方文檔://docs.mongodb.com/manual/core/kerberos/。
namespace options(命名空間選項)
主要是指定需要邏輯備份的資料庫和集合。
-d, --db=<database-name> # 指定資料庫
-c, --collection=<collection-name> # 指定集合
注意:
如果沒有指定導出資料庫,則mongodump導出實例中所有的資料庫,對於集合選項做相同的處理。
uri options(uri連接串選項)
從版本3.4.6開始新增加一種連接MongoDB實例的字元串格式,即URI。
--uri=mongodb-uri # 指定uri連接字元串
- Standalone(單實例)
--uri="mongodb://192.168.196.128:27017"
# 開始訪問控制驗證
--uri="mongodb://dbabd:[email protected]:27017/?authSource=admin"
- Replica Set(副本集)
--uri="mongodb://192.168.196.128:27017,192.168.196.128:27018,192.168.196.128:27019/?replicaSet=dbabdSet"
# 開始訪問控制驗證
--uri="mongodb://dbabd:[email protected]:27017,192.168.196.128:27018,192.168.196.128:27019/?authSource=admin&replicaSet=dbabdSet"
- Sharded Cluster(分片集群)
同Replica Set(副本集)相同的指定方式。
當指定--uri
連接串選項時,會與之前有關連接的選項互斥,這些選項包括:
- –host
- –port
- –db
- –username
- –password(如果–uri連接串有指定連接密碼的話)
- –authenticationDatabase
- –authenticationMechanism
因為–uri連接串中已經包含了以上選項所涉及的部分。
query options(查詢選項)
指定mongodump導出的條件,可以參考db.collections.find()方法的查詢表達式。
-q, --query=<json> # 指定符合JSON v2拓展格式的查詢語句 如:'{"x":{"$gt":1}}'
--queryFile=<json> # 指定包含JSON v2拓民格式查詢語句的文件
--readPreference=<string>|<json> # 指定優先讀取順序 如:'nearest' 或 '{mode: "nearest", tagSets: [{a: "b"}],maxStalenessSeconds: 123}')
--forceTableScan # 指定導出時遍歷集合使用的索引
注意:
如果指定--query
選項,則必須同時指定--collection
選項。
mongodump對於副本集默認優先讀取primary節點,如果需要從secondary,則指定選項–readPreference=secondary。
mongodump導出時遍歷集合時默認使用索引_id,如果要使用其他索引,則指定選項--forceTableScan
,該選項沒辦法確保mongodump導出基於某個時間點的快照,如果需要創建某一時間點的快照,則使用選項--oplog
,該選項不能與選項--query
一起使用。
output options(輸出選項)
指定mongodump導出時保存BSON文件的目錄,默認情況下,導出文件保存在執行mongodump當下目錄中的dump目錄里。
-o, --out=<directory-path> # 指定導出文件保存目錄
--gzip # 使用gzip對導出文件進行壓縮
--oplog # 指定保存mongodump導出期間的oplog日誌,文件名為oplog.bson
--archive=<file-path> # 指定導出文件合併歸檔的目的地
--dumpDbUsersAndRoles # 指定導出資料庫的用戶和角色定義
--excludeCollection=<collection-name> # 指定導出時排除某個集合,如有多個,需要指定多次
--excludeCollectionsWithPrefix=<collection-prefix> # 指定導出時排除多個相同命名前綴的集合
-j, --numParallelCollections= # 指定導出時可以並行的集合數,默認值為4
--viewsAsCollections # 指定導出時將只讀視圖當成集合保存成BSON文件
注意:
當指定選項--oplog
時,mongodump在導出過程中同時會保存這一時間點產生的oplog,並保存為oplog.bson文件,使導出的備份是實例基於某個時間點的快照,如果使用mongorestore還原進行oplog回放時,需要指定選項--oplogReplay
。如果沒有指定選項--oplog
,則無法保證當前的導出在這一時刻的一致性,在導出過程中有對資料庫進行作何的更新操作都會影響導出的文件變化。
如果mongodump指定選項--oplog
導出時客戶端執行以下命令會導致導出失敗:
- renameCollection
- db.collection.renameCollection()
- db.collection.aggregate()並且執行操作符$out
當mongodump連接mongos實例進行整個分片集群的導出備份時,指定選項--oplog
是沒有生效的,需要對各個分片節點集群單獨導出並指定--oplog
。
選項--oplog
只有在副本集所有成員都開啟oplog功能才會生效。
選項--oplog
並不會民出保存oplog的集合。
當mongodump指定選項--oplog
導出時,必須包括導出實例所有的資料庫和集合,即不能指定選項--db
只導出某個庫或選項--collection
只導出某個集合。
verbosity options(顯示選項)
指定導出時log輸出的顯示的詳細級別。
-v, --verbose=<level> # 指定日誌輸出詳細級別,如:-vvvvv 或 指定數值
--quiet # 指定不輸出作何日誌資訊
使用示例
備份導出資料庫
mongodump -h"192.168.196.128:27017" -uroot --authenticationDatabase admin -d dbabd -o /data/mongodump/
備份導出資料庫某個集合
mongodump -h"192.168.196.128:27017" -uroot --authenticationDatabase admin -d dbabd -
c orders -o /data/mongodump/
備份導出排除某個集合
# 如果有多個排除集合,則多次指定選項--excludeCollection
mongodump -h"192.168.196.128:27017" -uroot --authenticationDatabase admin -d dbabd -
-excludeCollection=orders -o /data/mongodump/
備份導出文件歸檔到文件
mongodump -h"192.168.196.128:27017" -uroot --authenticationDatabase admin -d dbabd --archive=/data/mongodump/dbabd.archive
備份導出文件進行壓縮
mongodump -h"192.168.196.128:27017" -uroot --authenticationDatabase admin -d dbabd -
-gzip -o /data/mongodump/
備份導出文件進行壓縮並歸檔
mongodump -h"192.168.196.128:27017" -uroot --authenticationDatabase admin -d dbabd --gzip --archive=/data/mongodump/dbabd.archive
指定條件的備份導出
mongodump -h"192.168.196.128:27017" -uroot --authenticationDatabase admin -d dbabd -c orders -q='{"price":{"$in":[25,50]}}' -o /data/mongodump/
注意
mongodump不會導出有關於local資料庫的內容;
mongodump不會導出文檔的索引,而只會導出文檔的數據,在導出文件還原之後需要重建索引;
對於開啟了訪問控制機制的實例,mongodump要執行導出操作的話必須對每個需要導出的資料庫具有find許可權,內建角色backup提供了備份所有資料庫的許可權,所以可以對用戶直接授予backup角色。
總結
對於MongoDB實例的邏輯備份工具,mongodump是個不二選擇,官方出品,安全穩定性有保障;
mongodump較適合數據量較少的備份,相對於數據量較大的情況,備份效率不是太高;
mongodump導出時比較消耗伺服器性能,而且不支援同時導出多個庫,對於導出庫數據的最終一致性選項--oplog
也只能是全庫導出才支援。
參考
//docs.mongodb.com/database-tools/mongodump
//docs.mongodb.com/manual/reference/program/mongodump/index.html#cmdoption-mongodump-ssl2
//docs.mongodb.com/manual/core/kerberos/
☆〖本人水平有限,文中如有錯誤還請留言批評指正!〗☆