本文介紹如何將MongoDB物理備份文件中的數據恢復至本地自建單節點或副本集MongoDB數據庫。
前提條件
實例類型為副本集。
實例存儲類型為本地盤版。
實例未開啟TDE功能。
實例的存儲引擎為WiredTiger或RocksDB。如果實例的存儲引擎為TerarkDB ,請使用邏輯備份恢復至自建數據庫。
說明您可以在控制臺的基本信息頁面中查看實例的存儲引擎。
實例的存儲引擎為RocksDB時,您需要自行編譯安裝帶有RocksDB存儲引擎的MongoDB應用程序。
數據庫版本要求
云數據庫MongoDB版實例的版本必須對應自建MongoDB數據庫的版本。二者之間的對應關系如下:
MongoDB實例 | 自建MongoDB數據庫 |
3.2版本 | 3.2或3.4版本 |
3.4版本 | 3.4版本 |
4.0版本 | 4.0版本 |
4.2版本 | 4.2版本 |
物理備份文件格式說明
物理備份文件格式 | 文件后綴 | 說明 |
tar格式 | .tar.gz | 2019年03月26日之前創建的實例,物理備份文件格式為tar。 |
xbstream格式 | _qp.xb | 2019年03月26日及之后創建的實例,物理備份文件格式為xbstream。 說明 由于Windows暫未支持解壓此文件所需的percona-xtrabackup工具,因此xbstream格式僅限Linux系統中解壓使用。 |
環境說明
本文示例所用的服務器為阿里云ECS實例,鏡像為Ubuntu 16.04(64位),創建方法請參見創建ECS實例。
ECS服務器已安裝對應版本的MongoDB,安裝方法請參見MongoDB官方文檔。
ECS服務器已對MongoDB配置環境變量,執行命令時無需再輸入可執行文件的路徑。
/test/mongo/data作為MongoDB物理恢復操作的數據庫所在目錄。
/test/mongo/data1和/test/mongo/data2作為副本集節點的數據庫目錄。
步驟一:配置環境變量
對自建庫環境中的MongoDB配置環境變量,避免執行命令時繁瑣的路徑輸入步驟。在執行此步驟前,請確認您已安裝MongoDB。
如您已對MongoDB配置過環境變量,請跳過這一步進入步驟二:下載及解壓物理備份文件。
執行如下命令打開Linux系統的
profile
環境變量文件。sudo vi /etc/profile
鍵盤輸入
i
進入編輯模式,在最后一行輸入如下格式的內容:export PATH=$PATH:/<MongoDB服務端路徑>/bin
說明本示例中,MongoDB服務端的路徑為/test/mongo/bin,請根據您的實際情況配置路徑。
示例:
export PATH=$PATH:/test/mongo/bin
按Esc鍵退出編輯模式,鍵盤輸入
:wq
保存并退出。執行如下命令使新更改的環境變量文件生效:
source /etc/profile
步驟二:下載及解壓物理備份文件
下載MongoDB物理備份文件,您可以通過如下命令進行下載。
wget -c '<數據備份文件外網下載地址>' -O <自定義文件名>.<后綴>
說明請根據下載文件的類型,確保文件后綴名為
.tar.gz
或_qp.xb
。執行如下命令在/test/mongo/中新建一個
data
目錄,并將下載的MongoDB物理備份文件移動到/test/mongo/data/目錄中。mkdir -p /test/mongo/data && mv <物理備份文件名.后綴> /test/mongo/data
對物理備份文件執行解壓操作。
當下載的物理備份文件后綴為.tar.gz時,例如文件名為hins20190412.tar.gz時,請使用下述方法解壓。
cd /test/mongo/data/ && tar xzvf hins20190412.tar.gz
當下載的物理備份文件后綴為_qp.xb時,例如文件名為hins20190412_qp.xb,請使用下述方法解壓。
安裝percona-xtrabackup工具和qpress軟件包。詳情請參見PERCONA XtraBackup官網上的安裝步驟。
解壓物理備份文件,例如數據庫備份文件名為hins20190412_qp.xb。
# 進入文件所在目錄。 cd /test/mongo/data/ # 解包。 cat hins20190412_qp.xb | xbstream -x -v # 解壓物理備份文件。 innobackupex --decompress --remove-original /test/mongo/data
步驟三:以單節點模式恢復MongoDB物理備份的數據
執行如下命令在/test/mongo文件夾中新建配置文件mongod.conf。
touch /test/mongo/mongod.conf
在命令行中輸入
vi /test/mongo/mongod.conf
打開mongod.conf文件,鍵盤輸入i
開啟編輯模式。根據云數據庫MongoDB版的存儲引擎選擇啟動的配置模板,您可以將其復制到mongod.conf文件中。
說明配置文件設置了啟動模式為單節點模式并開啟認證功能。
WiredTiger存儲引擎
systemLog: destination: file path: /test/mongo/mongod.log logAppend: true security: authorization: enabled storage: dbPath: /test/mongo/data directoryPerDB: true net: port: 27017 unixDomainSocket: enabled: false processManagement: fork: true pidFilePath: /test/mongo/mongod.pid
說明云數據庫MongoDB默認使用的是WiredTiger存儲引擎,并且開啟了directoryPerDB選項,因此配置中指定了這個選項。
RocksDB存儲引擎
systemLog: destination: file path: /test/mongo/logs/mongod.log logAppend: true security: authorization: enabled? storage: dbPath: /test/mongo/data engine: rocksdb net: port: 27017 unixDomainSocket: enabled: false processManagement: fork: true pidFilePath: /test/mongo/mongod.pid
按Esc鍵退出編輯模式,鍵盤輸入
:wq
保存并退出。指定新建的配置文件mongod.conf來啟動MongoDB。
mongod -f /test/mongo/mongod.conf
等待啟動完成后,執行如下命令登錄MongoDB數據庫,進入Mongo Shell。
mongo --host 127.0.0.1 -u <username> -p <password> --authenticationDatabase admin
<username>:該MongoDB實例的數據庫賬號,默認為root。
<password>:該數據庫賬號對應的密碼。
說明如果您的密碼中包含特殊字符,則需要使用英文單引號(')包裹密碼,如:'test123!@#'。否則可能會登錄失敗。
在Mongo Shell中,執行
show dbs
查詢當前本地MongoDB中所有的數據庫,以驗證是否恢復成功。至此恢復工作已成功完成,您可以在Mongo Shell中執行
exit
命令退出Mongo Shell。
完成上述步驟后,您即可使用單節點模式啟動MongoDB數據庫,如需使用副本集模式啟動數據庫,請參見步驟四。
步驟四:副本集模式啟動MongoDB數據庫
由于云數據庫MongoDB的物理備份默認帶有原實例的副本集配置,您需要移除該配置才能使用副本集模式啟動,具體操作如下:
在命令行中通過服務器的Mongo Shell使用test用戶登錄MongoDB數據庫。
mongo --host 127.0.0.1 -u test -p <test用戶密碼> --authenticationDatabase admin
說明如果您的密碼中包含特殊字符,則需要使用英文單引號(')包裹密碼,如:'test123!@#'。否則可能會登錄失敗。
登錄成功后,執行下方代碼框中的命令完成如下動作:
在admin庫中創建一個臨時用戶,賦予該用戶臨時的local庫讀寫權限。
切換至臨時用戶移除local庫中原有副本集配置。
切換回test用戶刪除臨時用戶和臨時權限。
說明請將下列代碼中的
<test用戶密碼>
部分替換成您test用戶的密碼后再執行。
use admin db.runCommand({ createRole: "tmprole", roles: [ { role: "test", db: "admin" } ], privileges: [ { resource: { db: 'local', collection: 'system.replset' }, actions: [ 'remove' ] } ] }) db.runCommand({ createUser: "tmpuser", pwd: "tmppwd", roles: [ 'tmprole' ] }) db.auth('tmpuser','tmppwd') use local db.system.replset.remove({}) use admin db.auth('test','<test用戶密碼>') db.dropRole('tmprole') db.dropUser('tmpuser')
執行如下命令關閉MongoDB服務并退出Mongo Shell。
use admin db.shutdownServer() exit
創建副本集認證文件。
如需以副本集模式啟動MongoDB,您需要創建一個key文件作為每個副本集節點之間的認證文件。
執行如下命令在mongo目錄下創建keyFile文件夾作為認證文件的目錄,并在該目錄中創建一個key文件。
mkdir -p /test/mongo/keyFile && touch /test/mongo/keyFile/mongodb.key
執行
vi /test/mongo/keyFile/mongodb.key
打開mongodb.key文件,按鍵盤上的i
進入編輯模式,輸入加密內容。例如:MongoDB Encrypting File
說明加密內容有如下幾個限制
長度必須在6~1024個字符之間。
只能包含base64編碼中的字符。
不能包含等號(=)。
按Esc鍵退出編輯模式,輸入
:wq
保存并退出文件。在命令行中執行如下命令將認證文件的權限修改為
400
,保證該文件內容僅對該文件所有者可見。sudo chmod 400 /test/mongo/keyFile/mongodb.key
說明此認證文件將應用于所有副本集節點。
通過下列步驟為副本集準備兩個空的節點。
執行如下命令復制兩份mongod.conf文件分別作為另外兩個節點的啟動配置文件。
cp /test/mongo/mongod.conf /test/mongo/mongod1.conf && cp /test/mongo/mongod.conf /test/mongo/mongod2.conf
執行如下命令分別為另外兩個節點創建數據目錄。
mkdir -p /test/mongo/data1 && mkdir -p /test/mongo/data2
分別通過下列指示修改各節點的配置文件:
執行
vi /test/mongo/mongod.conf
打開節點1的配置文件,并按照如下內容修改完成后保存退出。systemLog: destination: file path: /test/mongo/mongod.log logAppend: true security: authorization: enabled keyFile: /test/mongo/keyFile/mongodb.key storage: dbPath: /test/mongo/data directoryPerDB: true net: bindIp: 127.0.0.1 port: 27017 unixDomainSocket: enabled: false processManagement: fork: true pidFilePath: /test/mongo/mongod.pid replication: replSetName: "rs0"
執行
vi /test/mongo/mongod1.conf
打開節點2的配置文件,并按照如下內容修改完成后保存退出。systemLog: destination: file path: /test/mongo/mongod1.log logAppend: true security: authorization: enabled keyFile: /test/mongo/keyFile/mongodb.key storage: dbPath: /test/mongo/data1 directoryPerDB: true net: bindIp: 127.0.0.1 port: 27018 unixDomainSocket: enabled: false processManagement: fork: true pidFilePath: /test/mongo/mongod1.pid replication: replSetName: "rs0"
執行
vi /test/mongo/mongod2.conf
打開節點3的配置文件,并按照如下內容修改完成后保存退出。systemLog: destination: file path: /test/mongo/mongod2.log logAppend: true security: authorization: enabled keyFile: /test/mongo/keyFile/mongodb.key storage: dbPath: /test/mongo/data2 directoryPerDB: true net: bindIp: 127.0.0.1 port: 27019 unixDomainSocket: enabled: false processManagement: fork: true pidFilePath: /test/mongo/mongod2.pid replication: replSetName: "rs0"
各重要參數說明如下:
systemLog.path下的path:當前節點的MongoDB日志文件路徑,
dbpath:當前節點的MongoDB數據文件路徑。
pidFilePath:當前節點的MongoDB的PID文件(記錄進程ID的文件)路徑。
keyFile:副本集認證文件路徑,所有節點必須使用同一個認證文件。
bindIp:當前節點的IP地址。如果是在同一臺服務器上部署副本集,所有節點可采用相同的IP地址。
port:當前節點的端口號。如果是在同一臺服務器上部署副本集,所有節點應采用不同的端口號。
replication:副本集配置。
replSetName:設置副本集的名稱。
執行如下命令啟動3個節點。
mongod -f /test/mongo/mongod.conf && mongod -f /test/mongo/mongod1.conf && mongod -f /test/mongo/mongod2.conf
等待啟動完成后,使用test賬號登錄MongoDB數據庫。
mongo --host 127.0.0.1 -u test -p <test賬號的密碼> --authenticationDatabase admin
說明如果您的密碼中包含特殊字符,則需要使用英文單引號(')包裹密碼,如:'test123!@#'。否則可能會登錄失敗。
在Mongo Shell中通過如下命令將上述步驟中創建的副本集成員節點加入副本集并初始化。
rs.initiate( { _id : "rs0", version : 1, members: [ { _id: 0, host: "127.0.0.1:27017" , priority : 1}, { _id: 1, host: "127.0.0.1:27018" , priority : 0}, { _id: 2, host: "127.0.0.1:27019" , priority : 0} ] })
初始化成功示例:
說明此步驟使用
rs.initiate()
命令進行操作,詳細命令用法請參見MongoDB官方文檔rs.initiate()命令介紹。執行成功后,新加入的兩個節點將會與主節點進行數據同步,注意此過程的耗時根據備份文件的大小會有較大差異。等待數據同步完成后,副本集模式啟動完成。
通過如下步驟驗證是否啟動成功。
執行
exit
退出Mongo Shell。執行如下命令重新登錄MongoDB數據庫。
mongo -u <username> -p <password> --authenticationDatabase admin
<username>:該MongoDB實例的數據庫賬號,默認為root。
<password>:該數據庫賬號對應的密碼。
說明如果您的密碼中包含特殊字符,則需要使用英文單引號(')包裹密碼,如:'test123!@#'。否則可能會登錄失敗。
觀察Mongo Shell命令行左側,顯示
<副本集名稱>:PRIMARY>
即代表副本集模式啟動成功。
常見問題
Q:為什么我使用指定的mongod.conf
配置文件啟動自建數據庫報錯?
A:常見原因如下:
您可能在指定
mongod.conf
配置文件之前已經啟動過一次數據庫,導致data目錄下自動生成了storage.bson
文件。只需要移走這個文件并重新指定mongod.conf
配置文件啟動數據庫即可。當前系統中可能已經有正在執行中的mongod進程,您可以通過
ps -e | grep mongod
命令查詢到mongod的進程ID,并通過kill <進程ID>
命令關閉mongod進程并重新指定mongod.conf
配置文件啟動數據庫即可。您可能沒有在
mongod.conf
配置文件中指定正確的systemLog.path日志路徑。請確保指定的路徑存在并且必須指定日志文件的名稱。如:path: /<日志文件路徑>/<日志文件名稱>.log
。
Q:為什么我使用指定的mongod.conf
配置文件啟動副本集模式報錯?
A:您可能沒有將指定的keyFile
認證文件的權限修改為600
。請在命令行中通過sudo chmod 600 <keyFile文件路徑>
修改權限后重新嘗試即可。
Q:為什么通過副本集模式啟動MongoDB數據庫后系統變得很卡?
A:因為啟動完成后系統會自動開始同步Primary節點的數據到其他節點,等待數據同步完成即可。