Data Guard Broker からスナップショット・スタンバイ作成を試す（Oracle Database 19c）

# スナップショット・スタンバイとは？
　スナップショット・スタンバイはフィジカル・スタンバイから変換されるデータベースです。スナップショット・スタンバイは読み書きが可能であるため、フィジカル・スタンバイ・データベースをテスト環境として使用できるようになります。プライマリ・データベースから受信した REDO ログは継続して受信しているためデータの欠損はありません。ただしスタンバイ・データベースに対する REDO 適用は止まっていますのでプライマリ・データベースの更新がスタンバイ・データベースに伝播することはありません。
 　本記事では Data Guard Broker からスナップショット・スタンバイを作成する方法と、元のフィジカル・スタンバイへ戻す方法について説明しています。

# Data Guard Broker を使わない方法
Data Guard Broker を使用しない場合、スナップショット・スタンバイはスタンバイ・データベースに接続して以下の手順で作成します。

```SQL: SNAPSHOT STANDBY の作成
-- スタンバイ・データベースに対する REDO 適用の停止
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

-- MOUNT 状態に移行（READ ONLY OPEN の場合）
SHUTDOWN IMMEDIATE
STARTUP MOUNT 

-- スナップショット・スタンバイ・データベースへの変換
ALTER DATABASE CONVERT TO SNAPSHOT STANDBY;

-- READ/WRITE モードでオープン
ALTER DATABASE OPEN READ WRITE;
```

# Data Guard Broker を使ったスナップショットスタンバイへの変換
DGMGRL ユーティリティから CONVERT DATABASE db_name TO SNAPSHOT STANDBY コマンドを実行するだけです。

```SQL: スタンバイ・データベースの状態
SQL> SELECT STATUS FROM V$INSTANCE;

STATUS
------------
MOUNTED

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

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

```SQL: Data Guard Broker の状態
DGMGRL> SHOW CONFIGURATION

構成 - dg1_config

  保護モード: MaxPerformance
  メンバー:
  O19A - プライマリ・データベース
    O19S - フィジカル・スタンバイ・データベース

ファスト・スタート・フェイルオーバー:  Disabled

構成ステータス:
SUCCESS   (ステータスは59秒前に更新されました)
```

この状態からスタンバイ・データベースをスナップショット・スタンバイに変換します。CONVERT コマンドはすぐに終了し、SHOW CONFIGURATION コマンドを確認すると、スタンバイ・データベースの状態が「スナップショット・スタンバイ・データベース」に変換されていることがわかります。

```SQL: スナップショット・スタンバイへの変換
DGMGRL> CONVERT DATABASE O19S TO SNAPSHOT STANDBY
データベース"o19s"をスナップショット・スタンバイ・データベースに変換中 です。お待ちください...
データベース"o19s"は正常に変換されました
DGMGRL> SHOW CONFIGURATION

構成 - dg1_config

  保護モード: MaxPerformance
  メンバー:
  O19A - プライマリ・データベース
    O19S - スナップショット・スタンバイ・データベース

ファスト・スタート・フェイルオーバー:  Disabled

構成ステータス:
SUCCESS   (ステータスは56秒前に更新されました)
```

スタンバイ・インスタンスの状態を確認します。読み書きできる状態（READ WRITE）であり、インスタンスもオープンしていることがわかります。

```SQL: スタンバイ・インスタンスの状態
SQL> SELECT action FROM v$dataguard_process WHERE name='PR00';

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

SQL> SELECT status, open_mode FROM v$instance, v$database;

STATUS       OPEN_MODE
------------ --------------------
OPEN         READ WRITE
```

# スナップショット・スタンバイを元に戻す
スナップショット・スタンバイは一時的に読み書きできる状態になっているだけなので、フィジカル・スタンバイに戻します。Data Guard Broker を使わない場合は以下の手順で実行します。

```SQL: スナップショット・スタンバイからの変換
-- データベース・インスタンスの停止
SHUTDOWN IMMEDIATE

-- MOUNT モードでオープン
STARTUP MOUNT

-- フィジカル・スタンバイへの変換
ALTER DATABASE CONVERT TO PHYSICAL STANDBY;
```

Data Guard Broker では上記の作業を CONVERT 文のみで実行することができます。

```SQL: スナップショット・スタンバイからの変換
DGMGRL> CONVERT DATABASE O19S TO PHYSICAL STANDBY
データベース"o19s"をフィジカル・スタンバイ・データベースに変換中です。 お待ちください...
Oracle Clusterwareはデータベース"O19S"を再起動しています...
[W000 2025-05-14T09:50:04.332+09:00] Failed to attach to o19s.
[W000 2025-05-14T09:50:05.338+09:00] Failed to attach to o19s.
... 省略 ...
[W000 2025-05-14T09:50:29.407+09:00] Failed to attach to o19s.
[W000 2025-05-14T09:50:30.410+09:00] Failed to attach to o19s.
"O19S"に接続しました
"O19S"に接続しました
データベース"o19s"の変換を続行します...
データベース"o19s"は正常に変換されました
```

　CONVERT 文が実行されると、スナップショット・スタンバイ・インスタンスが再起動されます。一時的にインスタンスとの通信が切れるため、毎秒エラーメッセージが出力されます。その後スナップショット・スタンバイ・データベースがフィジカル・スタンバイ・データベースに変換されます。
 
```SQL: Data Guard Broker の状態確認
DGMGRL> SHOW CONFIGURATION

構成 - dg1_config

  保護モード: MaxPerformance
  メンバー:
  O19A - プライマリ・データベース
    O19S - フィジカル・スタンバイ・データベース

ファスト・スタート・フェイルオーバー:  Disabled

構成ステータス:
SUCCESS   (ステータスは40秒前に更新されました)

```

スタンバイ・データベースに接続すると、インスタンスが MOUNT モードで起動し、REDO 適用が行われていることがわかります。


```SQL: フィジカル・スタンバイの状態確認
SQL> SELECT status FROM v$instance;

STATUS
------------
MOUNTED

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

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

Author: Noriyoshi Shinoda / Date: May 14, 2025