準備 Data Guard 的主要資料庫

Data Guard 需要主要資料庫和至少一個待命資料庫才能運作。在 Bare Metal 解決方案上設定 Data Guard 之前,請建立主要資料庫

本指南中會使用以下範例:

資料庫專屬名稱 伺服器主機名稱 RAC 執行個體名稱 角色
DBDG_SITE1 site1db1site1db2 DBDG_SITE11DBDG_SITE12 主要
DBDG_SITE2 site2db1site2db2 DBDG_SITE21DBDG_SITE22 待命

本指南中執行 Oracle 的 Bare Metal 解決方案伺服器,已設定下列環境變數:

環境變數名稱
ORACLE_BASE /apps/oracle/oracle_base
ORACLE_HOME /apps/oracle/19.0.0/db_home1

視設定而定,您可能需要修改環境變數路徑。

設定主要資料庫

  1. 登入代管主要資料庫的第一部 Bare Metal 解決方案伺服器。

  2. /etc/oratab 檔案中新增項目,讓 oraenv 指令能夠為主要資料庫設定環境變數。修改執行個體名稱,讓名稱與各節點上執行的執行個體相符,並指定 Oracle 資料庫主目錄的完整路徑:

    DBDG_SITE11:ORACLE_HOME:N
    
  3. 設定 ORACLE_SID 環境變數,以便連線至主要資料庫:

    source oraenv <<< "DBDG_SITE11"
    

    您應該會收到回應 The Oracle base has been set to /apps/oracle/oracle_base

設定資料庫記錄功能並啟用回溯資料庫

  1. 啟動 SQL*Plus,然後啟用 force logging,以便記錄新增至資料庫的 nologging 表格空間:

    sqlplus / as sysdba
    
    ALTER DATABASE FORCE LOGGING;
    
  2. 確認 archivelog modeflashback database 已開啟:

    ARCHIVE LOG LIST;
    SELECT LOG_MODE, FLASHBACK_ON FROM V$DATABASE;
    

    如果 archivelog modeflashback database 為關閉狀態,請使用下列 SQL 指令將其開啟:

    1. 停止叢集資料庫,以便進行必要變更:

       srvctl stop database -d 
      
    2. 執行必要的 SQL 指令,開啟 archivelog modeflashback database

       STARTUP MOUNT;
       ALTER DATABASE ARCHIVELOG;
       ALTER DATABASE FLASHBACK ON;
       ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=1440 SID='*' SCOPE=BOTH;
       ALTER DATABASE OPEN;
       SHUTDOWN IMMEDIATE;
       EXIT;
      
    3. 再次啟動叢集資料庫:

       srvctl start database -d DBDG_SITE1
      

為 Data Guard 準備資料庫

  1. 登入主資料庫所在的首個 Bare Metal Solution 伺服器,並設定 ORACLE_SID 環境變數,以便連線至主資料庫:

    source oraenv <<< "DBDG_SITE11"
    

    您應該會收到回應 The Oracle base has been set to /apps/oracle/oracle_base

  2. 啟動 SQL*Plus,然後修改資料庫初始化參數,以便設定 Data Guard 服務:

    sqlplus / as sysdba
    
    ALTER SYSTEM SET LOG_ARCHIVE_FORMAT='%t_%s_%r.arc' SID='*' SCOPE=SPFILE;
    ALTER SYSTEM SET LOG_ARCHIVE_MAX_PROCESSES=8 SID='*' SCOPE=BOTH;
    ALTER SYSTEM SET REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE SID='*' SCOPE=SPFILE;
    ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO SID='*' SCOPE=BOTH;
    
  3. 檢查資料庫中是否有待命重做記錄。每個執行緒的待機重做記錄群組數量,必須比線上重做記錄群組數量多一個。

    SELECT 'Logfile groups in thread ' || THREAD# || ': ' || COUNT(*) FROM V$LOG GROUP BY THREAD#
    UNION
    SELECT 'Standby logfile groups in thread ' || THREAD# || ': ' || COUNT(*) FROM V$STANDBY_LOG GROUP BY THREAD#;
    

    以下範例每個執行緒有四個線上重做記錄,且未建立任何待命重做記錄群組。由於有四個線上重做記錄群組,因此必須為每個執行緒建立五個待命重做記錄群組:

    Logfile groups in thread 1: 4
    Logfile groups in thread 2: 4
    
  4. 如果有足夠的待機重做記錄群組,請略過這個步驟。待命重做記錄群組的大小必須與每個線上重做記錄群組相同。使用下列 PL/SQL 程式碼,建立所需數量的待命重做記錄群組:

    SET FEEDBACK OFF
    SET SERVEROUTPUT ON
    DECLARE
      CURSOR cur_thread IS
        SELECT THREAD# THREAD, COUNT(*) COUNT FROM V$LOG GROUP BY THREAD#;
      standbylog_count NUMBER := 0;
      standbylog_group NUMBER := 0;
      standbylog_size NUMBER := 0;
      last_group_number NUMBER;
      sqlstmt VARCHAR2(200);
    BEGIN
      SELECT MAX(GROUP#), MAX(BYTES)
    INTO last_group_number, standbylog_size
    FROM V$LOG;
      standbylog_group := last_group_number + 1;
      FOR rec_thread IN cur_thread LOOP
    standbylog_count := rec_thread.count + 1;
    FOR i IN 1..standbylog_count LOOP
      sqlstmt := 'ALTER DATABASE ADD STANDBY LOGFILE THREAD ' || rec_thread.thread || ' GROUP ' || TO_CHAR(standbylog_group) || ' SIZE ' || standbylog_size || ';';
      DBMS_OUTPUT.PUT_LINE( sqlstmt);
      standbylog_group := standbylog_group + 1;
    END LOOP;
      END LOOP;
    END;
    /
    SET FEEDBACK ON
    

    以下範例輸出內容會指示您為兩個執行緒各建立五個待命重做記錄群組:

    ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP  9 SIZE 2147483648;
    ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 10 SIZE 2147483648;
    ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 11 SIZE 2147483648;
    ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 12 SIZE 2147483648;
    ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 13 SIZE 2147483648;
    ALTER DATABASE ADD STANDBY LOGFILE THREAD 2 GROUP 14 SIZE 2147483648;
    ALTER DATABASE ADD STANDBY LOGFILE THREAD 2 GROUP 15 SIZE 2147483648;
    ALTER DATABASE ADD STANDBY LOGFILE THREAD 2 GROUP 16 SIZE 2147483648;
    ALTER DATABASE ADD STANDBY LOGFILE THREAD 2 GROUP 17 SIZE 2147483648;
    ALTER DATABASE ADD STANDBY LOGFILE THREAD 2 GROUP 18 SIZE 2147483648;
    
  5. 確認備援重做記錄是否已正確設定:

    SELECT 'Logfile groups in thread ' || THREAD# || ': ' || COUNT(*) FROM V$LOG GROUP BY THREAD#
    UNION
    SELECT 'Standby logfile groups in thread ' || THREAD# || ': ' || COUNT(*) FROM V$STANDBY_LOG GROUP BY THREAD#;
    

    下列輸出內容每個執行緒有四個線上重做記錄群組,每個執行緒有五個待命重做記錄群組:

    Logfile groups in thread 1: 4
    Logfile groups in thread 2: 4
    Standby logfile groups in thread 1: 5
    Standby logfile groups in thread 2: 5
    
  6. 退出 SQL*Plus:

    EXIT;
    

將資料庫參數和密碼檔案複製到待命伺服器

  1. 建立資料庫參數檔案,並將檔案複製到待命伺服器:

    1. 建立待命資料庫參數檔案 (pfile) 的資料夾:

      mkdir /home/oracle/backup
      
    2. 啟動 SQL*Plus,然後建立待機資料庫 pfile

      sqlplus / as sysdba
      
      CREATE PFILE='/home/oracle/backup/initDBDG_SITE21.ora' FROM SPFILE;
      
    3. 請結束 SQL*Plus,然後將 pfile 複製到待命位置的第一個 Bare Metal 解決方案伺服器:

      EXIT;
      
      scp /home/oracle/backup/initDBDG_SITE21.ora ORACLE_USERNAME@site2db1:/apps/oracle/19.0.0/db_home1/dbs/initDBDG_SITE21.ora
      
  2. 請務必安全地儲存 SYS 遠端登入密碼。如果您不知道密碼,請重設密碼

  3. 將密碼檔案複製到待命叢集:

    1. 使用 srvctl 指令取得密碼檔案的位置:

      srvctl config database -db DBDG_SITE1 | grep -i password
      

      以下輸出內容會顯示 ASM 中密碼檔案儲存位置:

        Password file: +DATA/DBDG_SITE1/PASSWORD/pwdDBDG_SITE1.287.1086459663
      
    2. 使用 asmcmd 指令,在本機檔案系統中建立密碼檔案的臨時副本:

      asmcmd cp +DATA/DBDG_SITE1/PASSWORD/pwdDBDG_SITE1.287.1086459663 /tmp/orapwDBDG_SITE21
      
    3. 將密碼檔案複製到備用位置的第一個 Bare Metal 解決方案伺服器,然後從主要位置的 Bare Metal 解決方案伺服器中刪除臨時副本:

      scp /tmp/orapwDBDG_SITE21 ORACLE_USERNAME@site2db1:/apps/oracle/19.0.0/db_home1/dbs/orapwDBDG_SITE21
      rm /tmp/orapwDBDG_SITE21
      

設定資料庫連線

在主要資料庫位置的每部 Bare Metal 解決方案伺服器上編輯 $ORACLE_HOME/network/admin/tsnames.ora 檔案,以更新網路服務設定。檔案中包含三個項目,每個資料庫一個,以及用於複製資料庫的臨時項目,您稍後會刪除這個項目:

DBDG_SITE1 =
  (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = DBDG_SITE1_SCAN_HOSTNAME)(PORT = 1521))
      (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = DBDG_SITE1) (UR=A)
      )
  )

DBDG_SITE2 =
 (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = DBDG_SITE2_SCAN_HOSTNAME)(PORT = 1521))
      (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = DBDG_SITE2) (UR=A)
      )
  )

DBDG_SITE2_FOR_DUPLICATION =
  (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = site2db1)(PORT = 1523))
      (CONNECT_DATA =
          (SERVER = DEDICATED)
          (INSTANCE_NAME = DBDG_SITE21) (UR=A)
      )
  )

主要資料庫現在已可用於 Data Guard 設定。

後續步驟

接著,建立 Data Guard 的待命資料庫