Data Guard プロセス異常時の挙動を確認する（Oracle Database 19c）

　Oracle Data Guard は Oracle Database データベースのコピーを作成することで可用性の向上や障害発生時のリカバリ高速化を行う機能です。プライマリ・データベースで実行された更新トランザクションの情報（REDO）をリモート・ホストで起動するスタンバイ・インスタンスに転送します。スタンバイ・インスタンスは受領した REDO データをデータファイルに適用することでデータベース間の同期をとります。
　本記事では Data Guard を構成するスタンバイ・プロセスに異常が発生した場合の挙動を確認します。
プライマリ・データベース名（db_unique_name）を O19P、スタンバイ・データベース名を O19S とします。Data Guard Broker は使っていません。

# スタンバイ側で追加起動するプロセス

Data Guard （フィジカル・スタンバイ）を構成するスタンバイ・インスタンスでは以下のバックグラウンド・プロセスが追加で起動されます。

|プロセス|プロセス名|備考|
|:---|:---|:---|
|ora_mrp0_{SID}|Data Guard 管理リカバリ・プロセス||
|ora_pr00_{SID}|リカバリ・コーディネータ||
|ora_prNN_{SID}|リカバリ・ワーカー|NN=01,02,...|

mrp0 プロセスはプライマリ・インスタンスから転送された REDO 情報をチェックし、ワーカー・プロセスの調整を行います。pr00/prNN プロセスは受信した REDO をデータ・ファイルに適用します。リカバリ・ワーカーは搭載されたプロセッサ数に応じて起動数が変動します。

上記以外にサーバー・プロセス「oracle{SID} (LOCAL=NO)」も複数起動します。これらはプライマリ・インスタンスのアーカイバ・プロセス（ARCn）や、REDO転送スレーブ・プロセス（TTnn）と通信します。これらのプロセスは管理リカバリー・モード（Managed Recovery）でなくても自動的に起動します。このため、管理リカバリー・モードを実行しなくても、プライマリ・インスタンスからの REDO データはスタンバイ・インスタンスに受信されます。

# MRP0 プロセスの停止
MRP0 プロセス異常終了時の動作を確認します。

```SQL: 管理リカバリ・モードの正常を確認
SQL> SELECT status FROM v$managed_standby WHERE process LIKE 'MRP%';

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

MRP0プロセスを異常終了させます。

```shell: MRP0 プロセスの強制終了
$ ps -ef | grep mrp0 | grep -v grep
oracle    52667      1  0 14:28 ?        00:00:00 ora_mrp0_O19S
$ kill -KILL 52667
```

MRP0プロセスを強制終了すると、管理リカバリ・モードが停止します。しかしスタンバイ・インスタンス全体は起動したままです。

```SQL:  管理リカバリ・モードの異常を確認
SQL> SELECT status FROM v$managed_standby WHERE process LIKE 'MRP%';

レコードが選択されませんでした。
```

スタンバイ・インスタンスのアラート・ログには以下のメッセージが出力されます。このメッセージは kill コマンド実行後、しばらくしてから出力されます。

```shell: アラート・ログの確認
2024-02-08T09:16:58.774937+09:00
PR00 (PID:52675): MRP0: Background Media Recovery terminated with error 448
2024-02-08T09:16:58.775352+09:00
Errors in file /u01/app/oracle/diag/rdbms/o19s/O19S/trace/O19S_pr00_52675.trc:
ORA-00448: normal completion of background process
PR00 (PID:52675): Managed Standby Recovery not using Real Time Apply
2024-02-08T09:16:58.803920+09:00
Recovery coordinator died, shutting down parallel recovery
2024-02-08T09:16:58.826429+09:00
Recovery interrupted!
Recovered data files to a consistent state at change 38160293536340
Stopping change tracking
2024-02-08T09:16:58.829648+09:00
Errors in file /u01/app/oracle/diag/rdbms/o19s/O19S/trace/O19S_pr00_52675.trc:
ORA-00448: normal completion of background process
```

# PRNN プロセスの停止
## リカバリ・コーディネータの停止
リカバリ・コーディネータ（pr00）プロセスを停止してみます。


```SQL: 管理リカバリ・モードの正常を確認
SQL> SELECT status FROM v$managed_standby WHERE process LIKE 'MRP%';

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

PR00 プロセスを異常終了させます。

```shell: PR00 プロセスの強制終了
$ ps -ef | grep pr00 | grep -v grep
oracle    52667      1  0 14:28 ?        00:00:00 ora_pr00_O19S
$ kill -KILL 52667
```

PR00 プロセスを強制終了すると、管理リカバリ・モードが停止します。しかしスタンバイ・インスタンス全体は起動したままです。

```SQL:  管理リカバリ・モードの異常を確認
SQL> SELECT status FROM v$managed_standby WHERE process LIKE 'MRP%';

レコードが選択されませんでした。
```

スタンバイ・インスタンスのアラート・ログには以下のメッセージが出力されます。「Recovery Slave PR00 died」のログが出力されています。このメッセージは kill コマンド実行後、しばらくしてから出力されます。

```shell: アラート・ログの確認
2024-02-08T09:20:08.779291+09:00
Logmerger died, shutting down parallel recovery slaves
2024-02-08T09:20:09.266320+09:00
Recovery Slave PR00 died
2024-02-08T09:20:11.796555+09:00
Recovery interrupted!
Stopping change tracking
2024-02-08T09:20:12.791275+09:00
Errors in file /u01/app/oracle/diag/rdbms/o19s/O19S/trace/O19S_mrp0_86331.trc:
ORA-10878: parallel recovery slave died unexpectedly
2024-02-08T09:20:12.791318+09:00
Background Media Recovery process shutdown (O19S)
```

PR00 プロセスを停止すると、PR01～PR04 プロセスも停止します。

```shell: prNN プロセスの停止を確認
$ ps -ef | grep pr0 | grep -v grep
$ 
```

PR00 プロセスを強制終了すると、管理リカバリ・モードが停止します。しかしスタンバイ・インスタンス全体は起動したままです。

## リカバリ・ワーカーの停止
リカバリ・ワーカー（prNN）プロセスのうち、pr04 プロセスを停止してみます。

```shell: prNN プロセスの確認と停止
$ ps -ef|grep pr0 | grep -v grep
oracle    86903      1  0 09:27 ?        00:00:00 ora_pr00_O19S
oracle    86905      1  0 09:27 ?        00:00:00 ora_pr01_O19S
oracle    86907      1  0 09:27 ?        00:00:00 ora_pr02_O19S
oracle    86909      1  0 09:27 ?        00:00:00 ora_pr03_O19S
oracle    86911      1  0 09:27 ?        00:00:00 ora_pr04_O19S
$ kill -KILL 86911
```

やはり MRP0 プロセスが停止し、管理リカバリー・モードも終了します。

```SQL: 管理リカバリ・モードの異常を確認
SQL>  SELECT status FROM v$managed_standby WHERE process LIKE 'MRP%';

レコードが選択されませんでした。
```

アラート・ファイルに以下のログが出力されます。「ORA-10878: parallel recovery slave died unexpectedly」メッセージが確認できます。

```shell: アラート・ログの内容
2024-02-08T09:30:40.883600+09:00
Recovery Slave PR04 died
2024-02-08T09:30:40.950285+09:00
PR00 (PID:86903): MRP0: Background Media Recovery terminated with error 448
2024-02-08T09:30:40.950387+09:00
Errors in file /u01/app/oracle/diag/rdbms/o19s/O19S/trace/O19S_pr00_86903.trc:
ORA-00448: normal completion of background process
PR00 (PID:86903): Managed Standby Recovery not using Real Time Apply
Recovery interrupted!
Recovered data files to a consistent state at change 38160293538171
Stopping change tracking
2024-02-08T09:30:40.970151+09:00
Errors in file /u01/app/oracle/diag/rdbms/o19s/O19S/trace/O19S_pr00_86903.trc:
ORA-00448: normal completion of background process
2024-02-08T09:30:40.984231+09:00
Errors in file /u01/app/oracle/diag/rdbms/o19s/O19S/trace/O19S_mrp0_86897.trc:
ORA-10878: parallel recovery slave died unexpectedly
2024-02-08T09:30:40.984280+09:00
Background Media Recovery process shutdown (O19S)
```

上記のように Data Guard 関連のプロセスは異常終了すると再起動は行われません。またスタンバイ・インスタンスは停止せず、プライマリ・インスタンスのアラートログには一切メッセージが出力されないため気づかない可能性があります。

Author: Noriyoshi Shinoda / Date: February 8, 2024