在 Windows 環境中保護及復原 Oracle 資料庫

事前準備

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

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

    1. Oracle 資料庫和 Oracle Listener 已啟用並執行 (請檢查 Windows 服務)。

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

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

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

    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. 套用備份方案來保護資料庫。

已知問題

執行退出指令時,Oracle 19c SQLPlus (sqlplus.exe) 在 Windows 上偶爾會停止運作 (Doc ID 2820655.1)。這個錯誤只會發生在 Windows 上。Oracle 已確認這項問題發生在 SQL Plus 19.10、19.11 和 19.12 版中。Oracle 提供下列解決方案:

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

如果備份記錄並未透過備份和災難復原服務受到保護,請使用 RMAN 手動復原 Windows 環境中的 Oracle 資料庫,並還原至預定的備份點

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

  1. 如「將 Oracle 資料庫掛載為標準掛載」一文所述,將資料庫備份快照從備份和 DR 服務掛載回 Oracle 伺服器。

  2. 設定資料庫環境,並使用備份和 DR 已掛接磁碟區的參數檔案,以未掛載狀態啟動資料庫 (例如,將已掛載的資料庫磁碟區掛接至 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 從備份和 DR 掛接的磁碟分割區還原控制檔案:

    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;
    

使用 RMAN 手動復原 Windows 環境中的 Oracle 資料庫,並透過備份和災難復原保護的歸檔記錄回溯至預定的備份點

  1. 掛載來源資料庫伺服器的映像檔,以便復原。如「將 Oracle 資料庫掛載為標準掛載」一文所述,將備份快照從備份和災難復原服務掛載回 Oracle 伺服器。

  2. 設定資料庫環境,並使用備份和 DR 已掛接磁碟區的參數檔案,在未掛載狀態下啟動資料庫。在本範例中,資料庫備份映像檔會掛載至 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 的資料庫:

    ```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 資料庫掛接為虛擬應用程式」。

執行應用程式感知掛載作業時,您可以使用這個監控指令碼。指令碼位置必須是:C:\Program Files\Backup and DR\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