本文介紹如何將MongoDB物理備份檔案中的資料恢複至本地自建MongoDB資料庫。
前提條件
- 執行個體類型為複本集。
- 執行個體儲存類型為本地碟版。
- 執行個體未開啟TDE功能。
- 執行個體的儲存引擎為WiredTiger或RocksDB。如果執行個體的儲存引擎為TerarkDB ,請使用邏輯備份恢複至自建資料庫。說明
- 您可以在控制台的基本資料頁面中查看執行個體的儲存引擎。
- 執行個體的儲存引擎為RocksDB時,您需要自行編譯安裝帶有RocksDB儲存引擎的MongoDB應用程式。
資料庫版本要求
ApsaraDB for 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官網上的安裝步驟。
- 解壓物理備份檔案,例如Database Backup檔案名稱為hins20190412_qp.xb。
# 進入檔案所在目錄。 cd /test/mongo/data/ # 解包。 cat hins20190412_qp.xb | xbstream -x -v # 解壓物理備份檔案。 innobackupex --decompress --remove-original /test/mongo/data
- 當下載的物理備份檔案尾碼為.tar.gz時,例如檔案名稱為hins20190412.tar.gz時,請使用下述方法解壓。
步驟三:以單節點模式恢複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
說明 ApsaraDB for 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
- WiredTiger儲存引擎
- 按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資料庫
ApsaraDB for 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
說明 此認證檔案將應用於所有複本集節點。 - 執行如下命令在mongo目錄下建立keyFile檔案夾作為認證檔案的目錄,並在該目錄中建立一個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
- 執行如下命令複製兩份mongod.conf檔案分別作為另外兩個節點的啟動設定檔。
- 分別通過下列指示修改各節點的設定檔:
- 執行
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節點的資料到其他節點,等待資料同步完成即可。