レック・テクノロジー・コンサルティング株式会社TECH BLOG

Data Guard 管理リカバリの実行状態確認

Data Guard(フィジカル・スタンバイ・データベース)では、管理リカバリ・プロセスのステータス確認が重要です。V$MANAGED_STANDBYビューを使って、どこまでの情報が同期されたかアーカイブログのスレッドと順序番号を確認することができます。

しかしながら Oracle Database 12cリリース2 (12.2.0.1) 以降、V$MANAGED_STANDBYビュー は非推奨になりました。代わりに V$DATAGUARD_PROCESSビューを使うようアナウンスされています。

【補足】
本記事時点の長期リリースである19cにも V$MANAGED_STANDBYビューは存在しています。また最新のイノベーション・リリースである21c でも存在を確認しています。今しばらくは V$MANAGED_STANDBYビューを使うことはできます。

V$MANAGED_STANDBYビューでの確認

管理リカバリ・プロセス(MRP0)の確認をする際に、以下のような問合せを実行しているケースがあると思います。

※記事中のSQL文は SQL*Plusで "SET MARKUP CSV ON" を設定して実行しています。

SQL> SELECT PROCESS,PID,STATUS,THREAD#,SEQUENCE# FROM V$MANAGED_STANDBY WHERE PROCESS='MRP0';

"PROCESS","PID","STATUS","THREAD#","SEQUENCE#"
"MRP0","209078","APPLYING_LOG",2,224

スレッド2の順序番号224のアーカイブログを適用中(STATUS=APPLYING_LOG)であると判別できます。

V$DATAGUARD_PROCESSビューでの確認

従来 V$MANAGED_STANDBYビューで行なっていた内容を V$DATAGUARD_PROCESSビューに置き換える場合は次の問合せ文が使えます。

SQL> SELECT NAME,PID,ACTION,THREAD#,SEQUENCE# FROM V$DATAGUARD_PROCESS WHERE NAME='PR00';

"NAME","PID","ACTION","THREAD#","SEQUENCE#"
"PR00","209083","APPLYING_LOG",2,224

変更は次の二つです。

・PROCESS列とSTATUS列をそれぞれNAME列とACTION列に置き換えています。
・WHERE句でPROCESS列に指定していたプロセス名を"MRP0"でなく"PR00"にしています。

"PR00"はメディア・リカバリをパラレル実行するためのプロセスです。この例では簡略化のためWHERE句のプロセス名"PR00"と決め打ちしています。実際には数字部分の異なる複数プロセスが存在しますのでご注意ください。"PRnn" と表されるもので製品ドキュメントでは次のように説明されています。

PRnnは、パラレル・メディア・リカバリを実行しているコーディネータ・プロセスのスレーブ・プロセスとして機能し、コーディネータにより割り当てられたタスクを実行する。このプロセスのデフォルトの数は、CPUの数に基づいている。

Oracle Databaseデータベース・リファレンス, 19c  / F バックグラウンド・プロセス より引用

ちなみに、この例のデータベース・インスタンスには3つ存在していました。

"PR00"のほかに"PR01"と"PR02"が表示されています。問い合わせにROLE列を加えてみたところ、"PR00"と"PR01","PR02"では役割が異なるようです。

SQL> SELECT NAME,PID,ACTION,THREAD#,SEQUENCE#,ROLE FROM V$DATAGUARD_PROCESS WHERE NAME LIKE 'PR%';

"NAME","PID","ACTION","THREAD#","SEQUENCE#","ROLE"
"PR00","209083","APPLYING_LOG",2,224,"recovery logmerger"
"PR02","209087","IDLE",0,0,"recovery apply slave"
"PR01","209085","IDLE",0,0,"recovery apply slave"

ついでに確認

MRP0 を問い合わせた場合

V$DATAGUARD_PROCESSビューへの問合せで、V$MANAGED_STANDBYビューと同じようにプロセス名を"MRP"にした場合を確認してみます。

SQL> SELECT NAME,PID,ACTION,THREAD#,SEQUENCE# FROM V$DATAGUARD_PROCESS WHERE NAME='MRP0';

"NAME","PID","ACTION","THREAD#","SEQUENCE#"
"MRP0","209078","IDLE",0,0

プロセスのステータスは"IDLE"、アーカイブログのスレッドと順序番号はどちらも "0" と示されてしまいました。V$MANAGED_STANDBYビューと同じつもりで "MRP0" を指定しないようにご注意ください。

V$MANAGED_STANDBY と V$DATAGUARD_PROCESS の比較

少々しつこいかもしれませんが、もう一つ問合せの例を取り上げます。二つのビュー、V$MANAGED_STANDBYとV$DATAGUARD_PROCESSへの問合せを比較してみます。

それぞれのSELECT文を UNION ALL で結合します。また問合せ対象のビューが分かるようにREF_VIEW列としてビュー名を表示しています。

SQL> SELECT 'V$MANAGED_STANDBY' REF_VIEW,PROCESS,PID,STATUS,THREAD#,SEQUENCE# FROM V$MANAGED_STANDBY WHERE PROCESS='MRP0'
UNION ALL
SELECT 'V$DATAGUARD_PROCESS' REF_VIEW,NAME,PID,ACTION,THREAD#,SEQUENCE# FROM V$DATAGUARD_PROCESS WHERE NAME='PR00';

"REF_VIEW","PROCESS","PID","STATUS","THREAD#","SEQUENCE#"
"V$MANAGED_STANDBY","MRP0","209078","APPLYING_LOG",2,224
"V$DATAGUARD_PROCESS","PR00","209083","APPLYING_LOG",2,224

上段が V$MANAGED_STANDBYビューの内容、下段が V$DATAGUARD_PROCESSビューの内容です。プロセス名とOSのプロセスID(PID)が違うことを除くと、プロセスのステータスとアーカイブログのスレッド、順序番号は同じ値を確認できます。

おわりに

Oracle Database 12cリリース2 以降のV$DATAGUARD_PROCESSビューをつかった管理リカバリの実行状態の確認方法をご紹介いたしました。

本記事の内容がひとつの例として、皆さんの参考になれば幸いです。

この記事をシェアする

  • Facebook
  • X
  • Pocket
  • Line
  • Hatena
  • Linkedin

資料請求・お問い合わせはこちら

ページトップへ戻る