從備份回復

將來源資料庫的資料庫備份資料回復至您的目標資料庫。

在目標資料庫上安裝 Oracle Database 備份

oci_install.jar 檔案複製到目標資料庫主機,然後執行命令在目標上安裝「Oracle Database 備份」。

在來源資料庫上安裝 Oracle Database Backup Cloud Service
  1. 透過堡壘主機將 oci_install.jar 檔案複製到目標資料庫主機,然後解壓縮。
    BASTION_IP=BASTION_IP # public IP
    DB_HOST=DB_HOST # private IP
    
    scp -o ProxyCommand="ssh -W %h:%p
    opc@${BASTION_IP}" oci_install.jar 
    opc@${DB_HOST}:~/
    
    ssh -J opc@${BASTION_IP} opc@${DB_HOST} 'sudo chown oracle:oinstall oci_install.jar; sudo mv oci_install.jar
    /home/oracle/'
  2. 透過堡壘主機連線至 OCI 目標資料庫,並切換至 oracle 使用者。
    ssh -J opc@${BASTION_IP} opc@${DB_HOST}
    sudo su - oracle
  3. 備份目前的公事包,然後在目標資料庫上安裝公事包。
    mv $ORACLE_HOME/data/wallet $ORACLE_HOME/data/wallet_bck
    mkdir -p $ORACLE_HOME/data/wallet
    unzip wallet.zip -d $ORACLE_HOME/data/wallet/
  4. 執行 Database Cloud Backup Module 命令來安裝程式庫並建立 config 檔案。
    這與您在來源資料庫上安裝 Oracle Database Backup Cloud Service 的命令相同,雖然 ORACLE_HOME 變數可能不同。
    java -jar oci_install.jar \
    -host https://objectstorage.region.oraclecloud.com \
    -pubFingerPrint wallet_public_key_fingerprint \
    -tOCID tenancy_OCID \
    -uOCID user_OCID \
    -cOCID compartment_OCID \
    -libDir $ORACLE_HOME/lib \
    -walletDir $ORACLE_HOME/data/wallet \
    -pvtKeyFile $ORACLE_HOME/data/wallet/oci_pvt \
    -bucket bucket_name \
    -configFile ~/config
    
    config 檔案會顯示在 oracle 使用者的本位目錄資料夾中。
  5. 使用 SID_NAME 備份原始目標資料庫 SPF 檔案。
    如果您未備份原始目標資料庫 SPF 檔案,RMAN 將會嘗試使用此檔案來回復備份並失敗。
    mv $ORACLE_HOME/dbs/spfileSID_NAME.ora $ORACLE_HOME/dbs/spfileSID_NAME.ora.bck

設定目標資料庫的備份儲存

在目標資料庫上設定備份 SBT_TAPE 儲存裝置。

  1. 執行 RMAN 目標命令。
    rman target /
  2. 設定目標資料庫上的備份 SBT_TAPE 儲存裝置。
    請使用 ORACLE_HOME 環境變數來定義 SBT 程式庫。
    RMAN> CONFIGURE CHANNEL DEVICE TYPE 'SBT_TAPE' PARMS 'SBT_LIBRARY=ORACLE_HOME/lib/libopc.so, SBT_PARMS=(OPC_PFILE=/home/oracle/config)';
    

設定 DBID 並從備份回復 SPF 檔案

執行 RMAN 命令以設定 DBID 和解密密碼,從備份回復 SPF 檔案。設定 DBID 時,您將使用 RMAN 將目標 DBID 取代為來源 DBID。

  1. 設定資料庫 ID (DBID)。
    RMAN> run {
    shutdown immediate;
    set dbid DBID number;
    STARTUP FORCE NOMOUNT;
    }
  2. 設定解密密碼 (用於加密的密碼) 並從備份回復 SPF 檔案。
    RMAN> SET DECRYPTION IDENTIFIED BY password;
    RMAN> set controlfile autobackup format for device type sbt to '%F';
    RMAN> run {
      allocate channel c1 device type sbt PARMS 'SBT_LIBRARY=ORACLE_HOME/lib/libopc.so, SBT_PARMS=(OPC_PFILE=/home/oracle/config)';
      restore spfile from autobackup;
    }
  3. 結束 RMAN。

建立稽核檔的目錄

建立稽核檔案的目的地目錄。

預設位置為 /u01/app/oracle/admin/$ORACLE_SID/adump。您可以搜尋已回復的 spfile 字串 audit_file_dest,查看原始資料庫所使用的設定。

spfile 是二進位檔案,需要字串才能正確剖析。不過,可能會出現分行符號,以防止簡單的 grep 提供完整路徑。字串上的 -s "" 選項會移除分行符號,而 sed 指令會在 audit_file_dest 之後剖析文字。由於 sed 命令不會處理非綠色的正規表示式,因此需要 awk 命令來刪減檔案的結尾。

  • 使用新增的 xargs 命令建立資料夾:
    strings -s "" ${ORACLE_HOME}/dbs/spfile*.ora | sed -E "s|.*audit_file_dest='(.*)'.*|\1|" | awk -F"'" '{print $1}' | xargs mkdir -p 

回復及復原資料庫

使用 RMAN 從備份回復控制檔,然後回復和復原資料庫。RMAN 使用存檔重做日誌復原資料庫。

  1. 開啟 RMAN 並從備份回復控制檔。請使用您先前設定的 DBID 編號與解譯密碼。
    Rman target /
    RMAN> set dbid DBID number;
    RMAN> STARTUP FORCE NOMOUNT;
    RMAN> SET DECRYPTION IDENTIFIED BY password;
    RMAN> set controlfile autobackup format for device type sbt to '%F';
    RMAN> run {
    allocate channel c1 device type sbt PARMS 'SBT_LIBRARY=ORACLE_HOME/lib/libopc.so, SBT_PARMS=(OPC_PFILE=/home/oracle/config)';
      restore controlfile from autobackup;
      alter database mount;
    }
  2. 使用 RMAN 來回復和復原資料庫。
    RMAN> run {
    CONFIGURE CHANNEL DEVICE TYPE 'SBT_TAPE' PARMS 'SBT_LIBRARY=ORACLE_HOME/lib/libopc.so, SBT_PARMS=(OPC_PFILE=/home/oracle/config)';
    RESTORE DATABASE;
    RECOVER DATABASE;
    }
    當 RMAN 在備份中套用最後一個存檔重做日誌,而且找不到其他日誌時,會顯示類似以下的訊息:unable to find archived log
  3. 使用 resetlogs 開啟資料庫。
    RMAN> ALTER DATABASE OPEN RESETLOGS;
  4. 讓目標資料庫可以接收連線。
  5. 編輯監聽器組態以建立靜態監聽器,以重新復原 TNS 監聽器。
    nano $ORACLE_HOME/network/admin/listener.ora
  6. 新增下列區段至「TNS 監聽器」,以定義來源資料庫的 ORACLE_HOME 和 CDB 名稱。

    ORACLE_HOME 取代為 ORACLE_HOME 和 SID_NAME 的路徑值,以來源資料庫的服務名稱 (CDB 名稱)。

    SID_LIST_LISTENER=
      (SID_LIST=
        (SID_DESC=
          (ORACLE_HOME=ORACLE_HOME)
          (SID_NAME=SID_NAME))
      )
    
  7. 編輯 tnsname 檔案。
    nano $ORACLE_HOME/network/admin/tnsnames.ora
  8. 編輯 SERVICE_NAME 以符合來源資料庫的 SID 名稱 (不含網域名稱)。
    (SERVICE_NAME = SID_NAME)
  9. 重新啟動監聽器。
    $ORACLE_HOME/bin/lsnrctl stop
    $ORACLE_HOME/bin/lsnrctl start
    $ORACLE_HOME/bin/lsnrctl status
    
資料庫應可供存取。