2022年4月22日 星期五

5. Data Guard Broker

Data Guard Broker 為 Oracle 10g 開始有的一個工具,主要的用途是透過一個統一的介面來管理 Data Guard 架構,在沒有使用 Data Guard Broker 時,檢查 Data Guard 必須登入 Primary Database 查詢 Archive Log 的序號,然後再登入到 Standby Database 檢查 Archive Log Apply 的序號是否已經跟上 Primary ,或是檢查 Primary 與 Standby 的 Alert Log 來確認 Data Guard 同步的機制是否正常;在有了 Data Guard Broker 之後,管理 Data Guard 就只需要透過一個統一的介面與簡單的命令就可以完成這些檢查,在 Data Guard 的維護與管理上省去很多麻煩。除此之外, Data Guard Broker 也可以幫助我們設定 Data Guard ,透過 Data Guard Broker 將不再需要自行手動設定 Data Guard 的相關參數,我們要做的只需要完成 Standby Database 的初始化,那些參數的設定就交給 Data Guard Broker 處理吧。


在使用 Data Guard Broker 前必須先做一些設定,首先必須於資料庫中設定 Data Guard Broker 的參數:

NAME                            TYPE       VALUE

-------------------------- --------- --------------------

dg_broker_config_file1      string     /u01/dg/dr1orcl.dat

dg_broker_config_file2      string     /u01/dg/dr2orcl.dat

dg_broker_start              boolean    TRUE


dg_broker_config_file 為 Data Guard Broker 的設定檔位置,在啟動 Broker 之後會自動產生檔案,預設會放在 $ORACLE_HOME/dbs 目錄底下,如果是 RAC 環境,必須更改位置到節點可以 Shared 的目錄; dg_broker_start 參數設定為 TRUE 表示啟用 Data Guard Broker ,啟用之後資料庫會產生一個 DMON Process (Data Guard Monitor Process) 。


設定完參數之後,接下來要替資料庫新增一組靜態註冊到 listener 給 Broker 所用,這組 listener 註冊的名稱必須為 <db_unique_name>_DGMGRL , Data Guard Broker 在執行角色切換的時候,預設會使用這組 Service Name 來連線到 Primary 與 Standby Database 進行資料庫的重啟,在 Oracle 12c 以後,如果有安裝 GI ,那麼 Data Guard Broker 會透過 GI 來重啟 Primary 與 Standby ,此時不需要設定 <db_unique_name>_DGMGRL ;如果沒有使用 GI ,那就還是要設定 <db_unique_name>_DGMGRL 這組 Service Name :

Primary 端的 listener.ora 設定:

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (GLOBAL_DBNAME = orcl_DGMGRL)

      (ORACLE_HOME = /u01/app/oracle/product/19.3.0/dbhome_1)

      (SID_NAME = orcl)

    )

  )


Standby 端的 listener.ora 設定:

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (GLOBAL_DBNAME = orcldg_DGMGRL)

      (ORACLE_HOME = /u01/app/oracle/product/19.3.0/dbhome_1)

      (SID_NAME = orcl)

    )

  )


進行 listener reload 讓設定生效 :

$ lsnrctl reload


在 Standby 完成初始化之後,便可以利用 Data Guard Broker 將 Primary 與 Standby 的關係建立起來,其中除了 log_archive_dest_1 參數需自行設定外,其餘的參數就交由 Data Guard Broker 來設定,以 dgmgrl 登入 Primary 資料庫建立 Data Guard 設定:

$ dgmgrl sys/welcome1@orcl_p

DGMGRL> create configuration 'ORCL_DG' as primary database is 'orcl' connect identifier is orcl_p;


參數說明如下:

create configuration 'ORCL_DG' 建立 Data Guard 的設定,自行命名,在此設定為 orcl_dg 。

primary database is 'orcl' 設定 Primary Database ,這邊使用的是 Primary Database 的 db_unique_name ,為 orcl 。

connect identifier is orcl_p 設定 Primary Database 的連線,使用的是 tnsnames.ora 的連線設定。


建立好 Configuration 之後,再把 Standby Database 加入進來:

DGMGRL> add database 'orcldg' as connect identifier is orcl_s maintained as physical;


參數說明如下:

add database 'orcldg' 新增 Standby Database orcldg ,這邊使用的是 Standby Database 的 db_unique_name 。

connect identifier is orcl_s 設定 Standby Database 的連線,使用的是 tnsnames.ora 的連線設定。

maintained as physical 表示這是 Physical Standby 。


最後將 Data Guard Broker 的設定啟用,這樣就完成了 Data Guard 的設定 :

DGMGRL> enable configuration;


觀察 Data Guard 的狀態只需要透過 Broker 執行 show configuration ,就可以檢查 Data Guard 的機制是否正常:

$ dgmgrl /

DGMGRL> show configuration;

基本上看到 SUCCESS 且沒有其它的告警訊息就是正常。


透過 show database 指令可以查詢 Data Guard 成員的詳細資訊:

DGMGRL> show database verbose 'orcl';  (查詢 Primary 資料庫 orcl 資訊)

DGMGRL> show database verbose 'orcldg';  (查詢 Standby 資料庫 orcldg 資訊)


如果是 RAC 資料庫,則可以更進一步地用 show instance 來查詢每個 Instance 的詳細資訊:

DGMGRL> show instance verbose 'orcl1' on database 'orcl';

  (查詢 RAC Primary 資料庫 orcl 第一個 Instance orcl1 的資訊)

DGMGRL> show instance verbose 'orcldg2' on database 'orcldg';

  (查詢 RAC Standby 資料庫 orcldg 第二個 Instance orcldg2 的資訊)


經由 show database 或 show instance 可以看到 StaticConnectIdentifier 的設定,這個就是 Data Guard Broker 在執行角色切換時會使用的連線字串,預設使用的 Service Name 為 <db_unique_name>_DGMGRL ,這也就是為什麼前面一開始要在 Listener 增加一組靜態註冊的原因,如果沒有這個 Service Name ,那麼透過 Broker 在執行切換時便會無法連線到 Primary 與 Standby 執行 DB 重啟的動作,這時候就要手動介入將 DB 完成重啟,以及切換的後續步驟。


show database verbose 上面所看到的設定都可以用 set property 指令來更改,例如更改 ArchiveLagTarget 這個設定為 300 :

DGMGRL> edit database 'orcl' set property 'ArchiveLagTarget' = 300;


在 Data Guard Broker 啟動之後,會於 Listener 上面自動註冊一組 <db_name>_DGB 的 Service Name ,這是 Broker 預設所使用的 Service Name ,到了 Oracle 12c 之後,這個名稱預設變為 <db_name>_CFG ,這個設定可以從 show configuration verbose 裡面的 ConfigurationWideServiceName 看到 :


Data Guard Broker 除了可以用來檢查狀態之外,也可以用來進行 Data Guard 的相關操作 :

DGMGRL> edit database 'orcl' set state = 'TRANSPORT-OFF';

DGMGRL> edit database 'orcl' set state = 'TRANSPORT-ON';

  (Primary Database orcl 停止/開始 傳送 archive log)

 

DGMGRL> edit database 'orcldg' set state = 'APPLY-OFF';

DGMGRL> edit database 'orcldg' set state = 'APPLY-ON';

  (Standby Database orcldg  停止/啟用  MRP)


Data Guard 的維護上如果沒有使用 Broker ,那麼 DBA 就必須要透過 SQL*Plus 登入 Primary 與 Standby 來檢查狀態,或是撰寫一些腳本來檢查,有了 Data Guard Broker 之後,只需要執行一個 show configuration 指令就可以完成檢查,相較之下變的簡單許多,最後要注意的是,使用了 Data Guard Broker 之後,與 Data Guard 相關的參數就不建議再透過 SQL*Plus 使用 alter system 更改,這些參數一律交由 Broker 管理,如果有變更的需要,那也必須經由 Broker 的 DGMGRL 使用 set property 指令來更改,否則有可能因為實際的參數設定與 Broker 所記錄的參數設定不同導致 Broker 產生一些錯誤。

沒有留言:

張貼留言