測試環境中,新搭建的Oracle 19c DG,在主備切換後,新的主庫的告警日誌中一直出現類似下面這樣的錯誤:
.........................................
2024-07-08T13:40:55.384302+08:00
rfs (PID:146054): Database mount ID mismatch [0x358d50ef:0x358e23cd] (898453743:898507725)
rfs (PID:146054): Client instance is standby database instead of primary
rfs (PID:146054): Not using real application clusters
.........................................
原因分析
在備庫上檢查引數log_archive_dest_2,fal_server,fal_client等引數。
SQL> show parameter log_archive_dest_2;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_2 string service=gsp lgwr async valid_f
or=(all_logfiles,all_roles) db
_unique_name=gsp
log_archive_dest_20 string
log_archive_dest_21 string
log_archive_dest_22 string
log_archive_dest_23 string
log_archive_dest_24 string
log_archive_dest_25 string
log_archive_dest_26 string
log_archive_dest_27 string
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_28 string
log_archive_dest_29 string
SQL> show parameter fal
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
fal_client string
fal_server string gsp
SQL>
如上所示,由於引數log_archive_dest_2中設定VALID_FOR=(all_logfiles,all_roles),從而導致備庫(standby database)會將redo log & standby redo log傳送回主庫,從而導致這些訊息寫入到主庫的告警日誌當中。其實這裡是因為引數不合理設定導致,簡單來說,有兩個解決方法。請見下面內容。
解決方案:
方法1:在備庫上清空引數log_archive_dest_2
SQL> alter system set log_archive_dest_2='' scope=both;
System altered.
方法2: 在備庫,將log_archive_dest_2引數的VALID_FOR調整為(ONLINE_LOGFILES,PRIMARY_ROLE)
SQL> alter system set log_archive_dest_2='service=gsp lgwr async valid_for=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=gsp' scope=both;
官方文件Database mount ID mismatch ORA-16009: invalid redo transport destination (Doc ID 1450132.1)中也有相關案例介紹,文件中的例子是因為克隆了備庫,但是沒有移除DG的相關配置,解決方法如下所示:
SQL> alter system set log_archive_dest_n='' scope=both sid='*';- one that points to original Primary
SQL> alter system set fal_server='' scope=both sid='*';
SQL> alter system set fal_client='' scope=both sid='*';
知識總結:
本文案例就是因為沒有搞清楚DG相關引數的區別,疏忽大意導致的,那麼下面就簡單將介紹一下VALID_FOR的意義
在DG的配置中,初始化引數LOG_ARCHIVE_DEST_n用來指定redo log的存放位置,可以存放在本地,也可以指定redo transport的位置。其中VALID_FOR屬性用來控制日誌傳輸,其格式為:VALID_FOR=(redo_log_type,database_role)。
VALID_FOR屬性由2部分組成:archive_source(online_logfile,standby_logfile,all_logfiles)和database_role(primary_role,standby_role,all_role).
online_logfile: 表示歸檔聯機重做日誌
standby_logfile:表示歸檔備用資料庫的重做日誌/接受來自主庫的重做日誌
all_logfiles: online_logfile && standby_logfile
primary_role: 僅當資料庫角色為主庫時候生效
standby_role: 僅當資料庫角色為備庫時候生效
all_role: 任意角色均生效
注意事項:沒有寫VALID_FOR時,預設VALID_FOR=(all_logfiles,all_roles)