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

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

本主題會使用下列詞彙:

先決條件

您需要下列項目:

在資料庫系統上設定儲存

  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 Commands 設定 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_dest、db_create_online_log_dest 和 db_recovery_file_dest 參數。

選擇 ORACLE_HOME

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

若要取得現有的 ORACLE_HOME 清單並確定 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

    將 cwallet.sso 權限從 oracle:asmadmin 調整為 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 備份模組

備份模組 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. 若要安裝備份模組,請參閱使用 Oracle Database Backup Cloud Service 中安裝 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)';

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

確定已開啟解密

請確定已開啟所有 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. 以 Nomount 模式啟動資料庫。

    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,它們也應該處於讀寫模式,以確保資料修正會在它們上執行。

  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 版的資料庫,則在註冊資料庫後需要執行其他步驟。如需詳細資訊,請參閱倒回版本 11.2 資料庫上的修正程式。

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

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

注意:雙節點 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 修正程式編號是「資料庫版本 (DB Version)」資料欄中的第二個編號:

    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. 檢查資料庫中的下列外部參考,並視需要加以更新:

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