
2025年10月にリリースされたCData Sync V25.3 では、多くのお客様からご要望をいただいていた IBM Db2 for i(AS/400)向けの拡張型CDC(変更データキャプチャ)機能 が新たに追加されました。
長年にわたり企業の基幹システムとして稼働してきたAS/400 システムのデータを、リアルタイムかつ効率的にクラウドデータウェアハウスやデータレイクに連携できるようになったことで、レガシーシステムのデータ活用が飛躍的に進化します。
本記事では、DB2 for i の拡張型CDC 機能の特徴と利用手順について解説します。
拡張型CDC(Enhanced CDC)とは
拡張型CDC は、データベースの変更ログを常時監視し、ステージングエリアを活用することで、実行時の待機時間を大幅に削減する仕組みです。
従来のCDC 方式では、ジョブ実行時にログを読み取り、変更データを抽出していましたが、拡張型CDC ではバックグラウンドで常時ログを監視し、変更データを事前にステージングエリアに蓄積します。これにより、ジョブ実行時にはステージングエリアから高速にデータを取得できるため、レプリケーション処理が劇的に高速化されます。変更されたデータのみを効率的に取得するため、本番システムへの負荷を最小限に抑えながらデータ連携が可能です。
DB2 for i における拡張型CDC の仕組み
DB2 for i の拡張型CDC は、IBM i のジャーナル機能を活用してデータ変更を捕捉します。
IBM i のジャーナルレシーバに記録された変更履歴(INSERT、UPDATE、DELETE)を常時監視し、データの追加・更新・削除をリアルタイムでキャプチャします。Sync 内部で読み取り位置を保持しているため、数日間停止していた場合でも再開時に途中から取得を開始することができます。
利用手順
Step1. DB2 for iでのCDC設定
CData Sync で拡張型CDC を使用する前に、DB2 for i 側でジャーナリング(変更履歴の記録)を設定する必要があります。
1-1. ジャーナルレシーバとジャーナルの作成
ジャーナルは、データベースの変更を追跡する仕組みです。以下のコマンドを実行して、ジャーナルレシーバとジャーナルを作成します。
CL コマンドで実行する場合:
-- 1. ジャーナルレシーバを作成( にライブラリ、に任意のレシーバ名を入力)
CRTJRNRCV /
-- 2. ジャーナルを作成(、 にライブラリ、、 に任意のレシーバ名、ジャーナル名を入力)
CRTJRN / /
JDBC ツール(SQL Client 等)から実行する場合:
JDBC ツールから実行する場合は、CALL QSYS2.QCMDEXC('CLコマンド')の形式を使用します。
-- 1. ジャーナルレシーバを作成( にライブラリ、に任意のレシーバ名を入力)
CALL QSYS2.QCMDEXC('CRTJRNRCV /');
-- 2. ジャーナルを作成(、 にライブラリ、、 に任意のレシーバ名、ジャーナル名を入力)
CALL QSYS2.QCMDEXC('CRTJRN / /');
1-2. テーブルのジャーナリング有効化
CDC 対象のテーブルに対してジャーナリングを有効化します。IMAGES(*BOTH) を指定することで、変更前後のデータを記録します。
CL コマンドで実行する場合:
-- テーブル(ファイル)のジャーナリングを開始(、にライブラリ、に対象のテーブル(ファイル)名を入力。 に上記で作成したレシーバ名を入力)
STRJRNPF / / IMAGES(*BOTH)
JDBC ツール(SQL Client 等)から実行する場合:
-- テーブル(ファイル)のジャーナリングを開始(、にライブラリ、に対象のテーブル(ファイル)名を入力。 に上記で作成したレシーバ名を入力)
CALL QSYS2.QCMDEXC('STRJRNPF FILE(/) JRN(/) IMAGES(*BOTH)');
既にジャーナリングが開始されている場合の設定変更:
-- CLコマンド
CHGJRNOBJ OBJ((/ *FILE)) ATR(*IMAGES) IMAGES(*BOTH)
-- JDBCツールから実行
CALL QSYS2.QCMDEXC('CHGJRNOBJ OBJ((/ *FILE)) ATR(*IMAGES) IMAGES(*BOTH)');
1-3. ジャーナリング設定の確認
以下のSQL クエリで、ジャーナリングが正しく設定されているか確認できます。
-- ジャーナルレシーバの確認
SELECT * FROM QSYS2.JOURNAL_RECEIVER_INFO WHERE JOURNAL_RECEIVER_LIBRARY = '';
-- ジャーナルの確認
SELECT * FROM QSYS2.JOURNAL_INFO WHERE JOURNAL_LIBRARY = '';
-- ジャーナリングが有効なオブジェクトの確認
SELECT * FROM QSYS2.JOURNALED_OBJECTS WHERE JOURNAL_LIBRARY = '';
1-4. ユーザー権限の設定
CDC を使用するユーザーに、ジャーナル、ジャーナルレシーバ、スキーマへの適切な権限を付与します。
権限の確認:
-- にCData Sync より接続するユーザ名を入力
SELECT * FROM QSYS2.OBJECT_PRIVILEGES WHERE AUTHORIZATION_NAME = '';
権限の付与(CLコマンド):
GRTOBJAUT OBJ() OBJTYPE(*LIB) USER() AUT(*EXECUTE)
GRTOBJAUT OBJ(/*ALL) OBJTYPE(*JRNRCV) USER() AUT(*USE)
GRTOBJAUT OBJ(/) OBJTYPE(*JRN) USER() AUT(*USE *OBJEXIST)
GRTOBJAUT OBJ() OBJTYPE(*LIB) USER() AUT(*EXECUTE)
GRTOBJAUT OBJ(/*ALL) OBJTYPE(*FILE) USER() AUT(*USE)
権限の付与(JDBCツールから実行):
CALL QSYS2.QCMDEXC('GRTOBJAUT OBJ() OBJTYPE(*LIB) USER() AUT(*EXECUTE)');
CALL QSYS2.QCMDEXC('GRTOBJAUT OBJ(/*ALL) OBJTYPE(*JRNRCV) USER() AUT(*USE)');
CALL QSYS2.QCMDEXC('GRTOBJAUT OBJ(/) OBJTYPE(*JRN) USER() AUT(*USE *OBJEXIST)');
CALL QSYS2.QCMDEXC('GRTOBJAUT OBJ() OBJTYPE(*LIB) USER() AUT(*EXECUTE)');
CALL QSYS2.QCMDEXC('GRTOBJAUT OBJ(/*ALL) OBJTYPE(*FILE) USER() AUT(*USE)');
以上でDB2 for i 側でのCDC 設定は完了となります。参考として、TEST スキーマでジャーナルレシーバ(TEST2)とジャーナル(JRN2)を作成し、ORD01 テーブルのジャーナリングを有効化し、ユーザーTESTUSER に権限を付与する完全な設定例を以下に示します。
-- 1. ジャーナルレシーバを作成
CALL QSYS2.QCMDEXC('CRTJRNRCV TEST/TEST2');
-- 2. ジャーナルを作成
CALL QSYS2.QCMDEXC('CRTJRN TEST/JRN2 TEST/TEST2');
-- 3. ORD01テーブルのジャーナリングを開始
CALL QSYS2.QCMDEXC('STRJRNPF FILE(TEST/ORD01) JRN(TEST/JRN2) IMAGES(*BOTH)');
-- 4. ユーザーTESTUSERにライブラリへの実行権限を付与
CALL QSYS2.QCMDEXC('GRTOBJAUT OBJ(TEST) OBJTYPE(*LIB) USER(TESTUSER) AUT(*EXECUTE)');
-- 5. ユーザーTESTUSERにジャーナルレシーバへの使用権限を付与
CALL QSYS2.QCMDEXC('GRTOBJAUT OBJ(TEST/*ALL) OBJTYPE(*JRNRCV) USER(TESTUSER) AUT(*USE)');
-- 6. ユーザーTESTUSERにジャーナルへの使用権限を付与
CALL QSYS2.QCMDEXC('GRTOBJAUT OBJ(TEST/JRN2) OBJTYPE(*JRN) USER(TESTUSER) AUT(*USE *OBJEXIST)');
-- 7. ユーザーTESTUSERにライブラリへの実行権限を付与
CALL QSYS2.QCMDEXC('GRTOBJAUT OBJ(TEST) OBJTYPE(*LIB) USER(TESTUSER) AUT(*EXECUTE)');
-- 8. ユーザーTESTUSERにファイルへの使用権限を付与
CALL QSYS2.QCMDEXC('GRTOBJAUT OBJ(TEST/*ALL) OBJTYPE(*FILE) USER(TESTUSER) AUT(*USE)');
Step 2: DB2 for i コネクタの追加と接続の作成
CData Syncダッシュボードから接続ページを開き、接続を追加をクリックしてコネクタを選択ページを開きます。データソースタブをからDB2 for i (Native) を選択します。

新しい接続ページで、以下の情報を入力し、保存およびテストを実行します。
Connection Name: 任意の接続名を入力
Server: DB2 for i サーバーのアドレスまたはホスト名
Database: DB2 for i データベースの名前
Port: サーバーのポート番号(デフォルト:446)
User: DB2 for i データベースへの認証に使用するユーザー名
Password: DB2 for i データベースへの認証に使用するパスワード
Schema: DB2 for i で使用するスキーマ

以上でDB2 への接続が作成されました。
Step3. 拡張型CDC ジョブの作成と実行
CData Sync ダッシュボードからジョブページを開き、ジョブを追加を選択します。以下の情報を入力し、ジョブを追加します。

次にタスクタブからタスクを追加を選択し、連携対象となるテーブルを選択します。今回は次のようなテーブルを予めDB2 上に作成し、このテーブルを選択します。
-- テーブル作成
CREATE TABLE TEST.ORD01 (
ORDER_ID INT NOT NULL PRIMARY KEY,
CUST_ID INT NOT NULL,
ORDER_DATE TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
TOTAL_AMT DECIMAL(12, 2),
STATUS CHAR(1) DEFAULT 'N'
);
-- データ作成
INSERT INTO TEST.ORD01 (ORDER_ID, CUST_ID, ORDER_DATE, TOTAL_AMT, STATUS)
VALUES (1, 101, CURRENT_TIMESTAMP, 15000.50, 'N');

タスク追加後、画面右上の実行を押すことで同期先にテーブルデータが連携されます。

同期先(Snowflake) を確認すると正常に連携されることを確認できます。(※_cdatasync_deleted カラムはCData Sync が作成する論理削除のカラム)

次にDB2 側のテーブルに次のように新たなデータを加えます。
INSERT INTO TEST.ORD01 (ORDER_ID, CUST_ID, TOTAL_AMT)
VALUES (2, 102, 25000.00);
その後再度ジョブを実行すると差分の1件のみ連携され、同期先側にも反映されることを確認できます。

さらにDB2 側のテーブルに次のようにデータを削除した後にジョブを実行します。
DELETE FROM TEST.ORD01 WHERE ORDER_ID = 2;
すると同期先側にも該当のレコードの論理削除カラムがTRUE となり削除レコードの検知もできていることがわかります。なおジョブの高度な設定 -> 削除の挙動にてHardDelete と設定することで物理削除として連携することも可能になっています。

まとめ
CData Sync V25.3 の拡張型CDC 対応により、DB2 for i(AS/400)のデータ活用が大きく前進しました。CData Sync は30日間の無償トライアルが可能ですので、ぜひお試しください!
https://jp.cdata.com/sync/trial