Data GuardのスタンバイサイトがRAC構成だった場合、片ノードで稼働しているMRPプロセスがリアルタイム適用中に異常終了したときの動きを検証してみました。
■検証環境、前提、設定情報
Data Guardのスナップショット・スタンバイ検証 - 忘れかけのIT備忘録 と同様
■検証パターン
①リアルタイム適用中にノード1のMRPプロセスkill
リアルタイム適用中にスタンバイ側のノード1で稼働しているMRPプロセスkillした場合の動きを検証します
【検証手順】
1. [スタンバイDB(ノード1)]適用モード確認
2. [スタンバイDB(両ノード)]MRPプロセス確認
3. [スタンバイDB(ノード1)]MRPプロセスkill
4. [スタンバイDB(両ノード)]MRPプロセス確認
5. [スタンバイDB(ノード1)]MRP起動
【想定】
MRPプロセスがノード2にフェイルオーバーし、リアルタイム適用が継続されること
【検証結果】
MRPプロセスがノード2にフェイルオーバーし、リアルタイム適用が継続されなかった
→ノード1のMRPプロセスkill後、ノード1、ノード2ともにMRPプロセスはいなかった
【作業ログ】
SQL> select client_process, process, thread# ,sequence# ,status from v$managed_standby where process = 'MRP0';
CLIENT_PROCESS PROCESS THREAD# SEQUENCE# STATUS
-------------------- -------------------- ---------- ---------- --------------------
N/A MRP0 1 15 APPLYING_LOG
2. [スタンバイDB(両ノード)]MRPプロセス確認
#ノード1
[root@dr-node1 ~]# ps -ef|grep mrp|grep -v grep
oracle 15828 1 0 14:07 ? 00:00:00 ora_mrp0_orcldr1
[root@dr-node1 ~]#
#ノード2
[root@dr-node2 ~]# ps -ef|grep mrp|grep -v grep
[root@dr-node2 ~]#
3. [スタンバイDB(ノード1)]MRPプロセスkill
[root@dr-node1 ~]# kill -9 15828
4. [スタンバイDB(両ノード)]MRPプロセス確認
#ノード1
[root@dr-node1 ~]# ps -ef|grep mrp|grep -v grep
[root@dr-node1 ~]#
#ノード2
[root@dr-node2 ~]# ps -ef|grep mrp|grep -v grep
[root@dr-node2 ~]#
★両ノードともにMRPプロセスはいなかった(自動復旧しなかった)
5. [スタンバイDB(ノード1)]適用モード確認
SQL> select client_process, process, thread# ,sequence# ,status from v$managed_standby where process = 'MRP0';
レコードが選択されませんでした。
SQL> alter database recover managed standby database disconnect;
データベースが変更されました。
SQL> select client_process, process, thread# ,sequence# ,status from v$managed_standby where process = 'MRP0';
CLIENT_PROCESS PROCESS THREAD# SEQUENCE# STATUS
-------------------- -------------------- ---------- ---------- --------------------
N/A MRP0 2 13 APPLYING_LOG
6. [スタンバイDB(両ノード)]MRP起動
#ノード1
[root@dr-node1 ~]# ps -ef|grep mrp|grep -v grep
oracle 23009 1 0 14:25 ? 00:00:00 ora_mrp0_orcldr1
[root@dr-node1 ~]#
#ノード2
[root@dr-node2 ~]# ps -ef|grep mrp|grep -v grep
[root@dr-node2 ~]#
★リアルタイム適用開始後、ノード1でMRPプロセスが動いていた
【参考】
スタンバイ側のMRPプロセスkillしたときの各ノードのDBアラートログも確認してみました
プライマリ側(ノード1)
プロセスkill付近の時間帯は出力なし
プライマリ側(ノード2)
プロセスkill付近の時間帯は出力なし
スタンバイ側(ノード1)
Sat Nov 05 14:18:27 2022
MRP0: Background Media Recovery terminated with error 448
Sat Nov 05 14:18:27 2022
Recovery coordinator died, shutting down parallel recovery
Sat Nov 05 14:18:27 2022
Errors in file /u01/app/oracle/diag/rdbms/orcldr/orcldr1/trace/orcldr1_pr00_15842.trc:
ORA-00448: バックグラウンド・プロセスが正常終了しました。
Sat Nov 05 14:18:27 2022
Managed Standby Recovery not using Real Time Apply
Sat Nov 05 14:18:27 2022
Recovery interrupted!
Recovered data files to a consistent state at change 6007961
Sat Nov 05 14:18:27 2022
Errors in file /u01/app/oracle/diag/rdbms/orcldr/orcldr1/trace/orcldr1_pr00_15842.trc:
ORA-00448: バックグラウンド・プロセスが正常終了しました。
スタンバイ側(ノード2)
Sat Nov 05 14:18:27 2022
Managed Standby Recovery not using Real Time Apply
■おわりに
RAC構成でも片ノードのMRPプロセスが異常終了した場合、別ノードにフェイルオーバーされるわけではありませんでした。