2022年4月8日 星期五

4. 建立 Logical Standby

自 Oracle 10g 開始,建立 Logical Standby 都需要先把它建成 Physical Standby ,然後再 convert 為 Logical Standby 。


Physical Standby 轉成 Logical Standby 之前,有幾個步驟需要先進行設定,首先停止 Physical Standby 的 log apply :

SQL> alter database recover managed standby database cancel;


接下來於 Primary 資料庫 Build Logminer Directory ,由於 Logical Standby 使用的是 SQL Apply ,這邊會透過 Logminer 功能於 Redo Log 擷取 SQL Statement ,因此需要 Build Logminer Directory 讓 Logminer 得以進行,執行 BUILD 之後會同時 enable supplemental log 並且等到當下所有 transaction 完成 :

SQL> EXECUTE DBMS_LOGSTDBY.BUILD;


最後添加參數 LOG_ARCHIVE_DEST_3 , Logical Standby 使用的是 SQL Apply ,資料庫的狀態為 open read write ,在 Apply 的過程中除了接收 Primary 傳過來的 Redo Log ,自己也會同時產生屬於自己的 Redo Log ,因此需要多設定一個 Archive Log 路徑才存放 Logical Standby 自己產生的 Archive Log ,鑒於有可能會做角色切換, LOG_ARCHIVE_DEST_3 需要同時在 Primary 與 Standby 進行設定 :

SQL> alter system set log_archive_dest_3='location=/u01/arch/standby

VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLES) DB_UNIQUE_NAME=orcldg';

SQL> alter system set log_archive_dest_state_3='enable';


VALID_FOR 參數 STANDBY_LOGIFLES 表示只有 Standby Redo Log 適用此設定; STANDBY_ROLES 表示只有在角色為 Standby 時才套用此設定。


DB_UNIQUE_NAME 參數,在 Standby 端設定時為 Standby 的 unique name (orcldg) ;在 Primary 設定時為 Primary 的 unique name (orcl) 。


前置設定完成後,就可以轉換為 Logical Standby , Logical Standby 為 open read write 模式,可以視為是一個獨立的資料庫,資料庫名稱要與 Primary 不同,因此從 Physical Standby convert 過來的同時需要賦予 Logical Standby 資料庫一個新的 DB Name ,這邊給予 orcls ,轉換時 Standby 資料庫要處於 mount 狀態然後執行 :

SQL> alter database recover to logical standby orcls;


由於 Standby 的 DB Name 已經改變,因此原先的 password file 已不可用,需要重建 password file ,假設 Standby 的 SID 維持 orcl ,使用 orapwd 重建 password file :

$ orapwd file=/opt/app/oracle/product/11.2.0.4/dbhome_1/dbs/orapworcl password=welcome1


Convert 完之後將 Logical Standby 開啟至 read write 模式 :

SQL> alter database open resetlogs;


最後啟動 logical apply :

SQL> alter database start logical standby apply immediate;


啟動 logical apply 之後可以從以下命令查詢相關訊息:

SQL> select sequence#, first_time, next_time, dict_begin, dict_end

 from dba_logstdby_log order by sequence#;

(查詢傳送過來的 archive log 是否有被 Standby register)


SQL> select name, value from v$logstdby_stats where name = 'coordinator state';

      (查詢 log 是否已 apply)


SQL> select type, high_scn, status from v$logstdby;

SQL> select applied_scn, latest_scn from v$logstdby_progress;

      (查詢 SQL Apply Status)


由於 Logical Standby 是使用 SQL Apply ,有些物件以及 Data Type 是不支援同步的,例如 Materialized View 、 XML Data Type 、 LOB Data Type …等是沒有支援的,可以從 dba_logstdby_unsupported_table 查詢 Logical Standby 裡面有哪些物件是沒有被支援的 :

SQL> select * from dba_logstdby_unsupported_table order by owner;


Logical Standby 早期多是運用在資料庫的 rolling-upgrade 以減少升級過程中服務停止的時間,而同樣是 SQL Apply 的功能, Logical Standby 如今漸漸的被 Oracle 的另一項產品 Golden Gate 取代,實務上 Logical Standby 已經很少使用。



沒有留言:

張貼留言