準備 Data Guard 的主要資料庫
Data Guard 需要主要資料庫和至少一個待命資料庫才能運作。在 Bare Metal 解決方案上設定 Data Guard 之前,請建立主要資料庫。
本指南中會使用以下範例:
資料庫專屬名稱 | 伺服器主機名稱 | RAC 執行個體名稱 | 角色 |
---|---|---|---|
DBDG_SITE1 | site1db1、site1db2 | DBDG_SITE11、DBDG_SITE12 | 主要 |
DBDG_SITE2 | site2db1、site2db2 | DBDG_SITE21、DBDG_SITE22 | 待命 |
本指南中執行 Oracle 的 Bare Metal 解決方案伺服器,已設定下列環境變數:
環境變數名稱 | 值 |
---|---|
ORACLE_BASE | /apps/oracle/oracle_base |
ORACLE_HOME | /apps/oracle/19.0.0/db_home1 |
視設定而定,您可能需要修改環境變數路徑。
設定主要資料庫
登入代管主要資料庫的第一部 Bare Metal 解決方案伺服器。
在
/etc/oratab
檔案中新增項目,讓oraenv
指令能夠為主要資料庫設定環境變數。修改執行個體名稱,讓名稱與各節點上執行的執行個體相符,並指定 Oracle 資料庫主目錄的完整路徑:DBDG_SITE11:ORACLE_HOME:N
設定
ORACLE_SID
環境變數,以便連線至主要資料庫:source oraenv <<< "DBDG_SITE11"
您應該會收到回應
The Oracle base has been set to /apps/oracle/oracle_base
。
設定資料庫記錄功能並啟用回溯資料庫
啟動 SQL*Plus,然後啟用
force logging
,以便記錄新增至資料庫的nologging
表格空間:sqlplus / as sysdba
ALTER DATABASE FORCE LOGGING;
確認
archivelog mode
和flashback database
已開啟:ARCHIVE LOG LIST; SELECT LOG_MODE, FLASHBACK_ON FROM V$DATABASE;
如果
archivelog mode
和flashback database
為關閉狀態,請使用下列 SQL 指令將其開啟:停止叢集資料庫,以便進行必要變更:
srvctl stop database -d
執行必要的 SQL 指令,開啟
archivelog mode
和flashback 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;
再次啟動叢集資料庫:
srvctl start database -d DBDG_SITE1
為 Data Guard 準備資料庫
登入主資料庫所在的首個 Bare Metal Solution 伺服器,並設定
ORACLE_SID
環境變數,以便連線至主資料庫:source oraenv <<< "DBDG_SITE11"
您應該會收到回應
The Oracle base has been set to /apps/oracle/oracle_base
。啟動 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;
檢查資料庫中是否有待命重做記錄。每個執行緒的待機重做記錄群組數量,必須比線上重做記錄群組數量多一個。
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
如果有足夠的待機重做記錄群組,請略過這個步驟。待命重做記錄群組的大小必須與每個線上重做記錄群組相同。使用下列 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;
確認備援重做記錄是否已正確設定:
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
退出 SQL*Plus:
EXIT;
將資料庫參數和密碼檔案複製到待命伺服器
建立資料庫參數檔案,並將檔案複製到待命伺服器:
建立待命資料庫參數檔案 (
pfile
) 的資料夾:mkdir /home/oracle/backup
啟動 SQL*Plus,然後建立待機資料庫
pfile
:sqlplus / as sysdba
CREATE PFILE='/home/oracle/backup/initDBDG_SITE21.ora' FROM SPFILE;
請結束 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
請務必安全地儲存 SYS 遠端登入密碼。如果您不知道密碼,請重設密碼。
將密碼檔案複製到待命叢集:
使用
srvctl
指令取得密碼檔案的位置:srvctl config database -db DBDG_SITE1 | grep -i password
以下輸出內容會顯示 ASM 中密碼檔案儲存位置:
Password file: +DATA/DBDG_SITE1/PASSWORD/pwdDBDG_SITE1.287.1086459663
使用
asmcmd
指令,在本機檔案系統中建立密碼檔案的臨時副本:asmcmd cp +DATA/DBDG_SITE1/PASSWORD/pwdDBDG_SITE1.287.1086459663 /tmp/orapwDBDG_SITE21
將密碼檔案複製到備用位置的第一個 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 設定。