OCI 上で構築した PostgreSQL に対するOCI GoldenGateを利用したCDCレプリケーション

前回の記事で構築した、OCI上のOracle Linux 9上のPostgreSQLと、OCIでマネージドサービス(PaaS)として提供されているOCI Database with PostgreSQLを利用し、OCI GoldenGateを利用したリアルタイムデータ同期の設定を行いました。連携用のスキーマの作成などOCI GoldenGateを利用するための事前準備については[前回の記事](https://qiita.com/orakurara/items/6c50bca2ba89cc7a2066#ソースデータベースの準備-postgresql-on-linux-compute-vm)をご参照ください。




OCI GoldenGateの設定は下記のドキュメントとブログ記事を参考に実施しています。


**Oracle Cloud Infrastructure GoldenGate**
Replicate Data from PostgreSQL to Autonomous Transaction Processing
https://docs.oracle.com/en/cloud/paas/goldengate-service/rjsql/


**オラクルエンジニア通信 - 技術資料、マニュアル、セミナー**
OCI GoldenGateを使用して、オンプレミスのPostgreSQLデータベースをOCI Database with PostgreSQLにシームレスに移行
https://blogs.oracle.com/oracle4engineer/post/ja-migrate-onp-postgresql-to-oci-postgresql-with-oci-gg

今回の検証ではOCI GoldenGate 21cを利用して実施しました。

# OCI GoldenGateデプロイメント・インスタンス作成の為の準備
### OCIのアーキテクチャ
ソースデータベースとターゲットデータベースは下記ように配備されています。
それぞれのデータベースはPrivate Endpointを利用してOCI GoldenGateと接続を行います。
￼![Pasted Graphic 137.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/5e596cf8-6e05-f608-f898-9de9dce8bb04.png)


### OCI GoldenGateの利用に必要なIAMポリシーの作成
ナビゲーション・メニューより、アイデンティティとセキュリティ > アイデンティティ > ポリシー にアクセスします。
￼
![Pasted Graphic 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/288d7554-7297-4d4b-8e32-72843e0e850b.png)


OCI GoldenGateの利用に必要なIAMポリシーの設定例はこちらになります。
Administratorsグループに対しTenancy全体に有効なポリシーを設定するため、ルート・コンパートメントに下記ポリシーを設定しました。
参考: https://docs.oracle.com/ja-jp/iaas/goldengate/doc/policies.html

```
allow group Administrators to manage goldengate-family in tenancy
allow group Administrators to manage virtual-network-family in tenancy
allow service goldengate to {idcs_user_viewer, domain_resources_viewer} in tenancy
allow group Administrators to manage secret-family in tenancy
allow group Administrators to use keys in tenancy
allow group Administrators to use vaults in tenancy
allow service goldengate to use keys in tenancy
allow service goldengate to use vaults in tenancy
```

下記のポリシーは任意のため必要に応じて設定します。
* ソース・データベースまたはターゲット・データベース(あるいはその両方)用のOracle Database
```
allow group Administrators to read database-family in tenancy
allow group Administrators to read autonomous-database-family in tenancy
```

* 手動のOCI GoldenGateバックアップを格納するためのOracle Object Storage
```
allow group Administrators to manage objects in tenancy
allow group Administrators to inspect buckets in tenancy
```

* OCIロギング: ログ・グループにアクセス
```
allow group Administrators to manage log-groups in tenancy
allow group Administrators to manage log-content in tenancy
```

*Load Balancer (デプロイメント・コンソールへのパブリック・アクセスを有効にした場合)
```
allow group Administrators to manage load-balancers in tenancy
allow group Administrators to manage public-ips in tenancy
allow group Administrators to manage network-security-groups in tenancy
allow group Administrators to manage vcns in tenancy where ANY {request.operation = 'CreateNetworkSecurityGroup', request.operation = 'DeleteNetworkSecurityGroup'}
```

* ワークスペースのタグ・ネームスペースおよびタグを管理するためのグループ権限
```
allow group Administrators to manage tag-namespaces in tenancy
```

OCIコンソールからポリシーの作成を選択し、必要なポリシーを作成していきます。

![Pasted Graphic 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/ee8e3613-7063-2ecd-1e61-050361334b60.png)
![Pasted Graphic 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/2489b810-8143-9acf-d2f6-6a4018af577a.png)

￼



### OCI Vaultの作成
ナビゲーション・メニューより、アイデンティティとセキュリティ > キー管理とシークレット管理 > ボールトにアクセスします。
￼
![Pasted Graphic 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/76b11010-f485-f833-2521-e391c810e344.png)


ボールトの作成をクリックし、下記を入力します。

* コンパートメントに作成：demo
   * 名前：OCIVault
   * 仮想プライベート・ボールトにする：無効
￼
![Pasted Graphic 5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/476aa18d-cf86-90f5-cbdb-b06b5df895be.png)


次にマスター暗号化キーを作成します。「キーの作成」を選択し、下記パラメータを入力します。

* コンパートメントに作成：demo
* 保護モード：HSM
* 名前：MasterKey
* キーのシェイプ:アルゴリズム：AES
* キーのシェイプ:長さ：256ビット

![Pasted Graphic 6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/45553f08-a4d6-9dc0-fd5b-f33298811256.png)

￼


# OCI GoldenGateデプロイメント・インスタンスの作成
ナビゲーション・メニュー より、Oracle Database > GoldenGateにアクセスします。
デプロイメントの作成を選択し、ウィザード内の入力項目に対し下記の値を設定していきます。

① 一般情報
   * 名前：OCIGG4Postgres
   * 説明：オプション
   * コンパートメント：”コンパートメント名”
   * 本番 / 開発またはテスト：開発またはテストを選択
   * OCPU数：1
   * 自動スケーリング：無効
   * サブネット in ”コンパートメント名”： ex) Postgres_Private_Subnet (demo-vcn VCN内)
   * ライセンス・タイプの選択：ライセンス込み
   * Show advanced options内
     * ネットワーク
     * GoldenGateコンソール・パブリック・アクセスの有効化：有効
     * ロード・バランサ・サブネット in demo：Public Subnet (demo-vcn VCN内)

②GoldenGateの詳細
   * デプロイメント・タイプの選択：データ・レプリケーション
   * テクノロジの選択：PostgreSQL
   * バージョン：oggpostgresql:21.13.0.0.0_240227.2300_952
   * GoldenGateインスタンス名：OCIGG4Postgres
   * 資格証明ストア：GoldenGate
   * 管理者ユーザー名：ociggadmin
   * パスワードシークレットの作成
      * 名前：secret4ocigg
      * 説明：オプション
      * コンパートメント：”コンパートメント名”
      * ボールト in ”コンパートメント名”：OCIVault
      * 暗号化キー in demo：MasterKey
      * ユーザー・パスワード：

￼
![Pasted Graphic 7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/c431c3d6-d703-cda3-1c38-590bc496edce.png)

![Pasted Graphic 8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/3707cbf8-b118-164b-a7fe-e10985856047.png)

![Pasted Graphic 9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/406de616-9021-6006-2031-fe72354ecdd6.png)

![Pasted Graphic 10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/42520e06-3be2-f40b-a558-4e6ae251e67d.png)

![Pasted Graphic 11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/a922f770-f4e7-91ab-65e8-2047745bbc51.png)


# OCI GoldenGateデータベース接続の作成
OCI GoldenGateではデータベースに対する接続情報をOCIコンソールから設定しGoldenGateに登録を行います。
作成した接続では事前に接続性のテストを実行することができ、接続性に関する問題の切り分けを実施することが可能です。

### ソースデータベースに対する接続の作成
「接続の作成」を選択し、ウィザード内の入力項目に対し下記の値を設定していきます。

①一般情報
   * 名前：SourcePostgres
   * 説明：オプション
   * コンパートメント：”コンパートメント名”
   * タイプ：PostgreSQLサーバー

②接続詳細
   * データベース名：ociggll
   * ホスト：10.0.100.203
   * ポート：5432
   * データベース・ユーザー名：ggadmin
   * データベース・ユーザー・パスワード：ggadminユーザーのパスワード
   * SSL詳細
      * セキュリティ・プロトコル：TLS
      * SSLモード：プレーン
   * ネットワーク接続：専用エンドポイント
   * サブネット in demo：ociggllが稼働するComputeインスタンスが配備されたサブネットを指定

￼
![Pasted Graphic 12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/9f8de8f4-1b6b-d51c-3b9e-529e012e6b47.png)

￼![Pasted Graphic 13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/6b0db79b-d0a1-5926-4e92-30f2ad809a0d.png)

![Pasted Graphic 14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/84424081-48d1-0bcc-38e0-f8b11a5353a7.png)

![Pasted Graphic 15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/5ae54619-cd36-fb9d-a078-552f393b3ac2.png)

￼

作成した接続がアクティブになったら、「デプロイメントの割当て」を選択し、事前に作成しておいたOCI GoldenGateのデプロイメント・インスタンスに対する登録を行います。
￼
![Pasted Graphic 16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/43a5c740-2c41-813a-ba0e-0bd701aa2837.png)


デプロイメントの割当てが完了したら、接続テストを実施し、ソースデータベースに対する接続性に問題がないことを確認します。

![Pasted Graphic 17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/fc599bd6-1c04-f67c-7f66-debe0a874a35.png)￼
￼
![Pasted Graphic 18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/50144429-1f7c-d825-645b-7faa6cc2a529.png)




###ターゲットデータベースに対する接続の作成
ソースデータベースと同様にターゲットデータベースの接続を作成します。
「接続の作成」を選択し、ウィザード内の入力項目に対し下記の値を設定していきます。
OCI Database with PostgreSQLに対する接続の際はセキュリティ・プロトコルにTLSを、SSLモードを優先に設定することがポイントです。
作成した接続がアクティブになったら、「デプロイメントの割当て」を選択し、事前に作成しておいたOCI GoldenGateのデプロイメント・インスタンスに対する登録を行い、接続テストを実施し、ソースデータベースに対する接続性に問題がないことを確認します。

①一般情報
   * 名前：TargetPostgres
   * 説明：オプション
   * コンパートメント：”コンパートメント名”
   * タイプ：PostgreSQLサーバー

②接続詳細
   * データベース名：ociggllTgt
   * ホスト：10.0.40.168
   * ポート：5432
   * データベース・ユーザー名：ggadmin
   * データベース・ユーザー・パスワード：ggadminユーザーのパスワード
   * SSL詳細
      * セキュリティ・プロトコル：TLS
      * SSLモード：優先
   * ネットワーク接続：専用エンドポイント
   * サブネット in demo：ociggllTgtが稼働するComputeインスタンスが配備されたサブネットを指定

￼
![Pasted Graphic 19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/bdb60476-c4f8-fcd8-3a28-86a455fae22e.png)
￼
![Pasted Graphic 20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/9de4900b-7869-0645-1192-6d88af5c0bc0.png)

￼![Pasted Graphic 21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/86f15124-408d-5379-5663-73d047a7ca86.png)

![Pasted Graphic 22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/8d39aaec-ab87-3e38-875b-7f34f23f5f55.png)


# OCI GoldenGateを利用した初期ロードの実行
### OCI GoldenGate管理コンソールへアクセス
OCI GoldenGateのサービスダッシュボードのデプロイメントの詳細画面にて、「コンソール」の起動を選択し、OCI GoldenGateの管理コンソールにアクセスします。
￼
![Pasted Graphic 23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/a1e111ef-67f1-f9ec-a627-319a4103cb7c.png)


OCI GoldenGateデプロイメント作成時に指定した管理者ユーザー名（ociggadmin）、シークレット作成時に指定したパスワードを利用してサインインします。
￼
![Pasted Graphic 24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/e27a4cd9-8f25-37d1-287a-4e7e62c96313.png)

![Pasted Graphic 25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/afd7c2f2-022d-e4db-d547-36db1acb2490.png)



### サプリメンタルロギングの設定
左上のナビゲーション・メニューから「構成」にアクセスし、デプロイメントに「接続」が登録されていることを確認します。
￼
![Pasted Graphic 26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/5b821922-ebdb-fe1a-0eef-808cfe7a784a.png)


ソースデータベースのアクションメニューを選択し、「TRANDATA情報」横の＋マークを選択します。スクリーンショットを参考にして表名に連携対象となるスキーマ名を入力し、「発行」を選択します。
その後、TRANDATA情報の「表の検索」にて移行対象となるテーブルが参照できることを確認します。
￼
![Pasted Graphic 27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/ae068aad-dcb5-d318-b569-5f420c4cbfe0.png)

![Pasted Graphic 28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/7b398eac-0e1d-cecd-0a2f-326553be412e.png)

![Pasted Graphic 29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/8f23264b-41b3-53cc-905c-df30dd89943b.png)


ターゲットデータベースの接続に対しても同様の手順を実施しました。


### 初期ロード用Extractの作成
OCI GoldenGateの管理コンソール、「管理サービス」の画面から「Extract」横の＋アイコンを選択し、新規Extractの作成を行います。
各設定値についてはスクリーンショットを参考にしてください。
￼
![Pasted Graphic 30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/836bd317-c11e-a121-f9cc-70ab5c92f5b8.png)

![Pasted Graphic 31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/55ad00a1-fb25-52df-ab28-3958ad4aabe4.png)

![Pasted Graphic 32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/978772ea-7839-14f8-cadc-4d1338bf23a5.png)



初期ロード用のExtractが作成したら、アクションメニューより「詳細」を選択し、「レポート」のメニューにて、LSNの値をメモしておきます。
￼

![Pasted Graphic 33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/952cb955-b471-4b22-7530-4ab5f5b4be23.png)
￼
![Pasted Graphic 34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/a4f60a56-9047-f90c-b0c1-a59cd1d09eb3.png)

![Pasted Graphic 35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/e3a62d18-ed7b-ed92-0539-33da7b083409.png)




### 初期ロードReplicatの作成
「構成」画面より、ターゲットデータベース接続のアクションメニューよりチェックポイント表(src_ociggll.ckpt)を作成します。
￼
![Pasted Graphic 36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/22bf37c5-6105-f7c4-541f-2c6afd012540.png)


OCI GoldenGateの管理コンソール、「管理サービス」の画面から「Replicat」横の＋アイコンを選択し、新規Replicatの作成を行います。
各設定値についてはスクリーンショットを参考にしてください。
￼
￼
![Pasted Graphic 37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/1c07dc74-1731-e702-dc4a-ce2be5e4c537.png)

￼![Pasted Graphic 38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/34460f3d-4482-15fd-90ba-3c5f6f348f68.png)

![Pasted Graphic 39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/4df4a8c8-37f0-7d1e-b769-42eb62a9a229.png)

![Pasted Graphic 40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/04b1d525-9a9c-cdf6-f334-9149ccbbcebe.png)

![Pasted Graphic 41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/ef94b2fa-ee2d-8a05-764d-e416c07e579f.png)


### 初期ロード結果の確認
初期ロード用のReplicatを作成し、正常に稼働したことを確認したらターゲットデータベースにアクセスし、初期ロードが問題なく実施できていることを確認します。

```
bash-5.1$ psql -h 10.0.40.168 -d ocigglltgt -U ggadmin;
Password for user ggadmin: 
psql (16.2, server 14.10)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, compression: off)
Type "help" for help.

ocigglltgt=> select table_schema, table_name, src_ociggll.cnt_rows(table_schema, table_name) from information_schema.tables where table_schema not in ('pg_vatalog', 'information_schema') and table_type='BASE TABLE' order by 3 desc;
 table_schema |       table_name        | cnt_rows 
--------------+-------------------------+----------
 pg_catalog   | pg_ts_template          |        5
 pg_catalog   | pg_namespace            |        5
 pg_catalog   | pg_language             |        4
 pg_catalog   | pg_database             |        4
 src_ociggll  | log                     |        3
 pg_catalog   | pg_shdescription        |        3
 pg_catalog   | pg_tablespace           |        3
 pg_catalog   | pg_extension            |        1


ocigglltgt=> select * from src_ociggll.log;
 id |            date            
----+----------------------------
  1 | 2024-04-25 04:44:05.859543
  2 | 2024-04-25 04:44:05.860827
  3 | 2024-04-25 04:44:05.86153
(3 rows)

ocigglltgt=> 
```

初期ロードが実行されていることを確認できました。

# OCI GoldenGateを利用したリアルタイムレプリケーション（CDCレプリケーション）
### CDC用Extractの追加
下記のスクリーンショットの設定値を参考にCDC用のExtractを新規で追加します。
￼
![Pasted Graphic 42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/eab2a59d-922d-bf37-93f4-be934b9739d6.png)

![Pasted Graphic 43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/e890ff3a-af43-c843-6589-eeb3552ade58.png)

￼![Pasted Graphic 44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/57cfd177-3162-26b3-6fe9-4b6e83105e0d.png)


アクションメニューより「オプションを指定して開始」を選択します。開始ポイントに「CSN」を選択し、CSNの項目に事前確認しておいたLSNの値を入力します。
￼
![Pasted Graphic 45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/828d2f31-735d-37e7-e88f-ab89cce11792.png)

![Pasted Graphic 46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/9ceb5559-0a69-6063-39c6-0a73832ec9b8.png)



### CDC用のReplicatの追加
下記のスクリーンショットの設定値を参考にCDC用のReplicatを新規で追加します。

￼
![Pasted Graphic 47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/c2932e3f-126d-4d64-c995-81b5c525d5ab.png)


![Pasted Graphic 48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/a588db01-9825-cd44-2316-df378249f57f.png)

![Pasted Graphic 49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/673ad4a8-26a7-0f75-4376-3ac088016d87.png)

![Pasted Graphic 50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/f68d7178-14f6-4f52-3849-9fac0aa47073.png)


### CDCレプリケーションの確認
ソースデータベースにアクセスし、新規レコードを追加します。
```
$ psql ociggll -U ggadmin;
INSERT INTO src_ociggll.log(id, date) VALUES (4, current_timestamp);
INSERT INTO src_ociggll.log(id, date) VALUES (5, current_timestamp);
INSERT INTO src_ociggll.log(id, date) VALUES (6, current_timestamp);
ociggll=# select * from src_ociggll.log;
 id |            date            
----+----------------------------
  1 | 2024-04-25 04:44:05.859543
  2 | 2024-04-25 04:44:05.860827
  3 | 2024-04-25 04:44:05.86153
  4 | 2024-04-25 07:45:00.515204
  5 | 2024-04-25 07:45:00.516501
  6 | 2024-04-25 07:45:00.517101
(6 rows)

ociggll=# 
```

ターゲットデータベースにアクセスし、ソースデータベースに対する変更が伝搬できていることを確認します。

```
bash-5.1$ psql -h 10.0.40.168 -d ocigglltgt -U ggadmin;
Password for user ggadmin: 
psql (16.2, server 14.10)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, compression: off)
Type "help" for help.

ocigglltgt=> select * from src_ociggll.log order by id asc;
 id |            date            
----+----------------------------
  1 | 2024-04-25 04:44:05.859543
  2 | 2024-04-25 04:44:05.860827
  3 | 2024-04-25 04:44:05.86153
  4 | 2024-04-25 07:45:00.515204
  5 | 2024-04-25 07:45:00.516501
  6 | 2024-04-25 07:45:00.517101
(6 rows)

ocigglltgt=> 
```


# 参考情報
https://docs.oracle.com/en/cloud/paas/goldengate-service/rjsql/
https://blogs.oracle.com/oracle4engineer/post/ja-migrate-onp-postgresql-to-oci-postgresql-with-oci-gg