OCI GoldenGateを利用したPostgreSQLからAutonomous DatabaseへのCDCレプリケーション

Oracle Linux 9上のPostgreSQLからOCI上のマネージドサービス(PaaS)として提供されているAutonomous Database (Oracle Autonomous Transaction Processing) に対し、OCI GoldenGateを利用した異種データベース間のリアルタイムデータ同期の設定を行いました。
今回の検証ではOCI GoldenGate 21cを利用しています。

# 検証環境の準備
### OCIのアーキテクチャ
ソースデータベースとターゲットデータベースは下記ように配備されています。
それぞれのデータベースはOCI GoldenGateのPrivate Endpointを利用して接続を行います。
![Pasted Graphic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/5a82f714-eb83-e7c4-bdd4-9bf767bc2c2d.png)


### ソースデータベースの準備 (PostgreSQL on Linux Compute VM)
[前々回の記事](https://qiita.com/orakurara/items/6c50bca2ba89cc7a2066#ソースデータベースの準備-postgresql-on-linux-compute-vm)をご参照ください。

[**OCI 上で構築する PostgreSQL の稼働環境**
ソースデータベースの準備 (PostgreSQL on Linux Compute VM)](
https://qiita.com/orakurara/items/6c50bca2ba89cc7a2066#ソースデータベースの準備-postgresql-on-linux-compute-vm)


### ターゲットデータベースAutonomous Database (ATP) の作成
ナビゲーション・メニュー より、Oracle Database > Autonomous Databaseにアクセスします。
Autonomous Databaseの作成を選択し、ATPインスタンスを作成します。
ウィザード内の入力項目の設定値は下記スクリーンショットを参考にしてください。

![Pasted Graphic 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/84aa4c21-0571-d74c-52dc-3785a9f481b4.png)

![Pasted Graphic 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/10b4278e-bd62-a4fe-bef7-1c53950f4056.png)

![Pasted Graphic 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/b71e7434-9b20-35f8-4d93-1b364d8a9cc7.png)

![Pasted Graphic 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/d0dfea6e-3819-f72a-24ea-d1b9852627a1.png)

![Pasted Graphic 5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/44294ca8-259f-4cf5-b4ba-ae6e5e57cb45.png)

ATPインスタンスの作成が完了したら、OCI GoldenGateとの接続に利用するデータベースユーザーを設定します。Autonomous Databaseでは、OCI GoldenGateとの接続ユーザーであるGGADMINユーザーが事前定義されています。データベース・アクションのデータベース・ユーザーから、ユーザー管理画面にアクセスし、GGADMINユーザーのロックを解除し、新規パスワードを設定します。


![Pasted Graphic 6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/c2e3170d-5184-328b-7d1a-755e9705c49d.png)

![Pasted Graphic 7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/06c2e33b-34ea-8a03-2eb7-421c4e483edf.png)





次にレプリケーション対象となるSRC_OCIGGLスキーマを作成します。
データベースアクションよりSQLの実行画面から、下記SQLを実行します。

```
CREATE USER SRC_OCIGGLL IDENTIFIED BY “PASSWORD” DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP; 
grant create session to "SRC_OCIGGLL";
alter user "SRC_OCIGGLL" account unlock;
grant connect, resource, dwrole to "SRC_OCIGGLL";
grant unlimited tablespace to "SRC_OCIGGLL";
```

![Pasted Graphic 8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/08beefc2-9e27-7685-f2b4-3bfefb1b2a8c.png)
![Pasted Graphic 9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/8f586813-f7a4-cce3-6a7d-763c381f039e.png)


レプリケーション対象となるテーブルを事前に作成しておきます。PostgreSQLで作成していたテーブルのカラム名dateがOracle Databaseでは予約語になっており利用できなかった為、カラム名log_dateに変更しています。OCI GoldenGateではCOLMAPパラメータを利用し連携対象のカラムのマッピングを行いました。

参考） [SQL言語リファレンス Oracle SQLの予約語](https://docs.oracle.com/cd/F19136_01/sqlrf/Oracle-SQL-Reserved-Words.html)

```
CREATE TABLE SRC_OCIGGLL.log (
id NUMBER primary key,
log_date TIMESTAMP
);
```

# OCI GoldenGateデプロイメント・インスタンスの作成

### デプロイメント・インスタンス作成の事前準備
OCI GoldenGateデプロイメントの作成に必要なIAMポリシーの設定やOCI Vaultの作成については[前回の記事](https://qiita.com/orakurara/items/0eb1119ea3e77a7235bf)を参考ください。

[OCI GoldenGateの利用に必要なIAMポリシーの作成](https://qiita.com/orakurara/items/0eb1119ea3e77a7235bf#oci-goldengateの利用に必要なiamポリシーの作成)
[OCI Vaultの作成](https://qiita.com/orakurara/items/0eb1119ea3e77a7235bf#oci-vaultの作成)


### PostgreSQL用OCI GoldenGateデプロイメント・インスタンス作成
PostgreSQL用OCI GoldenGateデプロイメント・インスタンス作成、ソースデータベースであるPostgreSQLとの接続の作成、初期ロード用Extract、CDCレプリケーション用のExtractの作成については[前回の記事](https://qiita.com/orakurara/items/0eb1119ea3e77a7235bf)を参考ください。

[PostgreSQL用OCI GoldenGateデプロイメント・インスタンス作成](https://qiita.com/orakurara/items/0eb1119ea3e77a7235bf#oci-goldengateデプロイメントインスタンスの作成)
[ソースデータベースであるPostgreSQLとの接続の作成](https://qiita.com/orakurara/items/0eb1119ea3e77a7235bf#ソースデータベースに対する接続の作成)
[初期ロード用Extractの作成](https://qiita.com/orakurara/items/0eb1119ea3e77a7235bf#初期ロード用extractの作成)
[CDCレプリケーション用のExtractの作成](https://qiita.com/orakurara/items/0eb1119ea3e77a7235bf#cdc用extractの追加)


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

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

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


![Pasted Graphic 10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/0f8b1e49-a210-ceed-fb40-aa2a2f19602e.png)
![Pasted Graphic 11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/75cfa66f-7470-4690-dae4-d3cc15686462.png)
![Pasted Graphic 12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/9f5776e0-0b0d-8b25-8cfa-25663286d50a.png)




### ATPに対する接続の作成とOCI GoldenGateデプロイメントの登録
OCI GoldenGateではデータベースに対する接続情報をOCIコンソールから設定しGoldenGateに登録を行います。作成した接続では事前に接続性のテストを実行することができ、接続性に関する問題の切り分けを実施することが可能です。「接続の作成」を選択し、ターゲットデータベースであるATPに対する接続を作成します。ウィザード内の入力項目に対する設定値についてはスクリーンショットを参照してください。

![Pasted Graphic 13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/f469f1aa-b6a9-73fa-3eee-45329520056f.png)
![Pasted Graphic 14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/ce05b6b6-0144-ed5f-6414-a8db16c2221f.png)


作成した接続がアクティブになったら、「デプロイメントの割当て」を選択し、事前に作成しておいたOCI GoldenGateのデプロイメント・インスタンスに対する登録を行います。デプロイメントの割当てが完了したら、接続テストを実施し、ソースデータベースに対する接続性に問題がないことを確認します。


![Pasted Graphic 15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/dc6f5e98-29d3-7af1-b6e8-0d47621b1ced.png)
![Pasted Graphic 16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/a1aacb36-6e57-ebb6-418a-12728ccdf9ab.png)


# OCI GoldenGateの初期ロード用分散パスの作成
PostgreSQL用のOCI GoldenGateデプロイメントと、ATPに接続したOracle Database用のOCI GoldenGateデプロイメントを接続する為の分散パスを作成します。

### 分散パス作成の準備
分散パスとの接続のためにターゲット側であるOracle Database用のOCI GoldenGateデプロイメントのFQDNとPrivateIPを確認します。デプロイメントの詳細ページ、「デプロイメント情報」の「ネットワーク」の「プライベートIPアドレス」をメモしておきます。また「編集」ボタンからアクセスできる「デプロイメントの編集」からFQDNをメモします。

![Pasted Graphic 17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/fdb161c2-8d62-0952-440b-bf34155dd6a6.png)



今回の検証環境の場合は下記の設定値となっていました。
```
FQDN: e2seqbot5tjq.deployment.goldengate.ap-tokyo-1.oci.oraclecloud.com
プライベートIPアドレス: 10.0.40.2
```

### 分散パスの認証ユーザーの作成
分散パスが利用するOCI GoldenGateの認証ユーザーを作成します。ターゲット側OCI GoldenGateデプロイメントに対し、作成時に指定した管理者ユーザー名（ociggadmin）、シークレット作成時に指定したパスワードを利用してOCI GoldenGate管理コンソールにサインインします。

![Pasted Graphic 18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/c56215ab-a1a5-7257-ce9e-bdb9f0d78e4a.png)


左上のナビゲーション・メニューから「管理者」にアクセスし、「ユーザー」横の＋アイコンを選択し、新規ユーザーの作成を行います。

![Pasted Graphic 19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/0a1e2598-1ace-28d5-4e77-14d7c1977084.png)


ナビゲーション・メニューを開き、「管理者」をクリックします。
新規ユーザーの追加 (プラス・アイコン)を選択し、次のように設定します。
   * ユーザー名: ggsnet
   * ロール: 演算子
   * タイプ: パスワード
   * 任意のパスワードを設定してください

![Pasted Graphic 20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/6431bb52-4c56-5d7b-5c47-0cb27a97fc72.png)


ソース側OCI GoldenGateデプロイメントに対しても同様の手順でユーザーを作成します。

ソース側OCI GoldenGateデプロイメントでは、ggsnetユーザーの資格証明書を作成しておきます。ナビゲータ・メニューを開いて、「構成」を選択、「資格証明の追加」(プラス・アイコン)を選択し、下記設定値を入力します。
   * 資格証明ドメイン: GGSNetwork
   * 資格証明別名: dpuser
   * Database Name: 任意の名前を入力して「Database Server」および「Port」フィールドを空白のままにするか、デフォルト値をそのまま使用できます 
   * ユーザーID: ggsnet

### GoldenGateデプロイメント間の接続の作成
上述の手順で確認したFQDNやプライベートIPアドレス、OCI GoldenGateに登録した認証ユーザーを利用して接続を作成します。

![Pasted Graphic 21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/c4adef71-b5de-c1ed-1d6b-7d5331032e42.png)
![Pasted Graphic 22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/cd743f43-6ae7-4050-ffeb-0171014a23da.png)
![Pasted Graphic 23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/300e996c-dafa-18cc-f7d2-d6b6c70e9ab6.png)



接続がアクティブに変わったらソース側のPostgreSQL用のOCI GoldenGateデプロイメントに割当てます。

### 初期ロードExtractの分散パスの作成

ソース側のPostgreSQL用のOCI GoldenGate管理コンソールにおいて、「分散サービスタブ」画面右端のプラス・アイコンを選択し分散パスを作成します。
 
  * パス名: DistributionPath4InitialLoad
  * ソース・トレイル: Extract
   * 証跡名: 初期ロードEXTRACT証跡名(I1)を入力
   * ターゲット認証方式: 「UserID別名」
   * ターゲット」で、「wss」を選択します。
   * ターゲット・ホスト: ターゲットAutonomous DatabaseデプロイメントURLをhttps://または末尾のスラッシュなしで入力します。
   * ポート番号: 443
   * 証跡名: I1　
   * ドメイン: 前のステップで作成したドメイン名
   * 別名: 前のステップで作成した資格証明別名


![Pasted Graphic 24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/e69af156-c063-480d-b1dd-bfa0c6834e8f.png)
![Pasted Graphic 25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/d5a3de97-12b9-d426-a9ab-ac43d91792cc.png)
![Pasted Graphic 26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/30989e8e-09dd-1491-39fe-ba3cc1517b6c.png)


# OCI GoldenGateの初期ロード用Replicatの作成
ターゲット側のOracle Database用のOCI GoldenGate管理コンソールにおいて、「分散サービスタブ」画面右端のプラス・アイコンを選択し分散パスを作成します。ATPとの接続アイコンを選択し、「チェックポイント」横のプラス・アイコンを選択し、チェックポイント表GGADMIN.ckptを入力し、発行を選択します。

![Pasted Graphic 27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/4639f119-d46b-22f3-6706-8f52c914252d.png)
![Pasted Graphic 28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/8b0c46f1-a059-ed86-dd80-14e3315819d8.png)


OCI GoldenGate管理コンソールの管理サービス画面からReplicat横のプラス・アイコンを選択し初期ロード用のReplicatを作成します。各設定項目についてはスクリーンショットを参照ください。

![Pasted Graphic 29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/11e71cb6-55c7-433a-73b1-e9bee1a964a8.png)
![Pasted Graphic 30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/67d250d0-5ca5-c360-1694-6c707cceb9bb.png)
![Pasted Graphic 31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/7330ef83-fda6-18e0-3f7a-51387f7bf9a1.png)
![Pasted Graphic 32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/4d04ea03-ddf4-e65e-3b85-b0b60d6bc4ce.png)


Replicatのパラメータファイルでは、ソース側のPostgreSQL上の表と異なるカラム名を有するATP上の表をMAPするためにCOLMAPパラメータを利用して下記のように記述します。COLMAPパラメータ内の記述は、「連携先のカラム名」＝「連携元のカラム名」と記載する必要があるので順序を間違えないように気を付ける必要があります。
```
REPLICAT INITREP
USERIDALIAS TargetATP DOMAIN OracleGoldenGate
MAP SRC_OCIGGLL.log, TARGET SRC_OCIGGLL.log COLMAP(id=id, log_date=date);
```

![Pasted Graphic 33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/5151a3f7-9243-8a11-329b-36a6bb00c5b9.png)



初期ロード用のReplicatの作成が完了したら、アクションメニューの「詳細」画面より初期ロードの状況を確認することができます。

![Pasted Graphic 34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/a15d2782-2011-5a53-9ff2-00186b03fc91.png)
![Pasted Graphic 35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/3a30f378-cacf-acfa-ba24-64ecdc0983ce.png)


6件のレコードのロードが実施されたことを確認できます。
ソース側のPostgreSQL用のOCI GoldenGate管理コンソールの初期ロード用Extractのアクションメニューより「詳細」画面にアクセスし、レポートタブから初期ロードされたLSNを取得します。

![Pasted Graphic 36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/aed3edb7-c1f1-c00a-ebed-0c76cd297267.png)


初期ロードの状況はターゲット側のATPに対しSELECT文を発行することでも確認することができました。

![Pasted Graphic 37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/b2df4f73-6322-8f1e-5958-5a6ce2377d19.png)





# CDCレプリケーション用の分散パスの作成
ソース側のPostgreSQL用のOCI GoldenGate管理コンソールにおいて、「分散サービスタブ」画面右端のプラス・アイコンを選択し分散パスを作成します。

![Pasted Graphic 38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/baab269c-0984-5c1c-998b-cc384df956a3.png)
![Pasted Graphic 39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/527a6c57-d95e-e6b6-f72e-214daa222114.png)
![Pasted Graphic 40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/6934ac16-d81d-7f51-87d9-c404f1c40a94.png)



# CDCレプリケーション用Replicatの作成
ターゲット側のOracle Database用のOCI GoldenGate管理コンソールにおいて、管理サービス画面からReplicat横のプラス・アイコンを選択しCDCレプリケーション用のReplicatを作成します。各設定項目についてはスクリーンショットを参照ください。

![Pasted Graphic 41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/bcb79832-983f-b022-b9ae-24778ae46e3a.png)
![Pasted Graphic 42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/2ed3cc36-ecd1-70d2-9a7d-6e9c523a5fb8.png)
![Pasted Graphic 43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/a0558659-f6e7-fabe-80ae-c5585bb9c0f9.png)
![Pasted Graphic 44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/da921727-192d-69af-1177-e53db23221b5.png)
![Pasted Graphic 45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/9cfcf15d-debb-61c9-6155-9de16e45581e.png)


ソース側のPostgreSQL用のOCI GoldenGate管理コンソールのCDCレプリケーション用Extractのアクションメニューより「オプションを使用して開始」を選択し、開始ポイントに「CSN」を選択し、CSNの項目に事前に確認しておいたLSNの値を入力します。


![Pasted Graphic 46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/7205834b-36fd-8062-bf1f-028052322f73.png)
![Pasted Graphic 47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/e8e15152-e616-5b3c-f7c7-58e1f9330cc1.png)
![Pasted Graphic 48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/30c1aa3e-b3fd-2ee0-92c1-f5a0bff5e58c.png)


# CDCレプリケーションの確認
ソースデータベースであるPostgreSQLにアクセスし、連携対象の表のデータを更新します。
```
ociggll=# delete from src_ociggll.log where id > 3;
DELETE 3

ociggll=# INSERT INTO src_ociggll.log(id, date) VALUES (10, current_timestamp);
INSERT INTO src_ociggll.log(id, date) VALUES (11, current_timestamp);
INSERT INTO src_ociggll.log(id, date) VALUES (12, current_timestamp);
INSERT 0 1
INSERT 0 1
INSERT 0 1

ociggll=# 
```

ターゲット側のATPに対しSELECT文を発行し、変更が反映されていることを確認することができました。

![Pasted Graphic 49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/87fc36e9-3b83-2cac-f469-5eba92d8875c.png)



# 参考情報
https://docs.public.oneportal.content.oci.oraclecloud.com/ja-jp/iaas/goldengate/doc/replicate-data-postgresql-atp.html