忘れかけのIT備忘録

今まで学んできた知識や小技、なるほど!と思ったことをメモするブログです。

Data Guardの保護モード

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

保護モードの動きを整理しました。

同期モード(SYNC AFFIRM)

準同期モード(SYNC NOAFFIRM)

非同期モード(ASYNC NOAFFIRM)


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