您可以通過控制臺(tái)下載MongoDB實(shí)例的物理備份數(shù)據(jù)。本文介紹如何將MongoDB物理備份中的數(shù)據(jù)恢復(fù)至本地自建的MongoDB數(shù)據(jù)庫中。

前提條件

  • 實(shí)例類型為副本集。
  • 實(shí)例存儲(chǔ)類型為本地盤版。
  • 實(shí)例未開啟TDE功能
  • 實(shí)例的存儲(chǔ)引擎為WiredTigerRocksDB。如果實(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.23.4版本
3.4版本3.4版本
4.0版本4.0版本
4.2版本4.2版本

物理備份文件格式說明

物理備份文件格式文件后綴說明
tar格式.tar.gz20190326日之前創(chuàng)建的實(shí)例,物理備份文件格式為tar。
xbstream格式_qp.xb20190326日及之后創(chuàng)建的實(shí)例,物理備份文件格式為xbstream。
說明 由于Windows暫未支持解壓此文件所需的percona-xtrabackup工具,因此xbstream格式僅限Linux系統(tǒng)中解壓使用。
說明 上述兩種格式的文件,對(duì)應(yīng)的解壓操作有所不同,詳情請(qǐ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

說明 如您已對(duì)MongoDB配置過環(huán)境變量,請(qǐng)?zhí)^這一步進(jìn)入步驟二:下載及解壓物理備份文件
  1. 執(zhí)行如下命令打開Linux系統(tǒng)的profile環(huán)境變量文件。
    sudo vi /etc/profile
  2. 鍵盤輸入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í)際情況配置路徑。
  3. Esc鍵退出編輯模式,鍵盤輸入:wq保存并退出。
  4. 執(zhí)行如下命令使新更改的環(huán)境變量文件生效:
    source /etc/profile

步驟二:下載及解壓物理備份文件

  1. 下載MongoDB物理備份文件,您可以通過如下命令進(jìn)行下載。
    wget -c '<數(shù)據(jù)備份文件外網(wǎng)下載地址>' -O <自定義文件名>.<后綴>
    說明 請(qǐng)根據(jù)下載文件的類型,確保文件后綴名為.tar.gz_qp.xb
  2. 執(zhí)行如下命令在/test/mongo/中新建一個(gè)data目錄,并將下載的MongoDB物理備份文件移動(dòng)到/test/mongo/data/目錄中。
    mkdir -p /test/mongo/data && mv <物理備份文件名.后綴> /test/mongo/data
  3. 對(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)使用下述方法解壓。
      1. 安裝percona-xtrabackup工具和qpress軟件包。詳情請(qǐng)參見PERCONA XtraBackup官網(wǎng)上的安裝步驟
      2. 解壓物理備份文件,例如數(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

步驟三:以單節(jié)點(diǎn)模式恢復(fù)MongoDB物理備份的數(shù)據(jù)

  1. 執(zhí)行如下命令在/test/mongo文件夾中新建配置文件mongod.conf。
    touch /test/mongo/mongod.conf
  2. 在命令行中輸入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
  3. Esc鍵退出編輯模式,鍵盤輸入:wq保存并退出。
  4. 指定新建的配置文件mongod.conf來啟動(dòng)MongoDB。
    mongod -f /test/mongo/mongod.conf
  5. 等待啟動(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ì)登錄失敗。
  6. Mongo Shell中,執(zhí)行show dbs查詢當(dāng)前本地MongoDB中所有的數(shù)據(jù)庫,以驗(yàn)證是否恢復(fù)成功。
  7. 至此恢復(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í)行:

  1. 在命令行中通過服務(wù)器的Mongo Shell使用test用戶登錄MongoDB數(shù)據(jù)庫。
    mongo --host 127.0.0.1 -u test -p <test用戶密碼> --authenticationDatabase admin
    說明 如果您的密碼中包含特殊字符,則需要使用英文單引號(hào)(')包裹密碼,如:'test123!@#'。否則可能會(huì)登錄失敗。
  2. 登錄成功后,執(zhí)行下方代碼框中的命令完成如下動(dòng)作:
    1. admin庫中創(chuàng)建一個(gè)臨時(shí)用戶,賦予該用戶臨時(shí)的local庫讀寫權(quán)限。
    2. 切換至臨時(shí)用戶移除local庫中原有副本集配置。
    3. 切換回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')
  3. 執(zhí)行如下命令關(guān)閉MongoDB服務(wù)并退出Mongo Shell。
    use admin
    db.shutdownServer()
    exit
  4. 創(chuàng)建副本集認(rèn)證文件。

    如需以副本集模式啟動(dòng)MongoDB,您需要?jiǎng)?chuàng)建一個(gè)key文件作為每個(gè)副本集節(jié)點(diǎn)之間的認(rèn)證文件。

    1. 執(zhí)行如下命令在mongo目錄下創(chuàng)建keyFile文件夾作為認(rèn)證文件的目錄,并在該目錄中創(chuàng)建一個(gè)key文件。
      mkdir -p /test/mongo/keyFile && touch /test/mongo/keyFile/mongodb.key
    2. 執(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)(=)。
    3. Esc鍵退出編輯模式,輸入:wq保存并退出文件。
    4. 在命令行中執(zhí)行如下命令將認(rèn)證文件的權(quán)限修改為400,保證該文件內(nèi)容僅對(duì)該文件所有者可見。
      sudo chmod 400 /test/mongo/keyFile/mongodb.key
    說明 此認(rèn)證文件將應(yīng)用于所有副本集節(jié)點(diǎn)。
  5. 通過下列步驟為副本集準(zhǔn)備兩個(gè)空的節(jié)點(diǎn)。
    1. 執(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
    2. 執(zhí)行如下命令分別為另外兩個(gè)節(jié)點(diǎn)創(chuàng)建數(shù)據(jù)目錄。
      mkdir -p /test/mongo/data1 && mkdir -p /test/mongo/data2
  6. 分別通過下列指示修改各節(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)的MongoDBPID文件(記錄進(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è)置副本集的名稱。
  7. 執(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
  8. 等待啟動(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ì)登錄失敗。
  9. 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)完成。

  10. 通過如下步驟驗(yàn)證是否啟動(dòng)成功。
    1. 執(zhí)行exit退出Mongo Shell。
    2. 執(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ì)登錄失敗。
    3. 觀察Mongo Shell命令行左側(cè),顯示<副本集名稱>:PRIMARY>即代表副本集模式啟動(dòng)成功。

常見問題

Q:為什么我使用指定的mongod.conf配置文件啟動(dòng)自建數(shù)據(jù)庫報(bào)錯(cuò)?

A:常見原因如下:
  • 您可能在指定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ù)同步完成即可。