Oracle DataGuard Brokerの設定手順


# 内容
フィジカルスタンバイのDataGuardにBrokerを設定した時の手順メモ

# 構成
構成は以下の通り。

|項目 |プライマリ |スタンバイ |
|:--|:--|:--|
|Hostname |dg01|dg02|
|OS|Red Hat Enterprise Linux 6.4|Red Hat Enterprise Linux 6.4|
|Oracleバージョン|11g Enterprise Edition 11.2.0.4.0 |11g Enterprise Edition 11.2.0.4.0 |
|ORACLE_BASE|/u01/app/oracle|/u01/app/oracle|
|ORACLE_HOME|/u01/app/oracle/product/11.2.0/dbhome_1|/u01/app/oracle/product/11.2.0/dbhome_1|
|ORACLE_SID| PRIDB | SBYDB |
|DB_NAME | DGTEST | DGTEST |
|DB_UNIQUE_NAME| PRIDB | SBYDB |
|DB_DOMAIN| - | - |
|Net Service Name| PRIDBTNS | SBYDBTNS |

# 手順

## 1. Broker設定ファイルの設定
DG\_BROKER\_CONFIG_FILEn初期化パラメータを設定する。
今回は以下を設定する。
> [プライマリ]
> /u01/app/oracle/oradata/PRIDB/dr1PRIDB.dat
> /u01/app/oracle/oradata/PRIDB/dr2PRIDB.dat
> [スタンバイ]
> /u01/app/oracle/oradata/SBYDB/dr1SBYDB.dat
> /u01/app/oracle/oradata/SBYDB/dr2SBYDB.dat


**[プライマリ]**

```sql:
SQL> show parameter dg_broker_config_file
PARAMETER_NAME          TYPE      VALUE
----------------------- --------- ---------------------------------------------------------
dg_broker_config_file1  string    /u01/app/oracle/product/11.2.0/dbhome_1/dbs/dr1PRIDB.dat
dg_broker_config_file2  string    /u01/app/oracle/product/11.2.0/dbhome_1/dbs/dr2PRIDB.dat

SQL> alter system set dg_broker_config_file1='/u01/app/oracle/oradata/PRIDB/dr1PRIDB.dat';

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

SQL> alter system set dg_broker_config_file2='/u01/app/oracle/oradata/PRIDB/dr2PRIDB.dat';

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

SQL> show parameter dg_broker_config_file
PARAMETER_NAME          TYPE      VALUE
----------------------- --------- ---------------------------------------------------------
dg_broker_config_file1  string    /u01/app/oracle/oradata/PRIDB/dr1PRIDB.dat
dg_broker_config_file2  string    /u01/app/oracle/oradata/PRIDB/dr2PRIDB.dat

```

**[スタンバイ]**

```sql:
SQL> show parameter dg_broker_config_file
PARAMETER_NAME          TYPE      VALUE
----------------------- --------- ----------------------------------------------------------
dg_broker_config_file1  string    /u01/app/oracle/product/11.2.0/dbhome_1/dbs/dr1SBYDB.dat
dg_broker_config_file2  string    /u01/app/oracle/product/11.2.0/dbhome_1/dbs/dr2SBYDB.dat

SQL> alter system set dg_broker_config_file1='/u01/app/oracle/oradata/SBYDB/dr1SBYDB.dat';
システムが変更されました。

SQL> alter system set dg_broker_config_file2='/u01/app/oracle/oradata/SBYDB/dr2SBYDB.dat';
システムが変更されました。

SQL> show parameter dg_broker_config_file

PARAMETER_NAME          TYPE      VALUE
----------------------- --------- ---------------------------------------------------------
dg_broker_config_file1  string    /u01/app/oracle/oradata/SBYDB/dr1SBYDB.dat
dg_broker_config_file2  string    /u01/app/oracle/oradata/SBYDB/dr2SBYDB.dat
```

## 2. Brokerプロセス(DMON)の起動
DG\_BROKER\_START初期化パラメータを「TRUE」に設定し、Brokerプロセス(DMON)を立ち上げる。

**[プライマリ／スタンバイ]**

```sql:
SQL> select pname from v$process where pname like 'DMON%';
レコードが選択されませんでした。
-- 以下でも可
-- !ps -ef | grep ora_dmon_ | grep -v grep


SQL> show parameter dg_broker_start
PARAMETER_NAME                               TYPE      VALUE
-------------------------------------------- --------- ------
dg_broker_start                              boolean   FALSE

SQL> alter system set dg_broker_start=true;
システムが変更されました。

SQL> show parameter dg_broker_start
PARAMETER_NAME                               TYPE      VALUE
-------------------------------------------- --------- ------
dg_broker_start                              boolean   TRUE

SQL> select pname from v$process where pname like 'DMON%';
PNAME
---------------
DMON
```

## 3. リスナーにDataGuard用静的サービスを登録
listener.oraに「GLOBAL\_DBNAME=db\_unique\_name\_DGMGRL.db\_domain」静的サービスを登録する。
> db_unique_name_DGMGRL.db_domainは、dgmgrlがDB接続に使用するサービス名のデフォルト値。
> 以下の処理を行うため登録する。
> - dgmgrlがインスタンスを再起動できるようにする。
> - ファスト・スタート・フェイルオーバーが発生した後、元のプライマリ・データベースの
>   自動回復の一部としてオブザーバーがインスタンスを再起動できるようにする。


**[プライマリ]**

```bash:/u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
# 以下の通りに修正
-------------------------------------
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = dg01)(PORT = 1521))
    )
  )

SID_LIST_LISTENER=
  (SID_LIST=
    (SID_DESC=
      (GLOBAL_DBNAME=PRIDB)
      (ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1)
      (SID_NAME=PRIDB)
    )
# -- 追加 START ------------------------------------------------
    (SID_DESC=
      (GLOBAL_DBNAME=PRIDB_DGMGRL)
      (ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1)
      (SID_NAME=PRIDB)
    )
# -- 追加 END --------------------------------------------------
  )
-------------------------------------
```

**[スタンバイ]**

```bash:/u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
# 以下の通りに修正
-------------------------------------
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = dg02)(PORT = 1521))
    )
  )

SID_LIST_LISTENER=
  (SID_LIST=
    (SID_DESC=
      (GLOBAL_DBNAME=SBYDB)
      (ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1)
      (SID_NAME=SBYDB)
    )
# -- 追加 START ------------------------------------------------
    (SID_DESC=
      (GLOBAL_DBNAME=SBYDB_DGMGRL)
      (ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1)
      (SID_NAME=SBYDB)
    )
# -- 追加 END --------------------------------------------------
  )
-------------------------------------
```

**[プライマリ／スタンバイ]**
リスナーの設定再読込、接続確認

```bash:
$ # 設定再読込
$ lsnrctl reload
$ lsnrctl stat
$ # 接続確認
$ echo exit | sqlplus sys/<パスワード>@PRIDBTNS as sysdba | grep 'ORA-' | wc -l
$ echo exit | sqlplus sys/<パスワード>@dg01:1521/PRIDB as sysdba | grep 'ORA-' | wc -l
$ echo exit | sqlplus sys/<パスワード>@dg01:1521/PRIDB_DGMGRL as sysdba | grep 'ORA-' | wc -l
$ echo exit | sqlplus sys/<パスワード>@SBYDBTNS as sysdba | grep 'ORA-' | wc -l
$ echo exit | sqlplus sys/<パスワード>@dg02:1521/SBYDB as sysdba | grep 'ORA-' | wc -l
$ echo exit | sqlplus sys/<パスワード>@dg02:1521/SBYDB_DGMGRL as sysdba | grep 'ORA-' | wc -l

```

## 4. DataGuard構成の登録
dgmgrlを使用し、broker設定ファイル作成・有効化を実施する。

**[プライマリ or スタンバイ]**

* dgmgrlに接続

```bash:
$ dgmgrl
DGMGRL> connect sys/<sysのパスワード>@pridbtns
接続されました。
```

* 設定ファイルの作成

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

# CREATE CONFIGURATION '<設定ファイル名(自分で決める)>' AS 
# PRIMARY DATABASE IS '<プライマリのDB_UNIQUE_NAME初期化パラメータ>' 
# CONNECT IDENTIFIER IS <プライマリに接続するためのTNS名>;

DGMGRL> show configuration

構成 - dgtest_config

  保護モード: MaxPerformance
  データベース:
    PRIDB - プライマリ・データベース

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

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

* 設定ファイルにスタンバイ機を追加

```bash:
DGMGRL> ADD DATABASE 'SBYDB' AS CONNECT IDENTIFIER IS SBYDBTNS MAINTAINED AS PHYSICAL;
データベース"SBYDB"が追加されました

DGMGRL> show configuration;

構成 - dgtest_config

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

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

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

* 設定ファイルの有効化

```bash:
DGMGRL> enable configuration;
有効になりました。
DGMGRL> show configuration;

構成 - dgtest_config

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

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

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


## 5. スイッチオーバーの動作確認
スイッチオーバーが正常に動作することを確認する。
**[プライマリ or スタンバイ]**

```bash:
DGMGRL> switchover to 'SBYDB'
現在スイッチオーバーを実行しています。お待ちください...
操作上、インスタンス"SBYDB" (データベース"SBYDB") に接続する必要があります
インスタンス"SBYDB"に接続中...
接続されました。
新しいプライマリ・データベース"SBYDB"がオープン中です...
操作上、インスタンス"PRIDB" (データベース"PRIDB") を起動する必要があります
インスタンス"PRIDB"の起動中...
ORACLEインスタンスが起動しました。
データベースがマウントされました。
スイッチオーバーに成功しました。新しいプライマリは"SBYDB"です

DGMGRL> show configuration;

構成 - dgtest_config

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

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

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

# メモ

**ブローカログファイル**
アラートログと同じディレクトリに、drc<$ORACLE_SID>.logで作成される。今回は以下になる。
  
```
[プライマリ]
/u01/app/oracle/diag/rdbms/sbydb/PRIDB/trace/drcPRIDB.log
[スタンバイ]
/u01/app/oracle/diag/rdbms/sbydb/SBYDB/trace/drcSBYDB.log
```

----
**dgmgrlがDB接続に使用する接続文字列の確認**
設定値の確認

```bash:
DGMGRL> SHOW DATABASE VERBOSE 'PRIDB' StaticConnectIdentifier;
  StaticConnectIdentifier = '(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dg01)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=PRIDB_DGMGRL)(INSTANCE_NAME=PRIDB)(SERVER=DEDICATED)))'
DGMGRL> SHOW DATABASE VERBOSE 'SBYDB' StaticConnectIdentifier;
  StaticConnectIdentifier = '(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dg02)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=SBYDB_DGMGRL)(INSTANCE_NAME=SBYDB)(SERVER=DEDICATED)))'
```

接続確認

```bash:
sqlplus 'sys/<パスワード>@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dg01)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=PRIDB_DGMGRL)(INSTANCE_NAME=PRIDB)(SERVER=DEDICATED)))' as sysdba
sqlplus 'sys/<パスワード>@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dg02)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=SBYDB_DGMGRL)(INSTANCE_NAME=SBYDB)(SERVER=DEDICATED)))' as sysdba
```

----
**ORA-16810の詳細確認**
「Error: ORA-16810: データベースについて複数のエラーまたは警告が検出されました」が表示される場合、以下のコマンドで詳細を確認
  
```
DGMGRL> SHOW DATABASE '<データベース名>' 'StatusReport';
```

-----
**ORA-01017**
「ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。」が発生した場合、以下を確認する。

- tnsname.oraの内容
- パスワードファイル
- tnspingによる疎通確認
- sqlplusによるログイン確認

----
**ORA-16816**

ORA-16816が発生し、プライマリのデータベースが「standby」になってしまった場合、「ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;」で「primary」に戻す。
> ORA-16816: データベース・ロールが正しくありません。
> http://docs.oracle.com/cd/E16338_01/server.112/b56318/e12700.htm#sthref3729
> 
> 原因: 
> Data Guard Broker構成内に記録されたデータベース・ロールとは異なるデータベース・ロールが指定の
> データベースに含まれていることがData Guard Brokerによって検出されました。この状況は、スイッチ
> オーバー操作またはフェイルオーバー操作に失敗したことによって発生したか、またはSQL*Plusを使用し
> てスイッチオーバー操作またはフェイルオーバー操作を実行したことによって発生した可能性があります。
> 
> 処置: 
> Data Guard Brokerのドキュメントを参照して、ロール変更操作の失敗からリカバリする方法を確認するか、
> Data Guard Brokerによって管理されているデータベースでSQL*Plusを使用して実行されたロール変更から
> リカバリする方法を確認してください。

現象

```bash:
DGMGRL> show configuration

構成 - dgtest_config

保護モード: MaxPerformance
データベース:
PRIDB - プライマリ・データベース
  エラー: ORA-16816: データベース・ロールが正しくありません

SBYDB - フィジカル・スタンバイ・データベース
  警告: ORA-16857: スタンバイがREDOソースから切断されている時間が指定されたしきい値を超えています

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

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

対応

```sql:
SQL> -- プライマリに戻すことができるか確認
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
------------------------------------------------------------
TO PRIMARY

SQL> -- プライマリに戻す。
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
データベースが変更されました。  

SQL> -- 確認
SQL> SELECT open_mode,database_role, SWITCHOVER_STATUS FROM V$DATABASE;
OPEN_MODE   DATABASE_ROLE    SWITCHOVER_STATUS
----------- ---------------- -----------------
MOUNTED     PRIMARY          TO STANDBY

SQL> alter database open;
データベースが変更されました。
```


# リファレンス
- Sun Cluster Geographic Edition Data Replication Guide for Oracle Data Guard
  https://docs.oracle.com/cd/E19421-01/820-5016/fnrfv/index.html

- Oracle Technologies Blog By ASKM
  Creating A Dataguard Broker Configuration Using DGMGRL
  https://learnwithme11g.wordpress.com/tag/dg_broker_start/

- Data Guard:フィジカル・スタンバイ・データベースへのスイッチオーバー(11g) 
  http://oracle-pub.wikidot.com/11g-ocm-dg-phy-stb-switchover

- DGMGRLコマンドライン・インタフェースの使用例
  http://docs.oracle.com/cd/E16338_01/server.112/b56304/cli.htm


- Data Guardのトラブルシューティング
  http://docs.oracle.com/cd/E16338_01/server.112/b56302/troubleshooting.htm#i634208