Oracle Data Guard スイッチオーバーのチェックを試す（Oracle Database 19c）

# Data Guard スイッチオーバー
Oracle Database の Data Guard はデータベースのミラーを作成し、自動的にデータの同期を行うソリューションです。アプリケーションが利用するデータベースを「プライマリ」、ミラー用のデータベースを「スタンバイ」と呼びます。「スイッチオーバー」は、プライマリ・データベースとスタンバイ・データベースの役割を入れ替えるオペレーションを指します。

# スイッチオーバーの検証 SQL 
　残念ながらスイッチオーバーは失敗する可能性が高いオペレーションです。失敗の原因はいくつも考えられます。このため Oracle Database にはスイッチオーバーが正常に行われるかを調査するための SQL 文「ALTER DATABASE SWITCHOVER TO VERIFY」が用意されています。
　この SQL 文をプライマリ・データベースで実行すると、プライマリ・データベース、スタンバイ・データベース両方のデータベース設定を確認し、スイッチオーバーできるかを検証することができます。

## 環境と実行例
プライマリ・データベースの名前（db_unique_name）をO19P、スタンバイ・データベースの名前を O19S とします。

```SQL:
SQL> SELECT * FROM v$dataguard_config;

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

プライマリ・データベースで ALTER DATABASE 文を実行し、「データベースが変更されました。」と出力されればスイッチオーバーのチェックは完了です。以下の例では現在のプライマリ・データベースである O19P から、スタンバイ・データベース O19S へプライマリ・データベースを入れ替えるチェックを実行しています。

```SQL: プライマリ・データベースで実行
SQL> ALTER DATABASE SWITCHOVER TO O19S VERIFY;

データベースが変更されました。
```

チェックが成功した場合、アラート・ログには以下のメッセージが出力されます。

```shell-session:
$ tail alert_O19P.log

2024-01-29T10:21:33.472430+09:00
ALTER DATABASE SWITCHOVER TO O19S VERIFY
2024-01-29T10:21:33.648922+09:00
SWITCHOVER VERIFY: Send VERIFY request to switchover target O19S
SWITCHOVER VERIFY COMPLETE: READY FOR SWITCHOVER
Completed: ALTER DATABASE SWITCHOVER TO O19S VERIFY
```


 ## 失敗例
 いくつか ALTER DATABASE SWITCHOVER VERIFY 文が失敗する（または警告が出力される）例を説明します。

## Managed Standby が開始していない
スタンバイ・データベースで Data Guard による Redo 適用が開始していない場合にはエラーが発生します。

```SQL: プライマリ・データベースで実行
SQL> ALTER DATABASE SWITCHOVER TO O19S VERIFY;
ALTER DATABASE SWITCHOVER TO O19S VERIFY
*
行1でエラーが発生しました。:
ORA-16470: スイッチオーバー・ターゲットでREDO Applyが実行されていません
```

スタンバイ・データベースでMANAGED STANDBYプロセスを起動し、Data Guardの同期状態を確認します。その後、プライマリ・データベースで ALTER DATABASE SWITCHOVER VERIFY文を再実行します。

```SQL: スタンバイ・データベースで実行
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;

データベースが変更されました。

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

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

## Standby Redo Log が作成されていない
現プライマリ・データベース（＝新スタンバイ・データベース）にスタンバイREDOログ・ファイルが作成されていない場合には警告が出力されます。スタンバイREDOログ・ファイルは、トランザクションのコミット単位でスタンバイ・データベースにREDO情報を適用するRealtime Apply機能に必要なファイルです。

```SQL:  プライマリ・データベースで実行
SQL> ALTER DATABASE SWITCHOVER TO O19S VERIFY;
ALTER DATABASE SWITCHOVER TO O19S VERIFY
*
行1でエラーが発生しました。:
ORA-16475: 警告付きで成功しました。詳細はアラート・ログを参照してください
```

アラート・ログには以下の情報が出力されます。
```shell-session:
$ tail alert_O19P.log

2024-01-29T10:09:22.036861+09:00
ALTER DATABASE SWITCHOVER TO O19S VERIFY
2024-01-29T10:09:22.288718+09:00
SWITCHOVER VERIFY WARNING: no standby redo logfiles configured. Standby redo logfiles are recommended configuration for physical standby database.
SWITCHOVER VERIFY: Send VERIFY request to switchover target O19S
ORA-16475 signalled during: ALTER DATABASE SWITCHOVER TO O19S VERIFY...
```

プライマリ・データベースでスタンバイREDOログを作成することで ALTER DATABASE SWITCHOVER VERIFY 文は成功しました。

```SQL: プライマリ・データベースで実行（必要な個数作成）
SQL> ALTER DATABASE ADD STANDBY LOGFILE '+REDO' SIZE 2000M;

データベースが変更されました。
```

## REDO転送設定がされていない
現スタンバイ・データベース（＝新プライマリ・データベース）にスタンバイ・データベースへのREDOログ転送（初期化パラメーター log_archive_dest_N）が設定されていない場合には警告が出力されます。

```SQL: プライマリ・データベースで実行
SQL>  ALTER DATABASE SWITCHOVER TO O19S VERIFY;
 ALTER DATABASE SWITCHOVER TO O19S VERIFY
*
行1でエラーが発生しました。:
ORA-16475: 警告付きで成功しました。詳細はアラート・ログを参照してください
```

アラート・ログには以下の情報が出力されます。

```shell-session:
$ tail alert_O19P.log

2024-01-29T10:15:14.874666+09:00
 ALTER DATABASE SWITCHOVER TO O19S VERIFY
2024-01-29T10:15:15.050902+09:00
SWITCHOVER VERIFY: Send VERIFY request to switchover target O19S
SWITCHOVER VERIFY WARNING: switchover target has no standby database defined in LOG_ARCHIVE_DEST_n parameter. If the switchover target is converted to a primary database, the new primary database will not be protected.
ORA-16475 signalled during:  ALTER DATABASE SWITCHOVER TO O19S VERIFY...
```

しかし検証環境ではスタンバイ・データベースのlog_archive_dest_2 は正しく設定されています。

```SQL: スタンバイ・データベースで実行
SQL> SHOW PARAMETER log_archive_dest_2

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_2                   string      SERVICE=O19P ASYNC VALID_FOR=(
                                                 online_logfiles, primary_role)
                                                  db_unique_name=O19P
```

トレース・ファイルに出力されるメッセージが大変わかりにくいのですが、警告メッセージが出力された原因は初期化パラメーター log_archive_dest_state_2 が無効（deffer）になっていたためでした。このパラメーターの設定を有効化（enable）したところ ALTER DATABASE SWITCHOVER VERIFY 文が成功しました。

```SQL: スタンバイ・データベースで実行
SQL> SHOW PARAMETER log_archive_dest_state_2

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_state_2             string      DEFER

SQL> ALTER SYSTEM SET log_archive_dest_state_2 = enable;

システムが変更されました。
```

```SQL: プライマリ・データベースで実行
SQL> ALTER DATABASE SWITCHOVER TO O19S VERIFY;

データベースが変更されました。
```

Author: Noriyoshi Shinoda / Date: January 29, 2024