Data Guard プロセス状態を確認する（Oracle Database 19c）

# Data Guard プロセスの確認
  Oracle Data Guard が正常に実行されているかを確認する方法として、以前はスタンバイ・インスタンスで V$MANAGED_STANDBY ビューを検索していました。プロセス名 MRP0 の状況を確認し、APPLYING_LOG 状態であれば Data Guard リアルタイム適用が有効に動作していることになります。
  
```SQL: 以前の Data Guard 稼働確認
SQL> SELECT status FROM v$managed_standby WHERE process LIKE 'MRP%';

STATUS
------------
APPLYING_LOG
```

  しかし Oracle Database 12c (12.2) 以降、このビューを確認する方法は非推奨となっています。本記事では Oracle Database 19c で使用が推奨されている V$DATAGUARD_PROCESS ビューの内容を確認します。このビューはプライマリ・データベース、スタンバイ・データベースどちらのインスタンスにも出力があります（内容は異なります）。
　本記事ではプライマリ・データベースの名前（db_unique_name）を O19P、スタンバイ・データベースの名前を O19S としています。フィジカル・スタンバイ環境で、保護モードは最大パフォーマンス、Data Guard Broker は使用していません。

```SQL: Data Guard 構成確認
SQL> SELECT * FROM V$DATAGUARD_CONFIG;

DB_UNIQUE_NAME                 PARENT_DBUN                    DEST_ROLE         CURRENT_SCN     CON_ID
------------------------------ ------------------------------ ----------------- ----------- ----------
O19S                           O19P                           PHYSICAL STANDBY   3.8160E+13          0
O19P                           NONE                           PRIMARY DATABASE            0          0
```

このビューをスタンバイ・データベースで検索するとプライマリ・データベースの CURRENT_SCN 列が 0 になる以外はプライマリ・データベースとスタンバイ・データベースは同じ内容になります。

# Data Guard 正常時
　管理スタンバイ（MANAGED STANDBY）が正常に動作している場合の、V$DATAGUARD_PROCESS ビューの内容を確認します。


## プライマリ・データベース
　以下はプライマリ・データベースで V$DATAGUARD_PROCESS を検索した結果です。CLIENT_PID 列はすべて 0 になっています。

```SQL: 管理スタンバイ実行時のプライマリ
SQL> SELECT pid,name,action,client_pid,client_role FROM v$dataguard_process ORDER BY 2;

PID                      NAME  ACTION       CLIENT_PID CLIENT_ROLE
------------------------ ----- ------------ ---------- ----------------
4751                     ARC0  IDLE                  0 none
4755                     ARC1  IDLE                  0 none
4757                     ARC2  IDLE                  0 none
4759                     ARC3  IDLE                  0 none
4687                     LGWR  IDLE                  0 none
4729                     TMON  IDLE                  0 none
4749                     TT00  IDLE                  0 none
4753                     TT01  IDLE                  0 none
4761                     TT02  OPENING               0 none
4763                     TT03  IDLE                  0 none
4778                     TT04  WRITING               0 none

11行が選択されました。
```

## スタンバイ・データベース
　以下はスタンバイ・データベースで V$DATAGUARD_PROCESS を検索した結果です。プロセスID 5283 の rfs プロセスの起動は一時的で常時起動しているわけではありません。


```SQL: SQL: 管理スタンバイ実行時のスタンバイ
SQL> SELECT pid,name,action,client_pid,client_role FROM v$dataguard_process ORDER BY 2;

PID                      NAME  ACTION       CLIENT_PID CLIENT_ROLE
------------------------ ----- ------------ ---------- ----------------
5245                     ARC0  IDLE                  0 none
5252                     ARC1  IDLE                  0 none
5254                     ARC2  IDLE                  0 none
5257                     ARC3  IDLE                  0 none
5188                     LGWR  IDLE                  0 none
19278                    MRP0  IDLE                  0 none
19284                    PR00  APPLYING_LOG          0 none
19286                    PR01  IDLE                  0 none
19288                    PR02  IDLE                  0 none
19290                    PR03  IDLE                  0 none
19292                    PR04  IDLE                  0 none
5230                     TMON  IDLE                  0 none
5247                     TT00  IDLE                  0 none
5249                     TT01  IDLE                  0 none
5277                     rfs   IDLE               4778 async ORL single
5283                     rfs   IDLE               4755 archive gap
5279                     rfs   IDLE               4749 gap manager

17行が選択されました。
```

プライマリ・データベースとスタンバイ・データベースのプロセス間通信の状況を以下のように確認できます。

|プライマリ・プロセス（PID）|スタンバイ・プロセス（PID）|備考|
|:---|:---|:---|
|TT04 (4778) | rfs (5277) | acync ORL single|
|ARC1 (4755) | rfs (5283) | archive gap|
|TT00 (4749) | rfs (5279) | gap manager|

従来の V$MANAGED_STANDBY ビューで確認していた内容を取得するにはスタンバイ・インスタンスで以下の SQL 文を実行します。

```SQL: リアルタイム適用の確認（V$DATAGUARD_PROCESS）
SQL> SELECT status FROM v$managed_standby WHERE process LIKE 'MRP%';

STATUS
------------
APPLYING_LOG

SQL> SELECT action FROM v$dataguard_process WHERE name='PR00';

ACTION
------------
APPLYING_LOG
```

プロセスを管理スタンバイ・リカバリ・プロセス（MRP0）ではなく、パラレル・リカバリ・コーディネータ（PR00）で検索します。


# スタンバイ・インスタンス停止時
スタンバイ・インスタンスが停止した場合、プライマリ・インスタンスの V$DATAGUARD_PROCESS ビューの内容には変化がありません。


```SQL: スタンバイ・インスタンス停止時のプライマリ
SQL> SELECT pid,name,action,client_pid,client_role FROM v$dataguard_process ORDER BY 2;

PID                      NAME  ACTION       CLIENT_PID CLIENT_ROLE
------------------------ ----- ------------ ---------- ----------------
4751                     ARC0  IDLE                  0 none
4755                     ARC1  IDLE                  0 none
4757                     ARC2  IDLE                  0 none
4759                     ARC3  IDLE                  0 none
4687                     LGWR  IDLE                  0 none
4729                     TMON  IDLE                  0 none
4749                     TT00  IDLE                  0 none
4753                     TT01  IDLE                  0 none
4761                     TT02  OPENING               0 none
4763                     TT03  IDLE                  0 none
4778                     TT04  WRITING               0 none

11行が選択されました。
```


# スタンバイ・インスタンスMOUNT時
管理スタンバイ（MANAGED STANDBY）は実行せず、スタンバイ・インスタンスが MOUNT 状態の場合の V$DATAGUARD_PROCESS ビューの状態を確認します。

## プライマリ・データベース
スタンバイ・インスタンス起動直後にプライマリ・インスタンスで V$DATAGUARD_PROCESS ビューを検索するとアーカイブ・ギャップを確認する FAL 要求に関するプロセスが起動していることが確認できます。

```SQL: スタンバイ・インスタンス起動直後
SQL> SELECT pid,name,action,client_pid,client_role FROM v$dataguard_process ORDER BY 2;

PID                      NAME  ACTION       CLIENT_PID CLIENT_ROLE
------------------------ ----- ------------ ---------- ----------------
4751                     ARC0  IDLE                  0 none
4755                     ARC1  IDLE                  0 none
4757                     ARC2  IDLE                  0 none
4759                     ARC3  IDLE                  0 none
4687                     LGWR  IDLE                  0 none
4729                     TMON  IDLE                  0 none
4749                     TT00  IDLE                  0 none
4753                     TT01  IDLE                  0 none
4761                     TT02  OPENING               0 none
4763                     TT03  IDLE                  0 none
4778                     TT04  WRITING               0 none
20714                    fal   IDLE                  0 none
20714                    fal   IDLE                  0 none

13行が選択されました。
```

アーカイブ・ギャップが無いことが確認できると fal プロセスは停止し、V$DATAGUARD_PROCESS ビューから情報が消えます。

```SQL: スタンバイ・インスタンス起動後
SQL> SELECT pid,name,action,client_pid,client_role FROM v$dataguard_process ORDER BY 2;

PID                      NAME  ACTION       CLIENT_PID CLIENT_ROLE
------------------------ ----- ------------ ---------- ----------------
4751                     ARC0  IDLE                  0 none
4755                     ARC1  IDLE                  0 none
4757                     ARC2  IDLE                  0 none
4759                     ARC3  IDLE                  0 none
4687                     LGWR  IDLE                  0 none
4729                     TMON  IDLE                  0 none
4749                     TT00  IDLE                  0 none
4753                     TT01  IDLE                  0 none
4761                     TT02  OPENING               0 none
4763                     TT03  IDLE                  0 none
4778                     TT04  WRITING               0 none
```


## スタンバイ・データベース
　管理スタンバイを実行していない場合、V$DATAGUARD_PROCESS ビューには複数のプロセス情報が消えています。

```SQL:
SQL> SELECT pid,name,action,client_pid,client_role FROM v$dataguard_process ORDER BY 2;

PID                      NAME  ACTION       CLIENT_PID CLIENT_ROLE
------------------------ ----- ------------ ---------- ----------------
20695                    ARC0  IDLE                  0 none
20701                    ARC1  IDLE                  0 none
20703                    ARC2  IDLE                  0 none
20705                    ARC3  IDLE                  0 none
20632                    LGWR  IDLE                  0 none
20674                    TMON  IDLE                  0 none
20697                    TT00  IDLE                  0 none
20699                    TT01  IDLE                  0 none
20721                    rfs   IDLE               4778 async ORL single
20719                    rfs   IDLE               4749 gap manager

10行が選択されました。
```

管理スタンバイが停止している場合、以下のプロセス情報が V$DATAGUARD_PROCESS ビューから消えます。

|プロセス名|プロセス説明|備考|
|:---|:---|:---|
|MRP0|管理スタンバイ・リカバリ・プロセス||
|PR00|パラレル・リカバリ・コーディネータ||
|PRnn|パラレル・リカバリ・ワーカー|個数は可変|

Author: Noriyoshi Shinoda / Date: February 27, 2024