Data Guard Broker 環境の構築 (Oracle Database 19c)

# Oracle Data Guard Broker とは
　Data Guard Broker とは Oracle Database Enterprise Edition の機能で、Data Guard の構成、管理、監視を自動化することができます。DMON バックグラウンド・プロセスが Data Guard の状態を監視し、必要な操作を自動的に行うことができます。
　本記事では Data Guard Broker の初期設定と、状態を確認するところまでを記載しています。

# 環境
 以下の環境を使って Data Guard Broker を構成します。

|比較|プライマリ|スタンバイ|
|:---|:---|:---|
|OS|Red Hat Enterprise Linux 8|Red Hat Enterprise Linux 8| 
|ホスト名|rel8-3|rel8-4| 
|データベース名（db_name）|O19A|O19A| 
|データベース一意名（db_unique_name）|O19A|O19S| 
|ドメイン名（db_domain）|''|''|
|SID|O19A|O19S|
|TNS接続名|O19A|O19S| 
|Oracle Home|/opt/oracle/product/19.0.0/dbhome_1|/opt/oracle/product/19.0.0/dbhome_1|

# プライマリ環境の構築
　Data Guard Broker を設定する前にプライマリとして利用するデータベースを構築します。Data Guard 環境を構築するために以下のような最低限の設定が必要です。
 - ARCHIVELOG モード
 - アーカイブログ出力先（log_archive_dest_1 初期化パラメーター）
 - データベースの FORCE LOGGING 設定
 - FLASHBACK ログの設定（オプション）

初期化パラメーター dg_broker_config_file1, dg_broker_config_file2 に Data Guard Broker 設定ファイルのパスを設定します。デフォルト値では $ORACLE_HOME/dbs/dr#{DB_NAME}.dat が設定されています。このままでも良いのですが、Oracle Real Application Clusters のように複数ノードで稼働する環境の場合は共有ストレージに配置する必要があります。スタンバイ・データベースへ REDO 転送を行うための初期化パラメーター log_archive_dest_N の設定は現状では不要です（設定している場合は解除します）。

```SQL: 初期化パラメーター設定の確認
SQL> SHOW PARAMETER dg_broker_config_file

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
dg_broker_config_file1               string      /opt/oracle/product/19.0.0/dbhome_1/dbs/dr1O19A.dat
dg_broker_config_file2               string      /opt/oracle/product/19.0.0/dbhome_1/dbs/dr2O19A.dat
```

# スタンバイ環境の構築
  Data Guard (Physical Standby) は制御ファイルはスタンバイ・データベースではスタンバイ用の制御ファイルを使用しますが、プライマリとスタンバイで同一のデータファイルを使用します。

## プライマリ・データファイルのコピー
　スタンバイ・データベースを構築する方法はいくつかありますが、RMAN の DUPLICATE コマンドを用いる方法が簡単です。

```SQL: スタンバイ環境の構築
RMAN> DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE NOFILENAMECHECK;

Duplicate Dbを25-04-18で開始しています
リカバリ・カタログのかわりにターゲット・データベース制御ファイルを使用しています
チャネル: ORA_AUX_DISK_1が割り当てられました
チャネルORA_AUX_DISK_1: SID=391 デバイス・タイプ=DISK

メモリー・スクリプトの内容:
{
   backup as copy reuse
   passwordfile auxiliary format  '/opt/oracle/product/19.0.0/dbhome_1/dbs/orapwO19S'   ;
}
メモリー・スクリプトを実行しています

backupを25-04-18で開始しています
チャネル: ORA_DISK_1が割り当てられました
チャネルORA_DISK_1: SID=404 デバイス・タイプ=DISK
backupを25-04-18で終了しました

メモリー・スクリプトの内容:
{
   sql clone "create spfile from memory";
   shutdown clone immediate;
   startup clone nomount;
   restore clone from service  'O19A' standby controlfile;
}
メモリー・スクリプトを実行しています

<< 途中省略>>

データファイル1はデータファイル・コピーに切り替えられました
入力データファイル・コピー レコードID=7 スタンプ=1198765912 ファイル名=+DATA/O19S/DATAFILE/system.258.1198765851
データファイル2はデータファイル・コピーに切り替えられました
入力データファイル・コピー レコードID=8 スタンプ=1198765912 ファイル名=+DATA/O19S/DATAFILE/sysaux.257.1198765855
データファイル3はデータファイル・コピーに切り替えられました
入力データファイル・コピー レコードID=9 スタンプ=1198765912 ファイル名=+DATA/O19S/DATAFILE/undotbs1.259.1198765869
データファイル4はデータファイル・コピーに切り替えられました
入力データファイル・コピー レコードID=10 スタンプ=1198765912 ファイル名=+DATA/O19S/DATAFILE/users.269.1198765895
データファイル5はデータファイル・コピーに切り替えられました
入力データファイル・コピー レコードID=11 スタンプ=1198765912 ファイル名=+DATA/O19S/DATAFILE/users_auto1.270.1198765909
データファイル6はデータファイル・コピーに切り替えられました
入力データファイル・コピー レコードID=12 スタンプ=1198765912 ファイル名=+DATA/O19S/DATAFILE/users_uni1.271.1198765911
Duplicate Dbを25-04-18で終了しました
```

## Grid Infrastructure への登録
　スタンバイ・データベースはそのままでは Oracle Grid Infrastructure に認識されていませんので登録します。その際にスタンバイ・データベースであること（-role オプション）、起動オプション（-startoption オプション）を mount にすることを指定します（Active Data Guard 環境であれば open モード）。必要に応じてパスワード・ファイル、SPFILE も設定します。

```Shell: Grid Infrastructure への登録
$ srvctl add database -db O19S -oraclehome $ORACLE_HOME -role PHYSICAL_STANDBY -startoption mount -dbname O19A -policy AUTOMATIC
$
$ srvctl config database -db O19S
Database unique name: O19S
Database name: O19A
Oracle home: /opt/oracle/product/19.0.0/dbhome_1
Oracle user: oracle
Spfile:
Password file:
Domain:
Start options: mount
Stop options: immediate
Database role: PHYSICAL_STANDBY
Management policy: AUTOMATIC
Disk Groups:
Services:
OSDBA group:
OSOPER group:
Database instance: O19S
```

# Data Guard Broker の設定
## リスナーの設定
 リスナーに「{DB_UNIQUE_NAME}_DGMGRL.{db_domain}」の名前の静的サービスを登録します。これは Data Guard Broker がリスナー経由でインスタンス再起動を行うために必要な設定です。プライマリ・データベース、スタンバイ・データベース双方で実行します。この作業はリスナーが Grid Infrastructure に管理されている場合は不要です。

```Shell: リスナーにサービス登録
$ lsnrctl status

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 21-4月 -2025 10:3                                     5:16

Copyright (c) 1991, 2021, Oracle.  All rights reserved.

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=rel8-4)(PORT=1521)))に接続中
リスナーのステータス
------------------------
別名                      LISTENER
バージョン                TNSLSNR for Linux: Version 19.0.0.0.0 - Produ                                     ction
開始日                    21-4月 -2025 10:35:12
稼働時間                  0 日 0 時間 0 分 3 秒
トレース・レベル          off
セキュリティ              ON: Local OS Authentication
SNMP                      OFF
パラメータ・ファイル      /opt/grid/product/19.0.0/grid/network/admin/l                                     istener.ora
ログ・ファイル            /opt/grid/diag/tnslsnr/rel8-4/listener/alert                                     /log.xml
リスニング・エンドポイントのサマリー...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=rel8-4)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
サービスのサマリー...
サービス"O19S_DGMGRL"には、1件のインスタンスがあります。
  インスタンス"O19S"、状態UNKNOWNには、このサービスに対する1件のハンド                                      ラがあります...
コマンドは正常に終了しました。
```

## 初期化パラメーターの設定
　Data Guard Broker を起動するために、初期化パラメーター dg_broker_start を TRUE に設定します。この操作はプライマリ・データベース、スタンバイ・データベース双方で行います。DMON バックグラウンド・プロセスが起動します。

```SQL: Data Guard Broker の起動
SQL> ALTER SYSTEM SET dg_broker_start=TRUE;

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

SQL> SELECT pname FROM v$process WHERE pname LIKE 'DMON%';

PNAME
-----
DMON
```

## Data Guard Broker の設定
dgmgrl コマンド実行し、Data Guard Broker の設定を行います。これはプライマリまたはスタンバイどちらかで実行します。起動できたら CONNECT サブコマンドでインスタンスへ接続します。dgmgrl コマンドの出力言語は環境変数 NLS_LANG に依存します。

```SQL:DGMGRL の起動
$ dgmgrl
DGMGRL for Linux: Release 19.0.0.0.0 - Production on 月 4月 21 11:56:46 2025
Version 19.14.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

DGMGRLへようこそ。詳細は"help"と入力してください。
DGMGRL> CONNECT SYS/{パスワード}@O19A
"O19A"に接続しました
SYSDBAとして接続しました。
DGMGRL> 
```

CREATE CONFIGURATION 文で Broker 定義を作成します。SHOW CONFIGURATION コマンドは設定の確認を行います。行末にセミコロン（;）は不要です。

```SQL: 構成の作成
DGMGRL> CREATE CONFIGURATION 'dg1_config' AS PRIMARY DATABASE IS 'O19A' CONNECT IDENTIFIER IS O19A;
構成"dg1_config"が、プライマリ・データベース"O19A"で作成されました

DGMGRL> SHOW CONFIGURATION

構成 - dg1_config

  保護モード: MaxPerformance
  メンバー:
  O19A - プライマリ・データベース
  
ファスト・スタート・フェイルオーバー:  Disabled

構成ステータス:
DISABLED
```

ADD DATABASE 文でスタンバイデータベースを追加します。

```SQL: スタンバイの追加
DGMGRL> ADD DATABASE 'O19S' AS CONNECT IDENTIFIER IS O19S MAINTAINED AS PHYSICAL;
データベース"O19S"が追加されました

DGMGRL> SHOW CONFIGURATION

構成 - dg1_config

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

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

構成ステータス:
DISABLED
```

Broker を有効化します。

```SQL: Broker 定義の有効化
DGMGRL> ENABLE CONFIGURATION
有効になりました。
DGMGRL> SHOW CONFIGURATION

構成 - dg1_config

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

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

構成ステータス:
SUCCESS
```

## スタンバイREDOログの追加
スタンバイREDOログファイルは自動追加されません。あらかじめ作成しておきます。Data Guard Broker 設定の起動後にスタンバイREDOログを追加すると、エラーORA-01156 が発生します。

```SQL: Data Guard Broker 有効後のスタンバイREDOログ追加
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 5('+REDO1','+REDO2') SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 5('+REDO1','+REDO2') SIZE 200M
*
行1でエラーが発生しました。:
ORA-01156:
現在処理中のリカバリまたはフラッシュバックで、ファイルのアクセスを必要とする可能
性があります
```

この場合は REDO 適用を一時停止（SET STATE='APPLY-OFF'）してからスタンバイREDOを追加し、REDO 適用を再開します。

```SQL: REDO適用の無効化と有効化
DGMGRL> EDIT DATABASE 'O19S' SET STATE='APPLY-OFF';
成功しました。

--- スタンバイ REDO の追加

DGMGRL> EDIT DATABASE 'O19S' SET STATE='APPLY-ON';
成功しました。
```

```SQL: スタンバイREDOログの追加
SQL> ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 5 ('+REDO1', '+REDO2') SIZE 2000M;

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

# 詳細の確認
## Broker 設定の確認
上記の例で実行した SHOW CONFIGURATION オプションには REDO ラグの情報（LAG）と詳細情報（VERBOSE）を追加指定できます。

```SQL: 構成の詳細確認
DGMGRL> SHOW CONFIGURATION LAG VERBOSE

構成 - dg1_config

  保護モード: MaxPerformance
  メンバー:
  O19A - プライマリ・データベース
    O19S - フィジカル・スタンバイ・データベース
           トランスポート・ラグ: 0 秒 (0秒前に計算されました)
           適用ラグ:       0 秒 (0秒前に計算されました)

  プロパティ:
    FastStartFailoverThreshold      = '30'
    OperationTimeout                = '30'
    TraceLevel                      = 'USER'
    FastStartFailoverLagLimit       = '30'
    CommunicationTimeout            = '180'
    ObserverReconnect               = '0'
    FastStartFailoverAutoReinstate  = 'TRUE'
    FastStartFailoverPmyShutdown    = 'TRUE'
    BystandersFollowRoleChange      = 'ALL'
    ObserverOverride                = 'FALSE'
    ExternalDestination1            = ''
    ExternalDestination2            = ''
    PrimaryLostWriteAction          = 'CONTINUE'
    ConfigurationWideServiceName    = 'O19A_CFG'

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

構成ステータス:
SUCCESS
```

## データベースの確認
VALIDATE DATABASE 文を実行するとデータベースの状態を確認できます。VERBOSE オプションを追加すると詳細が出力されます。

```SQL: プライマリ・データベースの確認
DGMGRL> VALIDATE DATABASE VERBOSE 'O19A';

  データベース・ロール:  プライマリ・データベース

  スイッチオーバー可能:  はい

  フラッシュバック・データベースのステータス:
    O19A:  オフ

  容量の情報:
    データベース  インスタンス  スレッド
    O19A                1                1

  クラスタウェアにより管理される:
    O19A:  YES

  一時的な表領域ファイルの情報:
    O19A TEMPファイル:  1

  データ・ファイルをオンラインで移動中:
    O19A:  いいえ

  転送関連の情報:
    転送する:  はい

  クリアされたログ・ファイル:
    O19A スタンバイREDOログ・ファイル:  クリアされました
```

```SQL: スタンバイ・データベースの確認
DGMGRL> VALIDATE DATABASE VERBOSE 'O19S';

  データベース・ロール:        フィジカル・スタンバイ・データベース
  プライマリ・データベース:  O19A

  スイッチオーバー可能:  はい
  フェイルオーバー可能:  はい (プライマリ実行中)

  フラッシュバック・データベースのステータス:
    O19A:  オフ
    O19S:  オフ

  容量の情報:
    データベース  インスタンス  スレッド
    O19A                1                1
    O19S                1                1

  クラスタウェアにより管理される:
    O19A:  YES
    O19S:  YES

  一時的な表領域ファイルの情報:
    O19A TEMPファイル:  1
    O19S TEMPファイル:  1

  データ・ファイルをオンラインで移動中:
    O19A:  いいえ
    O19S:  いいえ

  スタンバイ適用関連の情報:
    適用状態:     実行中
    適用ラグ:     0 秒 (0秒前に計算されました)
    遅延の適用:  0 分

  転送関連の情報:
    転送する:           はい
    ギャップのステータス:  ギャップはありません
    トランスポート・ラグ:  0 秒 (0秒前に計算されました)
    転送ステータス:  成功

  クリアされたログ・ファイル:
    O19A スタンバイREDOログ・ファイル:  クリアされました
    O19S オンラインREDOログ・ファイル:  クリアされました
    O19S スタンバイREDOログ・ファイル:  使用可能

  現在のログ・ファイル・グループの構成:
    スレッド番号オンラインREDOログ・グループスタンバイREDOログ・グループステータス
              (O19A)                  (O19S)
    1         4                       5                       十分なSRL

  今後のログ・ファイル・グループの構成:
    スレッド番号オンラインREDOログ・グループスタンバイREDOログ・グループステータス
              (O19S)                  (O19A)
    1         4                       5                       十分なSRL

  現在の構成ログ・ファイルのサイズ:
    スレッド番号 最小のオンラインREDO 最小のスタンバイREDO
               ログ・ファイル・サイズ ログ・ファイル・サイズ
               (O19A)                    (O19S)
    1          200 MBytes                200 MBytes

  今後の構成ログ・ファイルのサイズ:
    スレッド番号 最小のオンラインREDO 最小のスタンバイREDO
               ログ・ファイル・サイズ ログ・ファイル・サイズ
               (O19S)                    (O19A)
    1          200 MBytes                200 MBytes

  適用関連のプロパティ設定:
    プロパティ                 O19A 値                 O19S 値
    DelayMins                       0                        0
    ApplyParallel                   AUTO                     AUTO
    ApplyInstances                  0                        0

  転送関連のプロパティ設定:
    プロパティ                 O19A 値                 O19S 値
    LogShipping                     ON                       ON
    LogXptMode                      ASYNC                    ASYNC
    Dependency                      <empty>                  <empty>
    DelayMins                       0                        0
    Binding                         optional                 optional
    MaxFailure                      0                        0
    ReopenSecs                      300                      300
    NetTimeout                      30                       30
    RedoCompression                 DISABLE                  DISABLE
```

Author: Noriyoshi Shinoda / Date: April 21, 2025