在 Windows 環境中準備 Oracle 資料庫,以便在備份/復原裝置上使用備份和災難復原服務

事前準備

在 Windows 環境中探索、保護及掛接 Oracle 資料庫之前,請務必檢查下列事項:

  1. 請檢查資料庫伺服器上的下列設定:

    1. Oracle 資料庫和 Oracle Listener 正在運作 (請檢查 Windows 服務)。

    2. 確認有名稱為 SID 的 tns 項目。 tnsnames.ora 檔案位於

      %ORACLE_HOME%\network\admin
      
    3. 執行下列指令,確認 tns 項目有效:

      %ORACLE_HOME%\bin\tnsping <SID>
      
  2. 檢查記錄模式是否設為「封存記錄」模式:

    sql> archive log list
    

    如果資料庫處於無封存記錄模式,請將其返回封存記錄模式:

    sql> shutdown immediate;
    sql> startup mount;
    sql> alter database archivelog;
    sql> alter database open;
    
  3. 啟用資料庫變更區塊追蹤功能。如果資料庫 BCT 關閉,增量備份時間會受到影響。變更區塊追蹤功能適用於 Oracle Enterprise Edition。執行 SQL 查詢,確認變更區塊追蹤功能已啟用。執行查詢:

    sqlplus / as sysdba
    sql> select * from v$block_change_tracking;
    

如要啟用變更區塊追蹤功能,請按照下列步驟操作:

    sql> alter database enable block change tracking
    using file '<Oracle home directory>\orcl.bct';

在 Windows 環境中備份 Oracle 資料庫

如要在 Windows 環境中備份 Oracle 資料庫,請按照下列步驟操作:

  1. 在設備管理控制台中,設定「Oracle 資料庫的應用程式詳細資料和設定」

  2. 套用備份方案來保護資料庫。

已知問題

在 Windows 上執行 exit 指令時,Oracle 19c SQL*Plus (sqlplus.exe) 有時會停止回應 (文件 ID 2820655.1)。這個錯誤只會出現在 Windows 上。Oracle 已確認 SQL*Plus 19.10、19.11 和 19.12 版會發生這個問題。Oracle 提供的解決方案如下:

  • 使用 SQL*Plus 21.1 以上版本 (或)
  • 套用修補程式:31466370。這項修補程式適用於 19.11 和 19.13。

如果未透過備份和災難復原服務保護 archivelog,請使用 RMAN 手動將 Windows 環境中的 Oracle 資料庫還原至排定的備份時間點

如要在 Windows 環境中復原整個 Oracle 資料庫,請按照下列步驟操作:

  1. 如「將 Oracle 資料庫掛接為標準掛接」一文所述,從備份和災難復原將資料庫備份快照掛接到 Oracle 伺服器。

  2. 設定資料庫環境,並使用備份和災難復原掛接磁碟區中的參數檔案,在未掛接狀態下啟動資料庫 (例如,將資料庫磁碟區掛接到 E:):

    sqlplus / as sysdba
    sql> startup nomount pfile='E:\<sid>___backup.ora';
    
  3. 從 pfile 建立 spfile:

    sql> create spfile='%ORACLE_HOME%\database\spfile<sid>.ora'
    from pfile='E:\<sid>___backup.ora';
    
  4. nomount 狀態啟動資料庫和 spfile:

    sql> shutdown immediate;
    sql> startup nomount;
    
  5. 使用 RMAN 從備份和災難復原掛接磁碟區還原控制檔案:

    rman target /
    rman> restore controlfile from 'E:\cf-D_<sid>-id_<id>.ctl';
    
  6. 掛載資料庫:

    rman> alter database mount;
    
  7. 將備份和災難復原服務掛接磁碟區中的資料檔案和封存檔案資料夾編目至 RMAN:

    rman> run
    {
    catalog start with 'E:\datafile' noprompt;
    catalog start with 'E:\archivelog' noprompt;
    }
    
  8. 還原及復原資料庫:

    rman> run
    {
    restore database;
    recover database;
    }
    
  9. 開啟資料庫並選擇重設記錄選項:

    rman> alter database open resetlogs;
    

在 Windows 環境中,使用 RMAN 手動將 Oracle 資料庫復原至排定的備份點,並透過備份和災難復原服務保護的歸檔記錄進行前滾

  1. 從來源資料庫伺服器掛接備份,以進行復原。如要將備份快照從備份和災難復原服務掛接到 Oracle 伺服器,請參閱「以標準掛接方式掛接 Oracle 資料庫」一文。

  2. 設定資料庫環境,並使用備份和災難復原服務掛接磁碟區中的參數檔案,以無掛接狀態啟動資料庫。在本範例中,資料庫備份 backup 會掛接在 E:\,而受保護的封存記錄會掛接在 Z:。

       sqlplus / as sysdba
    
       startup nomount pfile='E:\<sid>___backup.ora';
    
  3. 從 pfile 建立 spfile:

    sql> create spfile='%ORACLE_HOME%\database\spfile<sid>.ora' from
    pfile='E:\<sid>___backup.ora';
    
  4. 以 spfile 啟動資料庫,並處於 nomount 狀態:

    ```sql
    shutdown immediate;
    startup nomount;
    ```
    
  5. 使用 RMAN 從備份和災難復原服務掛接的封存記錄備份還原控制檔案:

    ```rman
    rman target /
    rman> restore controlfile from 'Z:\cf-D_<sid>-id_<id>.ctl';
    ```
    
  6. 掛載資料庫:

    ```rman
    rman> alter database mount;
    ```
    
  7. 將資料檔案和封存記錄資料夾從備份和災難復原掛接的資料庫備份和封存記錄備份編目至 RMAN:

    ```rman
    rman> run
    {
    catalog start with 'E:\datafile' noprompt;
    catalog start with 'E:\archivelog' noprompt;
    catalog start with 'Z:\archivelog' noprompt;
    }
    ```
    
  8. 還原及復原資料庫:

    ```rman
    rman> run
    {
    restore database;
    recover database;
    }
    ```
    

    如要從特定時間點復原,請執行下列復原指令:

    ```rman
    rman> run
     {
      restore database;
      recover database until time "to_date('<time stamp>','yyyymmddhh24mi')";
     }
     ```
    
  9. 開啟資料庫並選擇重設記錄選項:

    ```rman
    rman> alter database open resetlogs;
    ```
    

    資料庫可供讀取及寫入。

觀看指令碼,瞭解如何監控資料庫磁碟區的掛接情形

如果您建立應用程式感知掛接點,可以使用監看指令碼顯示從備份和災難復原服務掛接的磁碟區,以及執行的 Oracle 程序。如要瞭解應用程式感知掛接,請參閱「將 Oracle Database 掛接為虛擬應用程式」。

執行應用程式感知掛接時,可以使用這個監控指令碼。 指令碼位置必須是:C:\Program Files\備份和災難復原\scripts。在 Windows 主機上執行的指令碼必須是 .bat 或 .vbs 檔案。

    ```Windows
    @echo off
    :loop
    echo. > watchtemp
    echo ------------------ >> watchtemp
    echo  Oracle Processes >> watchtemp
    echo ------------------ >> watchtemp
    tasklist /svc | findstr oracle >> watchtemp
    echo. >> watchtemp
    echo ------------------ >> watchtemp
    echo   Backup and DR Mounts >> watchtemp
    echo ------------------ >> watchtemp
    wmic volume get label, name | findstr Backup and DR >> watchtemp
    echo. >> watchtemp
    cls
    type watchtemp
    timeout 2 > null
    goto loop
    ```

這會產生類似以下的輸出內容:

    Oracle Processes
    ------------------
    oracle.exe                    1492 OracleServiceORCL
    oracle.exe                    3768 OracleServiceTestDB
    oracle.exe                     872 OracleServiceTestDB2
    ------------------
      Backup and DR Mounts
    ------------------
    Backup and DR-Backup-ORCL    D:\mount_1