Data Guardでスタンバイ停止時の状態を確認する（Oracle Database 19c)

Oracle Data Guard 環境では V\\$ARCHIVE_DEST_STATE ビューやV\$MANAGED_STANDBY ビューで状態を確認します。本記事ではスタンバイ・インスタンス停止が発生したときにこれらのビューの内容がどのように変化するかを確認します。

# 正常な状態と設定
## 環境
本記事で使用する環境は以下の通りです。Oracle Database 19c (19.7) Enterprise Edition for Linux x86-64、Data Guard Broker は使っていません。

|インスタンス名|説明|備考|
|:---|:---|:---|
|O19A|プライマリ・インスタンス||
|O19S|スタンバイ・インスタンス|Physical Standby, Realtime Apply|

関連する初期化パラメーター設定は以下の通りです。初期化パラメーター fal_server や log_archive_config 等も必要ですが省略しています。log_archive_dest_1 にはローカル保存設定、log_archive_dest_2 には Data Guard スタンバイ・インスタンスへの送信設定を行っています。

|インスタンス|初期化パラメータ|設定
|:---|:---|:---|
|O19A|log_archive_dest_1| LOCATION=/u01/app/oracle/admin/O19A/archive VALID_FOR=(all_logfiles,all_roles) db_unique_name=O19A|
|O19A|log_archive_dest_2|SERVICE=O19S ASYNC VALID_FOR=(online_logfiles, primary_role) db_unique_name=O19S|
|O19S|log_archive_dest_1|LOCATION=/u01/app/oracle/admin/O19S/archive VALID_FOR=(all_logfiles, all_roles) db_unique_name=O19S|
|O19S|log_archive_dest_2|SERVICE=O19A ASYNC VALID_FOR=(online_logfiles, primary_role)db_unique_name=O19A|

## 正常な状態
正常に接続できている状態は以下の通りです。log_archive_dest の状態は MANAGED REAL TIME APPLY になっています。MRP プロセスはAPPLYING_LOG 状態です。

プライマリ・インスタンス

```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
``` 

スタンバイ・インスタンス

```
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ファイルの状態
alertファイルには接続が切れたことが直ちに出力されます。

```
2020-12-10T09:52:00.722941+09:00
Errors in file /u01/app/oracle/diag/rdbms/o19a/O19A/trace/O19A_tt02_31219.trc:
ORA-03135: connection lost contact
TT02 (PID:31219): Error 3135 for LNO:9 to 'O19S'
2020-12-10T09:52:00.724994+09:00
Errors in file /u01/app/oracle/diag/rdbms/o19a/O19A/trace/O19A_tt02_31219.trc:
ORA-03135: connection lost contact
2020-12-10T09:52:00.725242+09:00
Errors in file /u01/app/oracle/diag/rdbms/o19a/O19A/trace/O19A_tt02_31219.trc:
ORA-03135: connection lost contact
```

## V$ARCHIVE_DEST_STATUSの状態
V\$ARCHIVE_DEST_STATUS ビューは、STATUS 列が ERROR になりますが、RECOVERY_MODE 列は MANAGED REAL TIME APPLY のままです。プライマリ・インスタンスが再接続を試行してもこの状態は変わりません。

```
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             ERROR     MANAGED REAL TIME APPLY
```
## スタンバイ・インスタンスの起動
スタンバイ・インスタンスを MOUNT 状態で起動します（MANAGED STANDBY 設定は実施しません）。プライマリ・インスタンスの alert ログには接続が復活したことを示すメッセージが出力されます。

```
2020-12-10T09:58:05.244548+09:00
ALTER SYSTEM SET log_archive_dest_state_2='ENABLE' SCOPE=MEMORY SID='*';
2020-12-10T09:58:05.438798+09:00
TT04 (PID:41444): SRL selected for T-1.S-77 for LAD:2
```

プライマリ・インスタンスの V\$ARCHIVE_DEST_STATE ビューのRECOVERY_MODE 列はこの時点で IDLE になります。STATUS 列は VALID に戻ります。

```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
```

スタンバイ・インスタンスの V\$ARCHIVE_DEST_STATE ビューはRECOVERY_MODE 列が IDLE です。

```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
```

## MANAGED STANDBY状態に移行
スタンバイ・インスタンスでMANAGED STANDBYを実行します。プライマリ・インスタンスのV\$ARCHIVE_DEST_STATEビューのRECOVERY_MODE列はやや時間をおいてMANAGED REAL TIME APPLYになります。この変化があるときにはalertログには何も出力されません。

```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
```

スタンバイ・インスタンスでは log_archive_dest_1 の状態が MANAGED REAL TIME APPLY に変化します。

```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
```