前回の記事で構築した、OCI上のOracle Linux 9上のPostgreSQLと、OCIでマネージドサービス(PaaS)として提供されているOCI Database with PostgreSQLを利用し、OCI GoldenGateを利用したリアルタイムデータ同期の設定を行いました。連携用のスキーマの作成などOCI GoldenGateを利用するための事前準備については前回の記事をご参照ください。
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と接続を行います。

OCI GoldenGateの利用に必要なIAMポリシーの作成
ナビゲーション・メニューより、アイデンティティとセキュリティ > アイデンティティ > ポリシー にアクセスします。

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コンソールからポリシーの作成を選択し、必要なポリシーを作成していきます。

OCI Vaultの作成
ナビゲーション・メニューより、アイデンティティとセキュリティ > キー管理とシークレット管理 > ボールトにアクセスします。

ボールトの作成をクリックし、下記を入力します。
次にマスター暗号化キーを作成します。「キーの作成」を選択し、下記パラメータを入力します。
- コンパートメントに作成:demo
- 保護モード:HSM
- 名前:MasterKey
- キーのシェイプ:アルゴリズム:AES
- キーのシェイプ:長さ:256ビット

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
- ユーザー・パスワード:
OCI GoldenGateデータベース接続の作成
OCI GoldenGateではデータベースに対する接続情報をOCIコンソールから設定しGoldenGateに登録を行います。
作成した接続では事前に接続性のテストを実行することができ、接続性に関する問題の切り分けを実施することが可能です。
ソースデータベースに対する接続の作成
「接続の作成」を選択し、ウィザード内の入力項目に対し下記の値を設定していきます。
①一般情報
- 名前:SourcePostgres
- 説明:オプション
- コンパートメント:”コンパートメント名”
- タイプ:PostgreSQLサーバー
②接続詳細
- データベース名:ociggll
- ホスト:10.0.100.203
- ポート:5432
- データベース・ユーザー名:ggadmin
- データベース・ユーザー・パスワード:ggadminユーザーのパスワード
- SSL詳細
- セキュリティ・プロトコル:TLS
- SSLモード:プレーン
- ネットワーク接続:専用エンドポイント
- サブネット in demo:ociggllが稼働するComputeインスタンスが配備されたサブネットを指定

作成した接続がアクティブになったら、「デプロイメントの割当て」を選択し、事前に作成しておいたOCI GoldenGateのデプロイメント・インスタンスに対する登録を行います。

デプロイメントの割当てが完了したら、接続テストを実施し、ソースデータベースに対する接続性に問題がないことを確認します。
###ターゲットデータベースに対する接続の作成
ソースデータベースと同様にターゲットデータベースの接続を作成します。
「接続の作成」を選択し、ウィザード内の入力項目に対し下記の値を設定していきます。
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インスタンスが配備されたサブネットを指定
OCI GoldenGateを利用した初期ロードの実行
OCI GoldenGate管理コンソールへアクセス
OCI GoldenGateのサービスダッシュボードのデプロイメントの詳細画面にて、「コンソール」の起動を選択し、OCI GoldenGateの管理コンソールにアクセスします。

OCI GoldenGateデプロイメント作成時に指定した管理者ユーザー名(ociggadmin)、シークレット作成時に指定したパスワードを利用してサインインします。

サプリメンタルロギングの設定
左上のナビゲーション・メニューから「構成」にアクセスし、デプロイメントに「接続」が登録されていることを確認します。

ソースデータベースのアクションメニューを選択し、「TRANDATA情報」横の+マークを選択します。スクリーンショットを参考にして表名に連携対象となるスキーマ名を入力し、「発行」を選択します。
その後、TRANDATA情報の「表の検索」にて移行対象となるテーブルが参照できることを確認します。

ターゲットデータベースの接続に対しても同様の手順を実施しました。
初期ロード用Extractの作成
OCI GoldenGateの管理コンソール、「管理サービス」の画面から「Extract」横の+アイコンを選択し、新規Extractの作成を行います。
各設定値についてはスクリーンショットを参考にしてください。

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

初期ロードReplicatの作成
「構成」画面より、ターゲットデータベース接続のアクションメニューよりチェックポイント表(src_ociggll.ckpt)を作成します。

OCI GoldenGateの管理コンソール、「管理サービス」の画面から「Replicat」横の+アイコンを選択し、新規Replicatの作成を行います。
各設定値についてはスクリーンショットを参考にしてください。


初期ロード結果の確認
初期ロード用の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を新規で追加します。

アクションメニューより「オプションを指定して開始」を選択します。開始ポイントに「CSN」を選択し、CSNの項目に事前確認しておいたLSNの値を入力します。

CDC用のReplicatの追加
下記のスクリーンショットの設定値を参考にCDC用のReplicatを新規で追加します。
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