Data Guardの保護モードについて調査しました。
製品バージョンによって、保護モードの設定方法が変わるものもありますが、今回は12cR1を調査対象としています。
保護モードには3つあります。
・最大保護モード
・最大可用性モード
・最大パフォーマンスモード
保護モードはデータ保護、システム性能など優先する要件によって使い分けます。
・データ保護(プライマリDBとスタンバイDBのデータ整合性など)
・システム性能(プライマリDBに対するスタンバイDBからの応答速度など)
最大保護モード
プライマリDBとスタンバイDBでデータ整合性(プライマリDB障害時、スタンバイDBはデータロストなし)が保証されている状態です
プライマリDBでデータコミットし、REDOデータ転送後、プライマリDBはスタンバイDB(RFSプロセス)からコミット応答を待ちます
コミット応答受信後、プライマリDBもコミット確定します
障害等でスタンバイDBから応答がない場合、プライマリDBは停止します
一般的にはプライマリDBの停止を回避するため、マルチスタンバイ構成にし、1つのスタンバイDBが壊れてもプライマリDBが停止しないようにします
データ保護を優先するモードです
SQL> select protection_mode, protection_level from v$database;
PROTECTION_MODE PROTECTION_LEVEL
------------------------------ ------------------------------
MAXIMUM PROTECTION MAXIMUM PROTECTION
最大可用性モード
プライマリDBとスタンバイDBでデータ整合性(プライマリDB障害時、スタンバイDBはデータロストなし)が(通常時は)保証されている状態です
プライマリDBでデータコミットし、REDOデータ転送後、プライマリDBはスタンバイDB(RFSプロセス)からコミット応答を待ちます
コミット応答受信後、プライマリDBもコミット確定します
ただし、プライマリDBから受信したREDOデータをスタンバイDBで確認するタイミングによって、コミット応答のタイミングが変わります
確認タイミングがAFFIRMの場合、プライマリDBから受信したREDOデータをスタンバイREDOログへ書き込んだ後にプライマリDBへコミット応答します(データ書込み完了まで待って応答する)
確認タイミングがNOAFFIRMの場合、プライマリDBから受信したREDOデータをスタンバイREDOログへ書き込む前にプライマリDBへコミット応答します(データ書き込み完了を待たず応答する)
※11gR2では、確認タイミングに指定できるのはAFFIRMだけでした
障害等でスタンバイDBから応答がない場合、保護モードを最大パフォーマンスモードへ遷移して稼働を継続します
通常時はデータ保護、障害時はシステム性能を優先するモードです
SQL> select protection_mode, protection_level from v$database;
PROTECTION_MODE PROTECTION_LEVEL
------------------------------ ------------------------------
MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY
最大パフォーマンスモード
プライマリDBとスタンバイDBでデータ整合性(プライマリDB障害時、スタンバイDBはデータロストあり)が保証されない状態です
プライマリDBでデータコミット、REDOデータ転送後、プライマリDBはスタンバイDB(RFSプロセス)からコミット応答を待たずにコミット確定します
デフォルトの保護モードです
システム性能を優先するモードです
SQL> select protection_mode, protection_level from v$database;
PROTECTION_MODE PROTECTION_LEVEL
------------------------------ ------------------------------
MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE
保護モードの動きを整理しました。
●REDOデータ転送プロセス
NSS (Network Server Sync)
プライマリDBのREDOデータを同期形式でスタンバイDBのRFSプロセスへ転送するプロセス
プライマリDBはデータコミットし、REDOデータ転送後、スタンバイDBのRFSプロセスからの応答を待つ
NSA (Network Server Async)
プライマリDBのREDOデータを非同期形式でスタンバイDBのRFSプロセスへ転送するプロセス
プライマリDBはデータコミットし、REDOデータ転送後、スタンバイDBのRFSプロセスからの応答を待たない
●REDOデータ転送モード
SYNC
プライマリDBはデータコミットし、REDOデータ転送後、スタンバイDBのRFSプロセスからの応答を待つ
ASYNC
プライマリDBはデータコミットし、REDOデータ転送後、スタンバイDBのRFSプロセスからの応答を待たない
●受信したREDOデータの確認タイミング(コミット応答タイミング)
AFFRIM
プライマリDBから受信したREDOデータをスタンバイREDOログへ書き込んだ後に確認する(スタンバイREDOログに書き込み完了したらコミット応答する)
NOAFFIRM
プライマリDBから受信したREDOデータをスタンバイREDOログへ書き込む前に確認する(スタンバイREDOログに書き込む前にコミット応答する)
【参考】
プライマリDBで保護モードを変更する際、プライマリDBがOPENモードだと下記エラーが発生しました
MOUNTモードで再起動後、alter文を再実行したらコマンド正常終了しました
------------------------------------------------------------
SQL> alter database set standby database to maximize PROTECTION;
alter database set standby database to maximize PROTECTION
*
行1でエラーが発生しました。:
ORA-01126: データベースはこのインスタンスでマウントし、どのインスタンスでもオープンしないでください
------------------------------------------------------------
■参考文献
Oracle Data Guardの保護モード
LOG_ARCHIVE_DEST_nパラメータの属性
Active Data Guard diffs from 11gR2 to 19c - Speaker Deck