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