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安全加密協議連接,本文不過多的贅述,詳情可以參考官方文檔:https://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可以參考官方文檔:https://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:admin@192.168.196.128: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:admin@192.168.196.128: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也只能是全庫導出才支持。

參考

https://docs.mongodb.com/database-tools/mongodump

https://docs.mongodb.com/manual/reference/program/mongodump/index.html#cmdoption-mongodump-ssl2

https://docs.mongodb.com/manual/core/kerberos/

〖本人水平有限,文中如有錯誤還請留言批評指正!〗

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※產品缺大量曝光嗎?你需要的是一流包裝設計!