Data Guardでプライマリ停止時の状態を確認する（Oracle Database 19c)

Oracle Data Guard環境では V\\$ARCHIVE_DEST_STATE ビューや V\\$MANAGED_STANDBY ビューで状態を確認します。本記事ではプライマリ・インスタンス停止が発生したときと、MANAGED STANDBYがキャンセルされたときにこれらのビューの内容がどのように変化するかを確認します。環境は[昨日の記事](https://qiita.com/plusultra/items/9731b28a1b11c67aa48e)と同じです。

# プライマリ停止
プライマリ・インスタンスを異常終了させて、スタンバイ・インスタンスの状態を確認します。

## ALERTファイルの状態
alertファイルには接続が切れたことが直ちに出力されます。

```
2020-12-10T10:24:09.586896+09:00
 rfs (PID:42589): Possible network disconnect with primary database
2020-12-10T10:24:09.598992+09:00
 rfs (PID:42587): Possible network disconnect with primary database
```

## V$ARCHIVE_DEST_STATUSの状態
V\\$ARCHIVE_DEST_STATUS ビューは変化がありません。STATUS 列はVALID で、RECOVERY_MODE列はMANAGED REAL TIME APPLY のままです。V\$MANAGED_STANDBY ビューにも変化はありません。

```SQL:
SQL> SELECT dest_name, status, recovery_mode FROM v$archive_dest_status WHERE dest_id IN (1, 2) ORDER BY 1;

DEST_NAME                      STATUS    RECOVERY_MODE
------------------------------ --------- ----------------------------------
LOG_ARCHIVE_DEST_1             VALID     MANAGED REAL TIME APPLY
LOG_ARCHIVE_DEST_2             VALID     IDLE

SQL> SELECT status FROM v$managed_standby WHERE process LIKE 'MRP%';

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

## プライマリ・インスタンスの起動
プライマリ・インスタンスを起動します。スタンバイ・インスタンスのalertログには接続が復活したことを示すメッセージが出力されます。

```
2020-12-10T10:27:06.331100+09:00
 rfs (PID:44277): Primary database is in MAXIMUM PERFORMANCE mode
2020-12-10T10:27:06.365077+09:00
 rfs (PID:44277): Selected LNO:11 for T-1.S-78 dbid 2941070004 branch 1055164276
2020-12-10T10:27:06.380011+09:00
 rfs (PID:44275): Selected LNO:12 for T-1.S-77 dbid 2941070004 branch 1055164276
2020-12-10T10:27:06.533684+09:00
PR00 (PID:42840): Media Recovery Waiting for T-1.S-78 (in transit)
2020-12-10T10:27:06.541579+09:00
Recovery of Online Redo Log: Thread 1 Group 11 Seq 78 Reading mem 0
  Mem# 0: /u01/app/oracle/oradata/O19S/slog11.dbf
2020-12-10T10:27:06.577222+09:00
ARC0 (PID:42564): Archived Log entry 70 added for T-1.S-77 ID 0xaf4d09b4 LAD:1
```

スタンバイ・インスタンスの V\$ARCHIVE_DEST_STATE ビューやV\\$MANAGED_STANDBY ビューには何の変化もありません。

# MANAGED STANDBYのキャンセルと復帰
## MANAGED STANDBYのキャンセル 

スタンバイ・インスタンスで ALTER DATABASE RECOVER MANAGED STANDBY CANCEL 文を実行します。スタンバイ・インスタンスの alert ログには処理の完了メッセージが出力されます。

```
2020-12-10T10:37:10.267347+09:00
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL
2020-12-10T10:37:10.270076+09:00
PR00 (PID:42840): MRP0: Background Media Recovery cancelled with status 16037
2020-12-10T10:37:10.275652+09:00
Errors in file /u01/app/oracle/diag/rdbms/o19s/O19S/trace/O19S_pr00_42840.trc:
ORA-16037: user requested cancel of managed recovery operation
PR00 (PID:42840): Managed Standby Recovery not using Real Time Apply
Recovery interrupted!
Recovered data files to a consistent state at change 7685343
stopping change tracking
2020-12-10T10:37:10.351243+09:00
Errors in file /u01/app/oracle/diag/rdbms/o19s/O19S/trace/O19S_pr00_42840.trc:
ORA-16037: user requested cancel of managed recovery operation
2020-12-10T10:37:10.464808+09:00
Background Media Recovery process shutdown (O19S)
2020-12-10T10:37:11.269815+09:00
Managed Standby Recovery Canceled (O19S)
Completed: ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL
```
V\\$ARCHIVE_DEST_STATUS ビューの log_archive_dest_1 のRECOVERY_MODE 列は IDLE に戻ります。MRP プロセスは停止するため V\$MANAGED_STANDBY ビューからはエントリーが消えます。

```SQL:
SQL> SELECT dest_name, status, recovery_mode FROM v$archive_dest_status WHERE dest_id IN (1, 2) ORDER BY 1;

DEST_NAME                      STATUS    RECOVERY_MODE
------------------------------ --------- ----------------------------------
LOG_ARCHIVE_DEST_1             VALID     IDLE
LOG_ARCHIVE_DEST_2             VALID     IDLE

SQL> SELECT status FROM v$managed_standby WHERE process LIKE 'MRP%';

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

プライマリ・インスタンスの V\$ARCHIVE_DEST_STATUS ビューのRECOVERY_MODE 列 も IDLE になります。

```
SQL> SELECT dest_name, status, recovery_mode FROM v$archive_dest_status WHERE dest_id IN (1, 2) ORDER BY 1;

DEST_NAME                      STATUS    RECOVERY_MODE
------------------------------ --------- ----------------------------------
LOG_ARCHIVE_DEST_1             VALID     IDLE
LOG_ARCHIVE_DEST_2             VALID     IDLE
```

## MANAGED STANDBYの復帰
スタンバイ・インスタンスで ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT 文を実行します。スタンバイ・インスタンスの alert ログには処理完了のメッセージが出力されます。

```
2020-12-10T10:42:33.150775+09:00
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT
2020-12-10T10:42:33.151156+09:00
Attempt to start background Managed Standby Recovery process (O19S)
Starting background process MRP0
2020-12-10T10:42:33.159680+09:00
MRP0 started with pid=8, OS id=45250
2020-12-10T10:42:33.160435+09:00
Background Managed Standby Recovery process started (O19S)
2020-12-10T10:42:38.175418+09:00
 Started logmerger process
2020-12-10T10:42:38.182064+09:00
PR00 (PID:45256): Managed Standby Recovery starting Real Time Apply
2020-12-10T10:42:38.220576+09:00
Parallel Media Recovery started with 4 slaves
2020-12-10T10:42:38.336731+09:00
stopping change tracking
PR00 (PID:45256): Media Recovery Waiting for T-1.S-78 (in transit)
2020-12-10T10:42:38.485182+09:00
Recovery of Online Redo Log: Thread 1 Group 11 Seq 78 Reading mem 0
  Mem# 0: /u01/app/oracle/oradata/O19S/slog11.dbf
2020-12-10T10:42:39.167813+09:00
Completed: ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT
```

プライマリ・インスタンスの alert ログには何も出力されませんが、V\$ARCHIVE_DEST_STATUS ビューは変化します。

```SQL:
SQL> SELECT dest_name, status, recovery_mode FROM v$archive_dest_status WHERE dest_id IN (1, 2) ORDER BY 1;

DEST_NAME                      STATUS    RECOVERY_MODE
------------------------------ --------- ----------------------------------
LOG_ARCHIVE_DEST_1             VALID     IDLE
LOG_ARCHIVE_DEST_2             VALID     MANAGED REAL TIME APPLY
```