OCI GoldenGate(OCI GG) で DBCS SE から DBCS EE にレプリケーションしてみる。(Oracle Cloud Infrastructure)

直近はお仕事で OCI GoldenGate を触ることが多いので、記事を書いてみます。従量課金なのがエエですね。
表題のとおり OCI GoldenGate で Oracle Database(DBCS) のレプリケーションを設定してみるやで。
彡(^)(^)

下記マニュアルの手順(クイックスタート)でやってみます。

> 同じリージョン内のクラウド・データベース間でのデータのレプリケート
> https://docs.oracle.com/ja-jp/iaas/goldengate/doc/replicating-data-two-cloud-databases.html

# 1. OCI GoldenGate とは？

OCI GoldenGate は OCI上で動作する論理レプリケーション/データ連携のツール/PaaSとなります。

> Oracle Cloud Infrastructure GoldenGateの概要
> https://docs.oracle.com/ja-jp/iaas/goldengate/doc/overview-goldengate.html

オンプレの GoldenGate は 様々なデータベース/データストアに対応しますが、
現時点(2022年3月末)ではOCI GoldenGate は Oracle Database にのみ対応しています。

> データベース登録の管理
> https://docs.oracle.com/ja-jp/iaas/goldengate/doc/database-registrations.html
> サポートされるデータベース
> ：
> 次のデータベースは、OCI GoldenGateをソースまたはターゲットとして使用することが保証されています:
> Oracle Database 11.2.0.4、12.1.0.2以上
> Oracle Exadata
> Oracle ExadataCS
> Oracle Autonomous Transaction Processing
> Oracle Autonomous Data Warehouse
> ：

# 2. 検証環境の構成(OCI)

OCI DBCS SE(11.2.0.4, Source) ⇒ OCI GG ⇒ OCI DBCS EE(19.14, Target) の構成でレプリケーションします。
![構成図.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/2cb28a8b-e658-5f1f-c0b1-e807dda917bb.jpeg)
これらの構成に必要な コンパートメント/VCN/Subnet/DBCS等は作成済みのものとします。

また DBCS SE(11.2.0.4, Source) にはマニュアル記載の推奨パッチを適用しておきます。

> https://docs.oracle.com/ja-jp/iaas/goldengate/doc/database-registrations.html
> ：
> Oracleサポートが推奨するように、OCI GoldenGateで使用するデータベースの最新パッチを適用してください。
> Oracle 11gの推奨パッチ
> https://support.oracle.com/epmos/faces/DocumentDisplay?id=1557031.1
> ：

伝播対象のテーブルも予め作成しておきます。Source と Target の両方に作成しておきます。

```sql
CREATE TABLE AYSHIBAT.TEST_TBL01 (
    ID   NUMBER
  , NAME VARCHAR2(20)
);

ALTER TABLE AYSHIBAT.TEST_TBL01 ADD CONSTRAINT TEST_TBL01_PK PRIMARY KEY(ID) USING INDEX;
```


# 3. OCI GG用 の DBユーザー作成＆権限付与、初期化パラメータ設定

下記のマニュアルに従って OCI GG用 の DBユーザー を作成＆権限付与します。

> Oracle DatabaseでのOracle GoldenGateの使用 21c (21.3.0)
> 3.1.1.1 適切なユーザー権限の付与
> https://docs.oracle.com/cd/F51462_01/oracle-db/establishing-oracle-goldengate-credentials.html#GUID-F9EBB989-E22F-4355-BE60-40F957B8515E

下記のパラメータも Source/Target の両方で TRUE に変更します。

> Oracle Database データベース・リファレンス 19c
> 1.119 ENABLE_GOLDENGATE_REPLICATION
> https://docs.oracle.com/cd/F19136_01/refrn/ENABLE_GOLDENGATE_REPLICATION.html#GUID-600FC071-1516-49B2-B3B3-C1C5430C5917

---
* Source側(DBCS 11.2.0.4) のDBユーザー作成、権限付与、パラメータ変更、サプリメンタル・ロギング設定

```sql
CREATE USER OGGAYSHIBAT IDENTIFIED BY xxxxxxxxxxxx
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP;

GRANT CREATE SESSION         TO OGGAYSHIBAT;
GRANT RESOURCE               TO OGGAYSHIBAT;
GRANT ALTER SYSTEM           TO OGGAYSHIBAT;
GRANT ALTER USER             TO OGGAYSHIBAT;
EXEC DBMS_GOLDENGATE_AUTH.GRANT_ADMIN_PRIVILEGE('OGGAYSHIBAT');
GRANT SELECT ANY DICTIONARY  TO OGGAYSHIBAT;
GRANT SELECT ANY TRANSACTION TO OGGAYSHIBAT;

-- For User Object Privilege
GRANT DBA TO OGGAYSHIBAT;

ALTER SYSTEM SET enable_goldengate_replication = TRUE SCOPE=BOTH SID='*';
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
```

---

* Target側(DBCS EE 19.14) のDBユーザー作成、権限付与、パラメータ変更

```sql
ALTER SESSION SET CONTAINER = PDB1;
SHOW CON_NAME;

CREATE USER OGGAYSHIBAT IDENTIFIED BY xxxxxxxxxxxx
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP;

GRANT CREATE SESSION         TO OGGAYSHIBAT;
GRANT RESOURCE               TO OGGAYSHIBAT;
GRANT ALTER SYSTEM           TO OGGAYSHIBAT;
GRANT ALTER USER             TO OGGAYSHIBAT;
EXEC DBMS_GOLDENGATE_AUTH.GRANT_ADMIN_PRIVILEGE('OGGAYSHIBAT', CONTAINER => 'PDB1');
GRANT LOCK ANY TABLE         TO OGGAYSHIBAT;
GRANT SELECT ANY DICTIONARY  TO OGGAYSHIBAT;

-- For User Object Privilege
GRANT DBA                    TO OGGAYSHIBAT;

-- These commands are required execute in CDB.
ALTER SESSION SET CONTAINER = CDB$ROOT;
ALTER SYSTEM SET enable_goldengate_replication = TRUE SCOPE=BOTH SID='*';
```

# 4. OCI GG Deployment の作成

OCI Console の 左上のハンバーガーボタン ⇒ Oracle Database ⇒ GoldenGate(右側)と遷移して、
Deployments の Create deployment をクリックします。
![OCIGG000a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/6c52752d-35fc-3c45-4b93-32e6bfe43b6d.jpeg)
![OCIGG000b.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/dd1a7553-d204-b347-f218-ce60afbf4772.jpeg)

以下のように入力して行きます。

| 変数名 | 入力値 |
|-|-|
|Name|任意の文字列を入力|
|Description|任意の説明|
|Compartment|任意のコンパートメントを選択|
|oCPU count|必要なoCPU数 ※後から変更可能です。|
|Subnet|OCI GG をデプロイする VCN Subnet を選択|
|Choose a license type|ライセンス持ち込み以外は License included を選択します。|
|GoldenGate instance name|任意の文字列を入力|
|Administrator usrename|管理ユーザー名を入力|
|Administrator password|管理ユーザーのパスワードを入力|

![OCIGG001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/778abfc8-61c6-8973-05c3-67122c950dd7.jpeg)
![OCIGG002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/a35a2f4b-2d8f-4f4b-6363-582ced56db26.jpeg)

デプロイが完了すると以下の画面のようになります。![OCIGG003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/72224448-be8d-e629-4596-37fe2bf34a89.jpeg)


# 5. データベースの登録

OCI Console の 左上のハンバーガーボタン ⇒ Oracle Database ⇒ GoldenGate(右側) と遷移して、Register Databases の Register Database をクリックします。

![OCIGG004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/90282588-3da3-87f2-af52-925ee6559cc8.jpeg)

以下のように入力して行きます。Source と Target の両方を登録して下さい。

| 変数名 | 入力値 |
|-|-|
|Name | 任意の文字列|
|Alias Name | 任意の文字列ただし記号等の制限有り |
|Description | 任意の説明を入力 |
|Compartment | OCI GG を作成したコンパートメントを選択 |
|Database Type | 今回は DB system database(Bare Metal, VM, Exadata) を選択します。|
|Database system in ～ | Source または Target の DBCS を選択します。|

データベース(今回はDBCS)を選択すると他の変数は自動で入力されます。下記を追加入力＆修正しています。
| 変数名 | 入力値 |
|-|-|
|Database connection string | DBサービス名部分を必要に応じて修正します。今回は Target DB の接続サービス名として pdb1 に修正しています。|
|Database username | 上記 3. の手順で作成した OCI GG用 の DBユーザー名を入力します。|
|Database user password | OCI GG用DBユーザー名 の パスワード を入力します。|

![OCIGG005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/cc32c6a5-2386-88c4-3531-5b204944ce72.jpeg)
![OCIGG006.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/6d9a57e3-828b-2f15-0f29-a88ced52696e.jpeg)

# 6. Deployment Console への接続 と データベース接続確認

OCI Console の Deploymentトップ画面から Deployment Console に接続します。

なお今回は Private Subnet に OCI GG Deployment を作成して手元のPCからの直接接続は不可だったため、Compute に SSH接続して SSHポートフォワードで Deployment Console に接続しています。

![OCIGG011.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/d4721346-5f5e-351a-ca0d-d6d9f5804acf.jpeg)
![OCIGG009.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/ba0d6706-e416-6e5a-e8ee-f664b9549934.jpeg)

Deployment Console のトップ画面から 構成 ⇒ データベース(サブタブ) と遷移して、登録データベースのハンバーガーボタンを押して接続を確認します。
![OCIGG010.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/497592c4-bc89-c816-91b8-79b02c965456.jpeg)

接続が成功すると「チェックポイント」「TRANDATA情報」「ハートビート」といった項目が表示されます。

# 7. スキーマ単位 または 表単位 のサプリメンタル・ロギング設定(Sourceのみ)

Deployment Console のトップ画面から 構成 ⇒ データベース(サブタブ) ⇒ Source のハンバーガーボタンと遷移して Sourceデータベースに接続します。

TRANDATA情報からスキーマ単位 または 表単位 のサプリメンタル・ロギングを設定します。
今回は スキーマAYSHIBAT に対してサプリメンタル・ロギングを設定します。

![OCIGG012.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/d4841403-707e-b865-f7a3-d191360172c5.jpeg)

実行後にTRANDATA情報を検索すると、以下のようにTRANDATAが設定されていることを確認できます。![OCIGG013.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/6e5cd938-1d4c-516e-7a52-c1b681b53714.jpeg)

下記マニュアルも参照して下さい。

> Oracle GoldenGate Microservicesアーキテクチャを使用しての
> ステップ・バイ・ステップ・データ・レプリケーション
> TRANDATAまたはSCHEMATRANDATA情報の有効化
> https://docs.oracle.com/cd/F51462_01/ggmas/working-data-replications.html#GUID-C3B8B4EE-B13F-43BF-AE94-CFCB01B26F60

# 8. チェックポイント表の作成(Targetのみ)

チェックポイント表は Replicat がレプリケーションの進行状況を記録するための GoldenGate内部表 です。

Deployment Console のトップ画面から 構成 ⇒ データベース(サブタブ) ⇒ Source のハンバーガーボタンと遷移して Sourceデータベースに接続します。

チェックポイントからチェックポイント表の作成を発行します。

![OCIGG014.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/13580faa-4418-bef5-8970-7f52a8df21c9.jpeg)

チェックポイント表の作成に成功すると、以下のように作成されたチェックポイント表が表示されます。
![OCIGG015.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/60a9ff35-756a-7669-c37b-833a5ea12243.jpeg)

下記マニュアルも参照して下さい。

> Oracle GoldenGate Microservicesアーキテクチャを使用してのステップ・バイ・ステップ・データ・レプリケーション
> 3.6 Replicatを作成する前に
> https://docs.oracle.com/cd/F51462_01/ggmas/working-data-replications.html#GUID-2CE071E8-1B2F-4138-A01D-B5BC6A010062

# 9. ハートビート表の作成(Source と Target両方)

ハートビート表は GoldenGate の伝播状況、特にラグ(伝播遅延)を確認するのに極めて有益な情報となります。

> 17.4 自動ハートビート表を使用した監視
> https://docs.oracle.com/cd/F51462_01/admin/monitoring-oracle-goldengate-processing.html#GUID-59E61274-BDDE-4D4B-9681-ED0BC39E9FCF

Deployment Console のトップ画面から 構成 ⇒ データベース(サブタブ) ⇒ Source のハンバーガーボタンと遷移して、まずは Sourceデータベースに接続します。

ハートビートからハートビート表の更新頻度、保存期間、パージ頻度を設定して発行ボタンをクリックします。
この時に Target Only のチェックは解除して下さい。

![OCIGG016.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/c40edcc1-65ff-eddb-0d7e-8a009a792153.jpeg)

次に Deployment Console のトップ画面から 構成 ⇒ データベース(サブタブ) ⇒ Source のハンバーガーボタンと遷移して、まずは Targetデータベースに接続します。

ハートビートからハートビート表の保存期間、パージ頻度を設定して発行ボタンをクリックします。この時に Target Only のチェックは設定しておいて下さい。

![OCIGG017.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/2416e014-64a5-40ce-122d-84c8d1ed7b58.jpeg)

# 10. Extract の作成

Deployment Console のトップ画面から Extract を作成します。Extract の +ボタン をクリックします。
![OCIGG020.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/35844b80-3744-a727-d0ce-2c2f1523922a.jpeg)

統合Extract を選択して次へをクリックします。

![OCIGG021.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/e05c1cfe-3dc4-a38b-1872-8b3b4f2cdf8d.jpeg)

以下を入力します。変更する部分のみをピックアップしています。

| 変数名 | 入力値 |
|-|-|
|プロセス名|任意の文字列ただし8文字まで|
|トレイル名|2文字のPREFIXを入力|
|資格証明ドメイン|OracleGoldenGate を選択|
|資格証明別名|Source DB の Alias を選択|
|共有|11.2.0.4 は統合ExtractのShareに対応していないため なし を選択|

![OCIGG022.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/0de24a42-5efd-ceee-9dfb-9c68f372ec3a.jpeg)

![OCIGG023.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/72f7b55b-cdd4-f914-0bf9-e74cddec929f.jpeg)

Extract のパラメータは以下のように設定します。GoldenGate は色々と多機能でここの設定も色々有るのですが、今回はシンプルに構成します。

```sql
EXTRACT EXT99
USERIDALIAS dbcsseogays DOMAIN OracleGoldenGate
EXTTRAIL tr
TABLE AYSHIBAT.*;
```

![OCIGG024.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/9a2a3138-0c36-47e7-e426-6344aaea9657.jpeg)

作成および実行をクリックして、正常に終了すると Extractプロセス が作成＆起動します。

![OCIGG025.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/a7168377-0f31-d9b6-7142-c05629408eab.jpeg)

# 11. Replicat の作成

Deployment Console のトップ画面から Replicat を作成します。Replicat の +ボタン をクリックします。
![OCIGG030.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/4339892f-4855-ab16-23d7-7974580d7826.jpeg)

Replicatプロセスの種別を選択します。色々あるのですが今回は 非統合Replicat を選択して次をクリックします。
![OCIGG031.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/c4146d60-64d7-d38f-6f90-903dd6c5b1d6.jpeg)

以下を入力します。変更する部分のみをピックアップしています。

| 変数名 | 入力値 |
|-|-|
|プロセス名|任意の文字列ただし8文字まで|
|資格証明ドメイン|OracleGoldenGate を選択|
|資格証明別名|Target DB の Alias を選択|
|トレイル名|Extract に設定した 2文字のPREFIXを入力|
|チェックポイント表|上記8. で作成したチェックポイント表を選択|

![OCIGG032.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/670fa742-7e95-4a08-4133-519e0f5a2b4f.jpeg)

Replicat のパラメータは以下のように設定します。やはり色々と設定はあるのですが、今回はここもシンプルに構成します。

```sql
REPLICAT REP99
USERIDALIAS dbcseeogays DOMAIN OracleGoldenGate
MAP AYSHIBAT.*, TARGET AYSHIBAT.*;
```


![OCIGG033.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/0a5b51b9-db11-3859-7b9b-160280ead8dd.jpeg)

作成および実行をクリックして、正常に終了すると Replicatプロセス が作成＆起動します。

![OCIGG034.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/d60ee568-f38d-538a-7fa6-0233f1cd139d.jpeg)

# 12. レプリケーションの確認(INSERT, UPDATE, DELETE, 統計, ラグ)

レプケーションを確認します。まず Source側 でデータを INSERT してみます。

```sql
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME
----------------
se01

SQL> INSERT INTO TEST_TBL01 SELECT LEVEL, 'REC' || LEVEL FROM DUAL CONNECT BY LEVEL <= 10;

10 rows created.

SQL> COMMIT;

Commit complete.
```

Target側 で対象テーブルを SELECT してみます。

```sql
SQL> SHOW CON_NAME;

CON_NAME
------------------------------
PDB1
SQL> SELECT * FROM TEST_TBL01;

        ID NAME
---------- --------------------
         1 REC1
         2 REC2
         3 REC3
         4 REC4
         5 REC5
         6 REC6
         7 REC7
         8 REC8
         9 REC9
        10 REC10

10 rows selected.
```

レプリケーションされてるやで！彡(^)(^)

UPDATE や DELETE も Source側 で実行してみます。

```sql
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME
----------------
se01

SQL> UPDATE TEST_TBL01 SET NAME = 'XXXXXXXX' WHERE ID = 10;

1 row updated.

SQL> DELETE FROM TEST_TBL01 WHERE ID = 9;

1 row deleted.

SQL> COMMIT;

Commit complete.
```

```sql
SQL> SHOW CON_NAME;

CON_NAME
------------------------------
PDB1
SQL> SELECT * FROM TEST_TBL01;

        ID NAME
---------- --------------------
         1 REC1
         2 REC2
         3 REC3
         4 REC4
         5 REC5
         6 REC6
         7 REC7
         8 REC8
        10 XXXXXXXX

9 rows selected.
```

UPDATE や DELETE もレプリケーションされていますやね彡(^)(^)

Deployment Console の 統計タブ からも件数レベルでの伝播状況を確認できます。
![OCIGG040.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/11a65bb8-862f-12fe-d054-a905793110f0.jpeg)

Deployment Console の ハートビート からはラグ(伝播遅延)の状況を確認可能です。
![OCIGG041.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/70b916b6-bb2c-2513-987c-b1f528af99e3.jpeg)

# まとめ

OCI GoldenGate(OCI GG) で DBCS のデータをレプリケーションできたやで！彡(^)(^)
OCI GoldenGate は従量課金で利用可能なので、皆さんどんどん使ってくださいね。