從 OCI Classic 物件存放區復原資料庫

本文說明如何使用 Oracle Database Backup Module 建立並儲存在 Oracle Cloud Infrastructure Object Storage Classic 中的備份來復原資料庫。

本主題使用下列詞彙:

  • 來源資料庫:Object Storage Classic 中的資料庫備份。
  • 目標資料庫:Oracle Cloud Infrastructure 中資料庫系統上的新資料庫。

必備條件

需要下列項目:

  • Oracle Cloud Infrastructure Object Storage Classic 的服務名稱、識別名稱、容器、使用者名稱以及密碼。
  • 備份至 Object Storage Classic 時使用密碼式加密時的備份密碼。
  • 來源資料庫 ID、資料庫名稱、資料庫唯一名稱 (設定儲存體所需)。
  • 如果來源資料庫使用通透資料加密 (TDE) 設定,您需要備份公事包和公事包密碼。
  • 設定任何資料庫連結的 Tnsnames。
  • 來源資料庫 Oracle_home 的 Opatch lsinventory 輸出,以供參考。
  • 來源資料庫本位目錄的 sqlpatch 目錄複本。目標資料庫若未包含這些修正程式,則必須進行倒回。

設定資料庫系統上的儲存體

  1. SSH 至資料庫系統。
    ssh -i <private_key_path> opc@<db_system_ip_address>
  2. 以 opc 登入,然後以 sudo 身分登入 root 使用者。搭配使用 sudo su - 與連字號來呼叫 root 使用者的設定檔,該設定檔會將 PATH 設定為 dbcli 目錄 (/opt/oracle/dcs/bin)。
    login as: opc
    sudo su - 
  3. 使用 Dbstorage 命令設定 DATA、RECO 以及 REDO 儲存體的目錄。下列範例會為 tdetest 資料庫建立 10GB 的 ACFS 儲存。
    dbcli create-dbstorage --dbname tdetest --dataSize 10 --dbstorage ACFS 

    附註:

    移轉版本 11.2 資料庫時,必須指定 ACFS 儲存。
  4. 使用 Dbstorage Commands 列出儲存體 ID。您需要下一個步驟的 ID。
    dbcli list-dbstorages
    輸出:
    ID                                       Type   DBUnique Name        Status
    ---------------------------------------- ------ -------------------- ----------
    9dcdfb8e-e589-4d5f-861a-e5ba981616ed     Acfs   tdetest              Configured
  5. 使用 Dbstorage 命令搭配上一個步驟的儲存體 ID,列出 DATA、RECO 以及 REDO 位置。
    dbcli describe-dbstorage --id 9dcdfb8e-e589-4d5f-861a-e5ba981616ed
    輸出:
    DBStorage details
    ----------------------------------------------------------------
                         ID: 9dcdfb8e-e589-4d5f-861a-e5ba981616ed
                    DB Name: tdetest
              DBUnique Name: tdetest
             DB Resource ID:
               Storage Type: Acfs
              DATA Location: /u02/app/oracle/oradata/tdetest
              RECO Location: /u03/app/oracle/fast_recovery_area/
              REDO Location: /u03/app/oracle/redo/
                      State: ResourceState(status=Configured)
                    Created: August 24, 2016 5:25:38 PM UTC
                UpdatedTime: August 24, 2016 5:25:53 PM UTC 
  6. 請注意 DATA、RECO 和 REDO 位置。您稍後需要設定資料庫的 db_create_file_destdb_create_online_log_destdb_recovery_file_dest 參數。

選擇 ORACLE_HOME

決定要用於資料庫回復的 ORACLE_HOME,然後使用正確的 ORACLE_BASE、ORACLE_HOME 和 PATH 設定值切換至該本位目錄。ORACLE_HOME 不得已經與資料庫相關聯。

若要取得現有 ORACLE_HOMEs 的清單並確定 ORACLE_HOME 為空白,請分別使用 Dbhome 命令資料庫命令。若要建立新的 ORACLE_HOME,請使用 Dbhome 命令

複製來源資料庫公事包

如果來源資料庫設定 TDE,請略過此段落。

  1. 在資料庫系統上,成為 oracle 使用者:
    sudo su - oracle
  2. 建立下列目錄 (如果不存在):
    mkdir /opt/oracle/dcs/commonstore/wallets/tde/<db_unique_name>
  3. 將來源資料庫中的 ewallet.p12 檔案複製到您在上一個步驟中建立的目錄。
  4. 在目標主機上,確定 $ORACLE_HOME/network/admin/sqlnet.ora 包含下列行:
    ENCRYPTION_WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/opt/oracle/dcs/commonstore/wallets/tde/$ORACLE_UNQNAME)))

    若該行不存在於檔案中,請加以新增。(如果這是新的本位目錄,但尚未在此主機上建立任何資料庫,則可能不會有該行。)

  5. 從密碼型公事包建立自動登入公事包,以允許在進行回復和復原作業時自動開啟公事包。

    對於版本 12.1 或更新版本的資料庫,請使用 ADMINISTER KEY MANAGEMENT 命令:

    $cat create_autologin_12.sh
    
    #!/bin/sh
    if [ $# -lt 2 ]; then
            echo "Usage: $0 <dbuniquename><remotewalletlocation>"
            exit 1;
    fi
    
    mkdir /opt/oracle/dcs/commonstore/wallets/tde/$1
    cp $2/ewallet.p12* /opt/oracle/dcs/commonstore/wallets/tde/$1
    rm -f autokey.ora
    echo "db_name=$1"  > autokey.ora
    autokeystoreLog="autologinKeystore_`date +%Y%m%d_%H%M%S_%N`.log"
    echo "Enter Keystore Password:"
    read -s keystorePassword
    echo "Creating AutoLoginKeystore -> "
    sqlplus "/as sysdba"  <<EOF
    spool $autokeystoreLog
    set echo on
    startup nomount pfile=autokey.ora
    ADMINISTER KEY MANAGEMENT CREATE AUTO_LOGIN KEYSTORE
    FROM KEYSTORE '/opt/oracle/dcs/commonstore/wallets/tde/$1' -- Keystore location
    IDENTIFIED BY "$keystorePassword";
    shutdown immediate;
    EOF

    oracle:asmadmincwallet.sso 權限調整為 oracle:oinstall

    ls -ltr /opt/oracle/dcs/commonstore/wallets/tde/<db_unique_name>
    輸出:
    total 20
    -rw-r--r-- 1 oracle oinstall 5680 Jul  6 11:39 ewallet.p12
    -rw-r--r-- 1 oracle asmadmin 5725 Jul  6 11:39 cwallet.sso

    若為版本 11.2 資料庫,請使用 orapki 命令:

    orapki wallet create -wallet wallet_location -auto_login [-pwd password]

安裝 Oracle Database Backup Module

資料庫系統包含備份模組 JAR 檔案,但您需要安裝。

  1. SSH 至資料庫系統,以 opc 身分登入,然後成為 oracle 使用者。
    ssh -i <path to SSH key used when launching the DB System> opc@<DB System IP address or hostname>
    sudo su - oracle
  2. 變更至包含備份模組 opc_install.jar 檔案的目錄。
    cd /opt/oracle/oak/pkgrepos/orapkgs/oss/<version>/
  3. 若要安裝備份模組,請參閱 Using Oracle Database Backup Cloud ServiceInstalling the Oracle Database Cloud Backup Module for OCI Classic 所述的命令語法。

設定環境變數

為資料庫的 RMAN 和 SQL*Plus 階段作業設定下列環境變數:

ORACLE_HOME=<path of Oracle Home where the database is to be restored>
ORACLE_SID=<database instance name>
ORACLE_UNQNAME=<db_unique_name in lower case>
NLS_DATE_FORMAT="mm/dd/yyyy hh24:mi:ss"

配置 RMAN SBT 通道

針對每個回復作業,配置 SBT 通道並將 SBT_LIBRARY 參數設為 libopc.so 檔案的位置,並將 OPC_FILE 參數設為 opc_sbt.ora 檔案的位置,例如:

ALLOCATE CHANNEL c1 DEVICE TYPE sbt MAXPIECESIZE 2 G FORMAT '%d_%I_%U' PARMS 'SBT_LIBRARY=/tmp/oss/libopc.so ENV=(OPC_PFILE=/<ORACLE_HOME>/dbs/opc_sbt.ora)';

如需有關這些檔案的詳細資訊,請參閱使用 Oracle Database Backup Cloud Service 中的 Files Created When the Oracle Database Cloud Backup Module for OCI Classic

確定已開啟解密

確定已為所有 RMAN 回復階段作業開啟解密。

set decryption wallet open identified by <keystore password>;

如需詳細資訊,請參閱 Providing the Password Required to Decrypted Backups

回復 Spfile

下列範例 Shell 程序檔會復原 spfile。將 $dbID 變數設為要回復之資料庫的 dbid。依照預設,spfile 會回復為 $ORACLE_HOME/dbs/spfile<sid>.ora

rman target / <<EOF

spool log to "`date +%Y%m%d_%H%M%S_%N`_dbid_${dbID}_restore_spfile.log"
startup nomount
set echo on
run {
ALLOCATE CHANNEL c1 DEVICE TYPE sbt MAXPIECESIZE 2 G FORMAT '%d_%I_%U' PARMS 'SBT_LIBRARY=/tmp/oss/libopc.so ENV=(OPC_PFILE=/tmp/oss/opc_sbt.ora)';
SET DBID=$dbID;
RESTORE SPFILE FROM AUTOBACKUP;
shutdown immediate;
EOF

設定資料庫參數

  1. 請以非掛載模式啟動資料庫。
    startup nomount
  2. 更新 spfile 並修改下列參數。
    • 如果資料庫儲存體類型為 ACFS,請使用從 dbcli describe-dbstorage 命令輸出取得的 DATA、RECO 以及 REDO 位置,如設定資料庫系統的儲存體中所述:

      alter system set db_create_file_dest='/u02/app/oracle/oradata/' scope = spfile;
      alter system set db_create_online_log_dest_1='/u03/app/oracle/redo' scope = spfile;
      alter system set db_recovery_file_dest='/u03/app/oracle/fast_recovery_area' scope = spfile;
    • 如果資料庫儲存體類型為 ASM:

      alter system set db_create_file_dest='+DATA' scope = spfile;
      alter system set db_create_online_log_dest_1='+RECO' scope = spfile;
      alter system set db_recovery_file_dest='+RECO' scope = spfile;
    • 設定 db_recovery_file_dest_size 未設定或設定不正確:

      alter system set db_recovery_file_dest_size=<sizeG> scope=spfile;
    • audit_file_dest 設為正確的值:

      alter system set audit_file_dest=/u01/app/oracle/admin/<db_unique_name in lower case>/adump
  3. 移除 control_files 參數。Oracle Managed Files (OMF) 參數會用來建立控制檔。
    alter system reset control_files scope=spfile;
  4. 使用新增的參數,以指定模式重新啟動資料庫。
    shutdown immediate
    startup nomount

回復控制檔

為您的環境修改下列範例 Shell 命令檔以回復控制檔。將 $dbID 變數設為要回復之資料庫的 dbid。安裝「備份模組」時,將 SBT_LIBRARY 設為 -libDir 參數中指定的位置。將 OPC-PFILE 設為 -configFile 參數中指定的位置,預設值為 ORACLE_HOME/dbs/opcSID.ora

rman target / <<EOF

spool log to "`date +%Y%m%d_%H%M%S_%N`_dbid_${dbID}_restore_controlfile.log"
set echo on
run {
ALLOCATE CHANNEL c1 DEVICE TYPE sbt MAXPIECESIZE 2 G FORMAT '%d_%I_%U' PARMS 'SBT_LIBRARY=/<Backup Module libDir>/libopc.so ENV=(OPC_PFILE=/<Backup Module configFile>/opcSID.ora)';
SET DBID=$dbID;
RESTORE CONTROLFILE FROM AUTOBACKUP;
alter database mount;
}

exit;
EOF

回復資料庫

  1. 預覽並驗證備份。資料庫現在已掛載,而 RMAN 應能從回復的控制檔找到備份。此步驟可協助確保存檔日誌清單存在,並且可以回復備份元件。

    在下列範例中,視您的環境需要修改 SBT_LIBRARY 和 OPC_PFILE。

    rman target / <<EOF
    
    spool log to "`date +%Y%m%d_%H%M%S_%N`_restore_database_preview.log"
    set echo on
    run {
        ALLOCATE CHANNEL c1 DEVICE TYPE sbt MAXPIECESIZE 2 G FORMAT '%d_%I_%U' PARMS 'SBT_LIBRARY=/tmp/oss/libopc.so ENV=(OPC_PFILE=/tmp/oss/opc_sbt.ora)';
        ALLOCATE CHANNEL c2 DEVICE TYPE sbt MAXPIECESIZE 2 G FORMAT '%d_%I_%U' PARMS 'SBT_LIBRARY=/tmp/oss/libopc.so ENV=(OPC_PFILE=/tmp/oss/opc_sbt.ora)';
        ALLOCATE CHANNEL c3 DEVICE TYPE sbt MAXPIECESIZE 2 G FORMAT '%d_%I_%U' PARMS 'SBT_LIBRARY=/tmp/oss/libopc.so ENV=(OPC_PFILE=/tmp/oss/opc_sbt.ora)';
        restore database validate header preview;
    }

    請複查輸出,如果有錯誤訊息,並調查問題的原因。

  2. 使用 set newname 重新導向回復,以 OMF 格式回復資料檔,並使用 switch datafile all 允許使用新資料檔複本來更新控制檔。
    rman target / <<EOF
    
    spool log to "`date +%Y%m%d_%H%M%S_%N`_restore_database_preview.log"
    set echo on
    run {
        ALLOCATE CHANNEL c1 DEVICE TYPE sbt MAXPIECESIZE 2 G FORMAT '%d_%I_%U' PARMS 'SBT_LIBRARY=/tmp/oss/libopc.so ENV=(OPC_PFILE=/tmp/oss/opc_sbt.ora)';
        ALLOCATE CHANNEL c2 DEVICE TYPE sbt MAXPIECESIZE 2 G FORMAT '%d_%I_%U' PARMS 'SBT_LIBRARY=/tmp/oss/libopc.so ENV=(OPC_PFILE=/tmp/oss/opc_sbt.ora)';
        ALLOCATE CHANNEL c3 DEVICE TYPE sbt MAXPIECESIZE 2 G FORMAT '%d_%I_%U' PARMS 'SBT_LIBRARY=/tmp/oss/libopc.so ENV=(OPC_PFILE=/tmp/oss/opc_sbt.ora)';
        set newname for database to new;
        restore database;
        switch datafile all;
        switch tempfile all;
        recover database;
    }

    此復原將會嘗試使用最後可用的存檔日誌備份,然後因發生錯誤而失敗,例如:

    RMAN-00571: ===========================================================
    RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
    RMAN-00571: ===========================================================
    RMAN-03002: failure of recover command at 07/20/2016 12:09:02
    RMAN-06054: media recovery requesting unknown archived log for thread 1 with sequence 22 and starting SCN of 878327
  3. 如果要完成不完整復原,請使用 RMAN-06054 訊息中顯示的序號與執行緒編號來執行復原,例如:
    recover database until sequence 22 thread 1;

重設日誌

重設日誌。

alter database open resetlogs;

準備註冊資料庫

註冊資料庫之前:

  1. 確定資料庫 COMPATIBLE 參數值是可接受的。如果值小於最小值,則在您升級資料庫相容性之前,無法註冊資料庫。
  2. 檢查資料庫是否已在監聽器與服務名稱註冊。
    lsnrctl services
  3. 請確定已回復或建立新資料庫的密碼檔。
    ls -ltr $ORACLE_HOME/dbs/orapw<oracle sid>

    如果檔案不存在,請使用 orapwd 公用程式建立檔案。

    orapwd file=<$ORACLE_HOME/dbs/orapw<$ORACLE_SID>> password=<sys password>
  4. 如果以讀寫模式開啟,請確定回復的資料庫。
    select open_mode from v$database;

    指令輸出應表示讀寫模式。dbcli register-database 指令將嘗試執行需要讀寫模式的資料修補程式。如果有 PDB,這些 PDB 也應處於讀寫模式,以確保在該模式上執行資料修正。

  5. 從已回復資料庫的 oracle 本位目錄,使用下列命令驗證 SYS 連線:
    conn sys/<password>@//<hostname>:1521/<database service name>

    稍後需要此連線才能註冊資料庫。繼續之前,請先修正任何連線問題。

  6. 使用 SQL*Plus 命令確定資料庫在 spfile 上執行。
    SHOW PARAMETERS SPFILE
  7. (選擇性) 如果想要使用 dbcli 命令行介面管理資料庫備份,您可以在註冊新備份或現有備份組態時,或註冊資料庫後,將它與移轉的資料庫建立關聯。備份組態定義資料庫的備份目的地和復原時段。使用 Backupconfig 命令建立、列出及顯示備份組態。
  8. 將來源資料庫的資料夾 $ORACLE_HOME/sqlpatch 複製到目標資料庫。這會啟用 dbcli register-database 命令,以倒回任何衝突的修正程式。

    附註:

    如果您要移轉 11.2 版資料庫,則在註冊資料庫之後需要執行其他步驟。如需詳細資訊,請參閱 Roll Back Patches on a Version 11.2 Database

在資料庫系統上註冊資料庫

資料庫命令會將回復的資料庫註冊到 dcs-agent,以便由 dcs-agent 堆疊管理。

附註:

2 節點 RAC 資料庫系統上無法使用 dbcli register-database 命令。

root 使用者可以使用 dbcli register-database 命令在資料庫系統上註冊資料庫,例如:

dbcli register-database --dbclass OLTP --dbshape odb1 --servicename tdetest --syspassword

輸出:

Password for SYS:
{
  "jobId" : "317b430f-ad5f-42ae-bb07-13f053d266e2",
  "status" : "Created",
  "message" : null,
  "reports" : [ ],
  "createTimestamp" : "August 08, 2016 05:55:49 AM EDT",
  "description" : "Database service registration with db service name: tdetest",
  "updatedTime" : "August 08, 2016 05:55:49 AM EDT"
}

更新 tnsnames.ora

檢查備份位置中的 tnsnames.ora、檢查複製資料庫中使用的資料庫連結,然後將任何相關的連線字串新增至位於 $ORACLE_HOME/network/admin/tnsnames.ora 的複製資料庫檔案。

倒回版本 11.2 資料庫上的修正程式

對於 11.2 版資料庫,sqlpatch 應用程式並不是自動的,因此任何套用至來源資料庫且不是安裝之 PSU 的暫時修正程式 (先前稱為「單次」修正程式) 都必須手動倒回目標資料庫中。註冊資料庫之後,請執行 catbundle.sql 命令檔,然後以相對應的 PSU 修正程式 (或 PSU 修正程式頂端的重疊修正程式) 執行 postinstall.sql 命令檔,如下所述。

秘訣:

部分暫時修正程式可能包含寫入 $ORACLE_HOME/rdbms/admin 目錄的檔案,以及 $ORACLE_HOME/sqlpatch 目錄的檔案。Oracle 建議您在將資料庫移轉至 OCI 環境之前,先使用修正程式讀我檔案中的指示,在來源資料庫中倒回這些修正程式。如果您需要回復這些修正程式的協助,請洽詢 Oracle Support。
  1. 在資料庫系統上,使用 dbcli list-dbhomes 命令尋找版本 11.2 資料庫本位目錄的 PSU 修正程式編號。在下列命令輸出範例中,PSU 修正程式編號是「資料庫版本」資料欄中的第二個編號:
    dbcli  list-dbhomes
    輸出:
    ID                                   Name               DB Version                             Home Location                             Status 
    ------------------------------------ -----------------  -------------------------------------  ----------------------------------------- ----------
    59d9bc6f-3880-4d4f-b5a6-c140f16f8c64 OraDB11204_home1	11.2.0.4.160719 (23054319, 23054359)   /u01/app/oracle/product/11.2.0.4/dbhome_1 Configured

    (上述範例中的第一個修正程式編號 23054319,適用於資料庫本位目錄中的 OCW 元件。)

  2. 使用 lsinventory 指令尋找重疊修補程式 (如果有的話)。在下列範例中,修補程式編號 24460960 是 23054359 PSU 修補程式頂端的重疊修補程式。
    $ORACLE_HOME/OPatch/opatch lsinventory
    輸出:
    ...
    Installed Top-level Products (1): 
    
    Oracle Database 11g                                                  11.2.0.4.0
    There are 1 products installed in this Oracle Home.
    
    
    Interim patches (5) :
    
    Patch  24460960     : applied on Fri Sep 02 15:28:17 UTC 2016
    Unique Patch ID:  20539912
       Created on 31 Aug 2016, 02:46:31 hrs PST8PDT
       Bugs fixed:
         23513711, 23065323, 21281607, 24006821, 23315889, 22551446, 21174504
       This patch overlays patches:
         23054359
       This patch needs patches:
         23054359
       as prerequisites
  3. 啟動 SQL*Plus 並執行 catbundle.sql 命令檔,例如:
    startup 
    connect / as sysdba
    @$ORACLE_HOME/rdbms/admin/catbundle.sql psu apply
    exit
  4. 使用上一個步驟的重疊修正程式編號來套用 sqlpatch,例如:
    connect / as sysdba
    @$ORACLE_HOME/sqlpatch/24460960/postinstall.sql 
    exit

附註:

如果來源資料庫已安裝單次修正程式,且這些修正程式不是雲端環境中已安裝 PSU 的一部分,則必須倒回與這些單次修正程式對應的 SQL 變更。若要倒回 SQL 變更,請將 $ORACLE_HOME/sqlpatch/<patch#>/postdeinstall.sql 命令檔從來源環境複製到雲端環境,然後執行 postdeinstall.sql 命令檔。

後續回復檢查清單

在資料庫系統上還原並註冊資料庫之後,請使用下列檢查清單來驗證結果,並執行任何還原後自訂。

  1. 請確定資料庫檔案是以 OMF 格式回復。
  2. 確定資料庫列在資料庫命令輸出中。
  3. 檢查資料庫中的下列外部參照,並視需要加以更新:
    • 外部表格:如果來源資料庫使用外部表格,請備份該資料並將其移轉至目標主機。
    • 目錄:視需要自訂回復之資料庫的預設目錄。
    • 資料庫連結:確定已在 ORACLE_HOME 的 tnsnames.ora 檔案中更新所有必要的 TNS 項目。
    • 電子郵件和 URL:確定資料庫中使用的任何電子郵件地址和 URL 仍可從資料庫系統存取。
    • 排定的工作:複查來源資料庫中排定的工作,並視需要在回復的資料庫中排定類似的工作。
  4. 如果您在註冊資料庫時建立備份組態的關聯,請使用備份命令執行測試備份。
  5. 回復的資料庫如果包含 CDB 與 PDB,請確認已將修正程式套用至所有 PDB。