Oracle GoldenGate 23ai による Vector 型のレプリケーションについて

## はじめに
Oracle GoldenGate 23aiはDatabase 23ai で実装された新機能に対応したレプリケーションが可能です。ここでは特に Database 23ai の主軸となる Vector データ型の連携を試します。環境はオンプレミスですが、OCI GoldenGateでも 23aiを用いたデプロイメントが作成できるので構築できると思います。
 (2024/7/2から oggoracle:23.4.0.0.0_240529.0500_1012の使用が可能)

## デプロイメントの準備
GoldenGate 23ai S/Wのインストールおよび実行環境(デプロイメント)の作成については 以上で公開されている情報をご参照下さい。
・	Oracle GoldenGate 23ai for Oracle 簡易インストール
<https://qiita.com/TDM26587/items/64efd8f124fe745dd5f5>
(デプロイメント作成後の管理サービス・ホーム画面)

![Q10-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470713/a91a2920-033c-d81b-9f4a-97ac6de6b243.png)

## Source および Target Database の準備
今回はVector データ型の連携のため、Source および Target Database には 23ai を使用します。２つのCDBを準備して、それぞれで稼働するPDBを連携させます。

![Q10-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470713/6fabd773-bf3e-1dc1-fd3c-a6b2aa03ee3c.png)

<https://docs.oracle.com/en/middleware/goldengate/core/23/coredoc/prepare-database-user-and-privileges-oracle.html#GUID-09A64B84-23C6-4EDD-ABC0-D82ED62068BA>

* Source Database (CDB)
Archive Log モードでの運用
最小の Database サプリメンタル・ロギング設定
強制ロギングモード
(必要に応じて)STREAMS_POOL_SIZE の確保
初期化パラメータ ENABLE_GOLDENGATE_REPLICATION を TRUEに
    ~~~
    SQL> ALTER SYSTEM set ENABLE_GOLDENGATE_REPLICATION = true scope=both;
    ~~~

* Source Database (PDBTK) 
GoldenGate 管理ユーザの作成 (ggadmin) と権限付与
ロール：CONNECT, RESOURCE, OGG_CAPTURE (23ai～)
<br>

* Target Database (CDB)
初期化パラメータ ENABLE_GOLDENGATE_REPLICATION を TRUEに
    ~~~
    SQL> ALTER SYSTEM set ENABLE_GOLDENGATE_REPLICATION = true scope=both;
    ~~~
*	Target Database (PDBOS) 
GoldenGate 管理ユーザの作成 (ggadmin) と権限付与
ロール：CONNECT, RESOURCE, OGG_APPLY (23ai～)
<br>

* Source および Target Database (PDB) のスキーマ・オブジェクトの準備
Source PDB (PDBTK) と Target PDB (PDBOS)の両方で作成する
※ レプリケーションのテストはInsertで行うため、表は空で良い

    SCOTTスキーマ : 表: galaxies
    create table galaxies
    (
    id number,
    name varchar2(50),
    doc varchar2(500),
    embedding vector,
    constraint PK primary key(ID)
    );

## Extract および Replicat の作成と稼働
GoldenGate 23ai の管理サービスから Extract と Replicat を作成・稼働します。その際に Extract の対象となる Source PDBTKのスキーマ・オブジェクトに対するサプリメンタル・ロギング設定も行います。

(デプロイメント作成後の管理サービス・ホーム画面)
![Q10-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470713/a91a2920-033c-d81b-9f4a-97ac6de6b243.png)
* DB接続の作成 – Source PDBTK と Target PDBOS の接続を作成します

![Q10-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470713/396bfe15-4fc1-bcea-7b8d-4077813bc910.png)
DB接続+から
![Q10-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470713/f550ba2a-3875-228c-ede8-f90952f29ea3.png)
(入力項目)
資格証明別名 	: 分かり易いもの (PDBへの接続子と同じでも良い)
ユーザーID	: ggadmin@pdbtk および ggadmin@pdbos
パスワード		: (Source DBの) ggadmin ユーザの password を入力
※	ここで @以降の接続子は予め tnsnames.ora に設定したものを入力する
この時、Target PDBOSに接続し、GGADMINにチェックポイント表を作成しておきます。
<br>

* Target PDBOS にチェックポイント表を作成

![Q10-051.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470713/ac1198ea-8855-8d1e-3560-ecd067b99e5b.png)
![Q10-052.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470713/501cec1f-0ebe-b769-e35b-d6658d7098d2.png)
* オブジェクトレベルのサプリメンタル・ロギング設定
Source Database (PDBTK)に接続し、表単位でTRANDATA情報を追加します。スキーマ(SCOTT)単位で実行することで、将来作成される予定の表も含めオブジェクトレベルのサプリメンタル・ロギング設定をする事も可能です。

![Q10-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470713/4f51702c-9374-9c3b-3172-e4abf6907988.png)

* Extractの作成へ : ext01 統合Extractの作成

![Q10-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470713/59a31391-ae52-5b4d-4ee2-a3e3f7d891af.png)

![Q10-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470713/9048dbdf-f961-f357-8ca5-d4b85c6267c9.png)
【入力項目】
 **統合Extract**を選択
 プロセス名= “**ext01**”

![Q10-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470713/773bc977-186f-def7-e866-eb317cb41916.png)
【入力項目】
ソース資格証明=**OracleGoldenGate**を選択
別名=**DB接続の別名**(Source) 
Extract証跡=**aa** (２桁英字なら何でも可)
![Q10-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470713/b1c92732-1ece-6e82-bee9-959d5bf92f5b.png)
【入力項目】全てdefaultでOK
![Q10-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470713/7ea4fecb-f5e7-40cf-d66b-7fdea675936e.png)
【入力項目】パラメータ設定をして、稼働する (今回は “**Table scott.\***” を追記)
この時、Extract プロセスの作成と同時にSource Database (PDBTK)への登録もバックグラウンドで実施する事にします。(別途コマンドでも実行可能です)

![Q10-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470713/46483fc3-a5c6-f9ca-2ec0-5c36fc72cd45.png)
ext01 が稼働できた事を確認します。

* Replicat の作成へ : 非統合モードのパラレル適用構成として作成

![Q10-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470713/8a8e1d2a-4b9b-6c43-d7e2-34e78f696424.png)
![Q10-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470713/182b4756-6ec7-d52e-ebf2-b3c99115052a.png)
【入力項目】
**パラレルReplicat** と **非統合**を選択
プロセス名= “**rep01**”
![Q10-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470713/644b452c-ad32-98b3-e728-37c8b0055dbf.png)
【入力項目】
Replicatトレイル= **Extract証跡で指定したもの**(=aa)
ターゲットの資格証明=**OracleGoldenGate** を選択
別名=**DB接続の別名**(Target) 
チェックポイント表=ターゲットDB接続を作成した際に準備したもの (**“GGADMIN”.”REPCO_CHKPT”**)
![Q10-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470713/97de2aa2-bdb4-c421-efc0-342ad5799162.png)
【入力項目】全てdefaultでOK
![Q10-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470713/7bd36984-8d07-1ecf-af0d-07e4baf6face.png)
【入力項目】パラメータ設定をして、稼働する 
(今回は最後の行を "**MAP scott.\*, TARGET scott.\*;**" に変更した)

![Q10-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470713/0d41215a-d61f-86a4-c328-71f572516dc0.png)
rep01 が稼働できた事を確認します。
## Vector 型を持つ表 scott. galaxies のレプリケーション
Extract “ext01” と Replicat “rep01” が正常稼働の状態で Source PDBTKの scott. galaxies に対し DML (今回は insert 文)を実行し、Target PDBOSの確認をします。操作シンプルに1行の登録(insert)です。
* Source PDBTK で下記コマンドを発行する
~~~
SQL> insert into galaxies values 
(1, 'M31', 
'Messier 31 is a barred spiral galaxy in the Andromeda constellation which has a lot of barred spiral galaxies.', 
'[0,2,2,0,0]');
1行が作成されました。
SQL> commit;
~~~
* Target PDBOS でレプリケーション完了を確認
~~~
SQL> select * from galaxies;
        ID NAME
---------- --------------------------------------------------
DOC
--------------------------------------------------------------------
EMBEDDING
--------------------------------------------------------------------
         1 M31
Messier 31 is a barred spiral galaxy in the Andromeda constellation which has a lot of barred spiral galaxies.
[0,2.0E+000,2.0E+000,0,0]
~~~
VECTORデータ型を持つ表も、GoldenGate によるレプリケーションが可能であると確認できました。

## 最後に
ここでの内容は、セットアップの手順を含め、GoldenGate によるレプリケーションとしては非常にシンプルな内容になっています。唯一、Database も GoldenGate も最新の 23ai を使用し、かつ Database 23ai から実装された VECTORデータ型を含む表でレプリケーションを実施した事が新しいと言えます。
今後も持続的にAI(=RAG)への期待値が高まる事は容易に推測できます。その類似検索の精度を高めるためには、分散して存在している様々なデータ集約がカギとなるため、GoldenGateによるデータ・レプリケーションの必要性も高まる事が考えられると思います。