MongoDB 邏輯備份工具mongodump
阿新 • • 發佈:2020-06-16
mongodump是官方提供的一個對資料庫進行邏輯匯出的備份工具,匯出檔案為**BSON**二進位制格式,無法使用文字編輯工具直接檢視。mongodump可以匯出mongod或者mongos例項的資料,從叢集模式來看,可以備份單例項、副本集、分片集叢集。
mongodump作為MongoDB官方工具集中的一部分,從版本**4.4**開始,文件說明統一到工具分類中:**[database-tools][1]**。本文是基於**MongoDB 4.2** 社群版本,具體環境如下:
> OS:CentOS Linux release 7.6.1810 (Core)
>
> DB version:v4.2.2
因為安裝的二進位制版本,所以mongodump可執行檔案通過解壓壓縮包就可以得到。
## 主要選項
mongodump支援的選項不算太多,可以通過`--help`選項獲得:
```sh
mongodump --help
Usage:
mongodump
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(通用選項)
```sh
--help # 列印工具使用方式,選項說明。
--version # 列印工具版本並退出。
```
### connection options(連線選項)
```sh
-h, --host= # 指定連線的例項主機名或者IP地址。
--port= # 指定連線的例項埠號。
```
連線選項也可以分為三種例項模式:單例項、副本集、分片集。
- **Standalone(單例項)**
只指定選項`--host`
```sh
mongodump --host="192.168.196.128:27017"
```
同時指定選項`--host`和`--port`
```sh
mongodump --host="192.168.196.128" --port=27017
```
- **Replica Set(副本集)**
指定選項`--host`
```sh
mongodump --host="dbabdSet/192.168.196.128:27017,192.168.196.128:27018,192.168.196.128:27019"
```
預設情況下,mongodump讀取Primary節點的資料,如果想讀取Secondary節點的資料,則需要使用選項`readPreference`。
```sh
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節點進行匯出備份:
```sh
mongodump --host="192.168.196.128:27018"
```
### ssl options(安全連線選項)
```sh
--ssl
--sslCAFile=
--sslPEMKeyFile=
--sslPEMKeyPassword=
--sslCRLFile=
--sslAllowInvalidCertificates
--sslAllowInvalidHostnames
--sslFIPSMode
```
關於ssl安全加密協議連線,本文不過多的贅述,詳情可以參考官方文件:**[https://docs.mongodb.com/manual/reference/program/mongodump/index.html#cmdoption-mongodump-ssl][2]**。
### authentication options(驗證選項)
主要用於驗證連線例項的使用者的合法性。
```sh
-u, --username= # 指定連線使用者
-p, --password= # 指定連線使用者密碼
--authenticationDatabase= # 指定連線使用者驗證資料庫
--authenticationMechanism= # 指定連線驗證機制
```
注意:
如果需要在匯出時顯示指示輸入密碼,而不是直接寫在選項中,則在指定`--username`選項的同時,不指定`--password`或者為`--password`選項指定一個空值,如:**--password ""**。
如果沒有驗證資料庫,則mongodump假設指定匯出的資料庫中包含使用者的驗證資訊,如果沒有驗證資料庫並且也沒有指定匯出資料庫,則mongodump假設**admin**資料庫包含使用者的驗證資訊。
### **kerberos options(kerboeros驗證選項)**
該選項主要是基於kerberos驗證機制的連線驗證選項,kerberos只有MongoDB企業版才支援,本文基於社群版本,有關kerberos可以參考官方文件:**[https://docs.mongodb.com/manual/core/kerberos/][3]**。
### namespace options(名稱空間選項)
主要是指定需要邏輯備份的資料庫和集合。
```sh
-d, --db= # 指定資料庫
-c, --collection= # 指定集合
```
注意:
如果沒有指定匯出資料庫,則mongodump匯出例項中所有的資料庫,對於集合選項做相同的處理。
### uri options(uri連線串選項)
從版本**3.4.6**開始新增加一種連線MongoDB例項的字串格式,即URI。
```sh
--uri=mongodb-uri # 指定uri連線字串
```
- **Standalone(單例項)**
```sh
--uri="mongodb://192.168.196.128:27017"
# 開始訪問控制驗證
--uri="mongodb://dbabd:[email protected]:27017/?authSource=admin"
```
- **Replica Set(副本集)**
```sh
--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()方法的查詢表示式。
```sh
-q, --query= # 指定符合JSON v2拓展格式的查詢語句 如:'{"x":{"$gt":1}}'
--queryFile= # 指定包含JSON v2拓民格式查詢語句的檔案
--readPreference=| # 指定優先讀取順序 如:'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目錄裡。
```sh
-o, --out= # 指定匯出檔案儲存目錄
--gzip # 使用gzip對匯出檔案進行壓縮
--oplog # 指定儲存mongodump匯出期間的oplog日誌,檔名為oplog.bson
--archive= # 指定匯出檔案合併歸檔的目的地
--dumpDbUsersAndRoles # 指定匯出資料庫的使用者和角色定義
--excludeCollection= # 指定匯出時排除某個集合,如有多個,需要指定多次
--excludeCollectionsWithPrefix= # 指定匯出時排除多個相同命名字首的集合
-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輸出的顯示的詳細級別。
```sh
-v, --verbose= # 指定日誌輸出詳細級別,如:-vvvvv 或 指定數值
--quiet # 指定不輸出作何日誌資訊
```
## 使用示例
### 備份匯出資料庫
```sh
mongodump -h"192.168.196.128:27017" -uroot --authenticationDatabase admin -d dbabd -o /data/mongodump/
```
### 備份匯出資料庫某個集合
```sh
mongodump -h"192.168.196.128:27017" -uroot --authenticationDatabase admin -d dbabd -
c orders -o /data/mongodump/
```
### 備份匯出排除某個集合
```sh
# 如果有多個排除集合,則多次指定選項--excludeCollection
mongodump -h"192.168.196.128:27017" -uroot --authenticationDatabase admin -d dbabd -
-excludeCollection=orders -o /data/mongodump/
```
### 備份匯出檔案歸檔到檔案
```sh
mongodump -h"192.168.196.128:27017" -uroot --authenticationDatabase admin -d dbabd --archive=/data/mongodump/dbabd.archive
```
### 備份匯出檔案進行壓縮
```sh
mongodump -h"192.168.196.128:27017" -uroot --authenticationDatabase admin -d dbabd -
-gzip -o /data/mongodump/
```
### 備份匯出檔案進行壓縮並歸檔
```sh
mongodump -h"192.168.196.128:27017" -uroot --authenticationDatabase admin -d dbabd --gzip --archive=/data/mongodump/dbabd.archive
```
### 指定條件的備份匯出
```sh
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**][1]
[**https://docs.mongodb.com/manual/reference/program/mongodump/index.html#cmdoption-mongodump-ssl2**][2]
[**https://docs.mongodb.com/manual/core/kerberos/**][3]
**☆〖本人水平有限,文中如有錯誤還請留言批評指正!〗☆**
[1]:https://docs.mongodb.com/database-tools/mongodump
[2]:https://docs.mongodb.com/manual/reference/program/mongodump/index.html#cmdoption-mongodump-ssl2
[3]:https://docs.mongodb.com/manual/core/ke