Oracle Database Global Data Services構築 その3

# GDSプールへのデータベース登録
サービスを設定する対象のデータベースをGDSプールに追加します。本記事ではデフォルトで作成済みのGDSプールを使用しますが、大規模環境の場合は、GDSプールを複数構成し、GDSプール単位に管理者を割り当てるといった運用も可能です。
config gdspoolコマンドを使用して、GDSプールの一覧を確認します。dbpooloraという名前のGDSプールが存在していることが確認できます。
```
GDSCTL> config gdspool
名前                            ブローカ                          シャード済
--                            ----                          -----
dbpoolora                     いいえ                           いいえ
```
動作確認用に下記表のデータベースを用意しました。
* 2ノードRACデータベースを2セット
* RACデータベース間は、Oracle Active Data Guardを構成

| scanホスト名:ポート | DBユニーク名 | DBインスタンス名 | データベースロール |
|:-|:-|:-|:-|
|db1-scan:1521 |ptokyo   |ptokyo1   |PRIMARY   |
|db1-scan:1521 |ptokyo   |ptokyo2   |PRIMARY   |
|db2-scan:1521 |stokyo   |stokyo1   |PHYSICAL STANDBY   |
|db2-scan:1521 |stokyo   |stokyo2   |PHYSICAL STANDBY   |

:::note info
GDSプールに含めるには、データベースでSPFILEが使用される必要があります。また、RACデータベースにはSCAN設定も必要です。
:::

上記データベースの既存DBアカウントGSMUSERのアカウントロックを解除します。
GDSカタログデータベースのGSMUSERはない事をご注意ください。
```
[oracle@gsm01 ~]$ sqlplus system@db1-scan:1521/ptokyo
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.16.0.0.0
に接続されました。
SQL> COL username FORM a15
SQL> SELECT username, account_status FROM dba_users WHERE username = 'GSMUSER';

USERNAME        ACCOUNT_STATUS
--------------- --------------------------------
GSMUSER         LOCKED

SQL> ALTER USER gsmuser ACCOUNT UNLOCK;

ユーザーが変更されました。

SQL> password gsmuser
gsmuserに対するパスワードを変更しています。
新規パスワード:
新規パスワードを再入力してください:
パスワードが変更されました。

SQL> SELECT username, account_status FROM dba_users WHERE username = 'GSMUSER';

USERNAME        ACCOUNT_STATUS
--------------- --------------------------------
GSMUSER         OPEN
```
ちなみに、gsmuserには付与されている権限は下記となります。
```
[oracle@gsm01 ~]$ sqlplus gsmuser@db1-scan:1521/ptokyo
パスワードを入力してください:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.16.0.0.0
に接続されました。
SQL> SELECT * FROM session_privs ORDER BY privilege;

PRIVILEGE
----------------------------------------
ADMINISTER RESOURCE MANAGER
ADMINISTER SQL MANAGEMENT OBJECT
ALTER SYSTEM
ANALYZE ANY
BACKUP ANY TABLE
CREATE SESSION
CREATE TABLE
EXECUTE ANY PROCEDURE
EXECUTE ANY TYPE
EXEMPT ACCESS POLICY
EXEMPT REDACTION POLICY
FLASHBACK ANY TABLE
READ ANY FILE GROUP
RESUMABLE
SELECT ANY SEQUENCE
SELECT ANY TABLE

16行が選択されました。
```
　本記事では、Oracle Data Guardを構成する2つのデータベースのうち、プライマリデータベースのみで起動するサービスを作成する予定です。データベースロールの状態を考慮したサービスを作成するためには、Data Guard Brokerの構成情報をGDSプールに登録する必要があります。

connectコマンドでカタログデータベースに接続後、add brokerconfigコマンドを実行します。
* -connectパラメータに、プライマリデータベースの接続先情報を指定します。
* -regionパラメータに、リージョン名を指定します。

```
GDSCTL> connect gsm_admin@gsm01:1521/catdb
パスワード:
カタログ接続が確立されました

GDSCTL> add brokerconfig -connect db1-scan:1521/ptokyo -region tokyo1
"gsmuser" パスワード:
一意のデータベース名: ptokyo
操作は正常に完了しました
```
上記の通り、「操作は正常に完了しました」と出力されましたが、databasesコマンドにて登録状況を確認するとプライマリデータベースのptokyoは、想定通り、インスタンスの数が2つで、リージョンがtokyo1で登録されていますが、スタンバイデータベースのstokyoは、状態が「未初期化」となっており、登録できていない事がわかります。本事象について、マニュアルやWebサイトでは情報を見つけることができず、苦戦しましたが、以下の方法で解消できましたため、紹介します。
```
GDSCTL> databases
データベース: "ptokyo" 登録: Y 状態: OK ONS: Y。ロール: PRIMARY インスタンス: 2 リージョン: tokyo1
   登録されたインスタンス:
     dbpoolora%1
     dbpoolora%2
データベース: "stokyo" 登録: N 状態: 未初期化 ONS: N。ロール: N/A インスタンス: 0 リージョン: N/A
```
最初に、validateコマンドを実行し、GDSの構成を検証したところ、下記二つのエラーが出力されました。
* [エラー] VLD3: データベース"stokyo"にリージョンが割り当てられていません
* [エラー] VLD15: プール・データベース"stokyo"接続エラーORA-12154: TNS: 指定された接続識別子を解決できませんでした
```
GDSCTL> validate
検証結果:

[警告] VLD2: リージョン"regionora"にバディ・リージョンがありません
[警告] VLD2: リージョン"tokyo1"にバディ・リージョンがありません
[警告] VLD2: リージョン"tokyo2"にバディ・リージョンがありません
[エラー] VLD3: データベース"stokyo"にリージョンが割り当てられていません
[警告] VLD4: データベース"stokyo"のステータスが無効です: 未初期化
[警告] VLD8: データベース"ptokyo"にグローバル・サービスが定義されていません
[警告] VLD8: データベース"stokyo"にグローバル・サービスが定義されていません
[警告] VLD9: リージョン"regionora"にデータベースは含まれていません
[警告] VLD10: リージョン"tokyo1"にGSMは含まれていません
[警告] VLD9: リージョン"tokyo2"にデータベースは含まれていません
[警告] VLD10: リージョン"tokyo2"にGSMは含まれていません
[警告] VLD12: GDSプール"dbpoolora"にグローバル・サービスは含まれていません
[エラー] VLD15: プール・データベース"stokyo"接続エラーORA-12154: TNS: 指定された接続識別子を解決できませんでした

[警告] VLD24: GSM "GSM_LIS1"はGDSリージョン"tokyo1"からGSMに接続されません
[警告] VLD24: GSM "GSM_LIS1"はGDSリージョン"tokyo2"からGSMに接続されません

エラー合計: 2。警告合計: 13
```
スタンバイデータベースのstokyoにリージョンが未設定である事と、stokyoへ接続するための情報が不足している事がエラーの原因のようです。
modify databaseコマンドを使用して、stokyoの接続情報とリージョンを登録します。
* -databaseパラメータに、データベース名を指定します。
* -connectパラメータに、データベース接続情報を指定します。
* -regionパラメータに、リージョン名を指定します。

```
GDSCTL> modify database -database stokyo -connect db2-scan:1521/stokyo -region tokyo2
"gsmuser" パスワード:
操作は正常に完了しました
```
再度validateコマンドを実行したところ、先ほど発生していたエラーは解消されましたが、別のエラーが数多く発生しました。
```
GDSCTL> validate
検証結果:

[警告] VLD2: リージョン"regionora"にバディ・リージョンがありません
[警告] VLD2: リージョン"tokyo1"にバディ・リージョンがありません
[警告] VLD2: リージョン"tokyo2"にバディ・リージョンがありません
[警告] VLD4: データベース"stokyo"のステータスが無効です: 未初期化
[警告] VLD8: データベース"ptokyo"にグローバル・サービスが定義されていません
[警告] VLD8: データベース"stokyo"にグローバル・サービスが定義されていません
[警告] VLD9: リージョン"regionora"にデータベースは含まれていません
[警告] VLD10: リージョン"tokyo1"にGSMは含まれていません
[警告] VLD10: リージョン"tokyo2"にGSMは含まれていません
[警告] VLD12: GDSプール"dbpoolora"にグローバル・サービスは含まれていません
[警告] VLD13: GDSカタログ内のデータベース"stokyo"が非推奨のステータスである可能性があります
[エラー] VLD30: データベースstokyo: 間違ったGDS構成名が検出されました""
[エラー] VLD31: データベースstokyo : 間違ったプール名が検出されました""
[エラー] VLD32: データベースstokyo : 間違ったGDSリージョン名が検出されました""
[エラー] VLD33: データベースstokyo : 間違ったデータベース番号が検出されました"0"
[エラー] VLD34: データベースstokyo : 間違ったSCAN名がGDSカタログ"db2-scan"で検出されました
[エラー] VLD35: データベースstokyo : 間違ったONSポート番号がGDSカタログ"0"で検出されました
[警告] VLD44: データベースstokyo : 構成の不一致が検出されました。パラメータ名: CPU。データベース値: 0。GDSカタログ内: 75
[警告] VLD44: データベースstokyo : 構成の不一致が検出されました。パラメータ名: Disk Read Latency。データベース値: 0。GDSカタログ内: 20
[エラー] VLD36: データベースstokyo : GDSリージョン"regionora"がデータベースにありません
[エラー] VLD36: データベースstokyo : GDSリージョン"tokyo1"がデータベースにありません
[エラー] VLD36: データベースstokyo : GDSリージョン"tokyo2"がデータベースにありません
[警告] VLD39: データベースstokyo : GSM "gsm_lis1"がデータベースにありません
[警告] VLD24: GSM "GSM_LIS1"はGDSリージョン"tokyo1"からGSMに接続されません
[警告] VLD24: GSM "GSM_LIS1"はGDSリージョン"tokyo2"からGSMに接続されません
[エラー] VLD26: データベース"stokyo"はGSM "GSM_LIS1"に登録されていません
[警告] VLD28: データベース"stokyo"のインスタンス"stokyo1"がGSM "GSM_LIS1"に登録されていません

エラー合計: 10。警告合計: 17
```
GDSカタログの情報に不整合が発生しているように見受けられるめ、sync databaseコマンドを使用して同期します。
```
GDSCTL> sync database -database stokyo
操作は正常に完了しました
```
再び、validateコマンドで確認したところ、エラーが解消されました。警告が発生していますが、いずれも想定通りです。
```
GDSCTL> validate
検証結果:

[警告] VLD2: リージョン"regionora"にバディ・リージョンがありません
[警告] VLD2: リージョン"tokyo1"にバディ・リージョンがありません
[警告] VLD2: リージョン"tokyo2"にバディ・リージョンがありません
[警告] VLD8: データベース"ptokyo"にグローバル・サービスが定義されていません
[警告] VLD8: データベース"stokyo"にグローバル・サービスが定義されていません
[警告] VLD9: リージョン"regionora"にデータベースは含まれていません
[警告] VLD10: リージョン"tokyo1"にGSMは含まれていません
[警告] VLD10: リージョン"tokyo2"にGSMは含まれていません
[警告] VLD12: GDSプール"dbpoolora"にグローバル・サービスは含まれていません
[警告] VLD24: GSM "GSM_LIS1"はGDSリージョン"tokyo1"からGSMに接続されません
[警告] VLD24: GSM "GSM_LIS1"はGDSリージョン"tokyo2"からGSMに接続されません

エラー合計: 0。警告合計: 11
```
databasesコマンドとconfig databaseコマンドを使用して状態を確認します。問題ないようです。
```
GDSCTL> databases
データベース: "ptokyo" 登録: Y 状態: OK ONS: Y。ロール: PRIMARY インスタンス: 2 リージョン: tokyo1
   登録されたインスタンス:
     dbpoolora%1
     dbpoolora%2
データベース: "stokyo" 登録: Y 状態: OK ONS: Y。ロール: PH_STNDBY インスタンス: 2 リージョン: tokyo2
   登録されたインスタンス:
     dbpoolora%11
     dbpoolora%12

GDSCTL> config database
名前                  プール                 ステータス     状態          リージョン     可用性
--                  ---                 -----     --          -----     ---
ptokyo              dbpoolora           OK        なし          tokyo1    ONLINE
stokyo              dbpoolora           OK        なし          tokyo2    READ ONLY
```
次回に続きます。