Oracle Database のLogMiner 機能を使ってRedshift にCDC(変更データキャプチャ)レプリケーション:CData Sync

by 大川智久 | 2023年03月31日

最新版のCData Sync では、Oracle OCI データソースでOracle LogMiner を使用したCDC (Change Data Capture、変更データキャプチャ) 機能を使った差分更新を行うことができます。この機能について解説します。

Oracle LogMiner によるCDC (変更データキャプチャ) について

概要

CData Syncでは従来より、前回同期時以降のデータのみを同期する機能(差分更新機能)を提供しています。これは、データソース側のバージョンカラムや更新日時カラムを利用して、前回同期時以降に更新された行を抽出することで実現しています。しかし、この方法では行の削除を検出することはできません。

Oracle LogMiner によるCDC では、Oracle Database のREDO ログ・アーカイブログから、前回同期時以降の更新情報をより直接的に取得します。これにより、行の削除情報も取得できるほか、データソースのテーブルへのアクセスは必要としないため、データベースへの負荷を最小限にとどめながら差分情報を取得することができます。

CData Sync で必要とする差分情報を取得するため、Supplemental Logging (補助ロギング) 機能を有効にする必要があります。CData Sync はこの補助ログとOracle LogMiner のログ分析機能を使って差分更新を実現します。

接続可能なOracle Database のバージョンおよび構成

弊社Sync でOracle Database をデータソースとして使用する場合、接続可能なOracle Database のバージョンは12c 以降となります。これは、Oracle Database への接続にOCI ライブラリの21c を使用していることによるものです。

また、LogMiner によるCDC レプリケーションについては現時点では非CDB 構成のデータベースのみでお使いいただけますが、CDB 構成のデータベースについても近日中にサポートされる予定です。

CDC レプリケーション可能なオブジェクト

弊社Sync のCDC ジョブについてはテーブルのみがタスク(同期するオブジェクト)の対象となります。ビューやマテリアライズドビューを同期の対象としたい場合は、別途非CDC ジョブを作成してそちらにタスクを追加可能です。

CDC レプリケーションの対象操作

LogMiner によるCDC レプリケーションで差分検出される操作はINSERT, UPDATE, DELETE の3種類です。その他の操作 (DDL 操作など) は対象となりません。

CDC レプリケーションに必要なデータベースの設定

CDC レプリケーションジョブを作成するために必要なデータベースの設定は以下の通りです。

  • アーカイブログモードが有効となっていること
  • データベースレベル、もしくはテーブルレベルのサプリメンタル・ロギングが有効となっていること

CDC レプリケーションに必要なユーザの権限

接続に使用するユーザに必要な権限については、通常のレプリケーションに必要な権限 (CREATE SESSION 等) に加えて、CDC レプリケーション用に以下の権限が必要です。

  • SELECT ON SYS.V_$DATABASE
  • SELECT ON SYS.V_$ARCHIVED_LOG
  • SELECT ON DBA_LOG_GROUPS
  • SELECT ON SYS.V_$LOG
  • SELECT ON SYS.V_$LOGFILE
  • EXECUTE ON SYS.DBMS_LOGMNR
  • LOGMINING ロール

CDC による差分更新の手順

Oracle LogMiner によるCDC のために必要な設定を行い、CData Sync で実際に差分同期機能を実行してみます。同期先にはSQL Server、MySQL、PostgreSQL といったRDBMS や、Snowflake、Google BigQuery、Amazon Redshift といったクラウド上のサービスを使用できます。今回はAmazon Redshift を同期先として使用してみます。

CData Sync のダウンロードとインストール

CData Syncは30日間機能無制限で試用可能です。以下のリンクの「無償トライアルへ」ボタンからダウンロード・インストールしてください。

自動データレプリケーション | CData Software Japan

Oracle LogMiner の設定

Oracle LogMinerの設定を行います。CData Syncのヘルプにも記載がありますので参考にしてください。

まずアーカイブログモードおよび補助ログの設定状態を確認します。

SQL> SELECT LOG_MODE, SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;

LOG_MODE     SUPPLEME
------------ --------
NOARCHIVELOG NO

上記の場合はアーカイブログモードおよび補助ログともに無効になっていますので、それぞれ設定します。

まず、次のようにアーカイブログモードを有効にします。アーカイブログモードの設定には、アーカイブログファイルの出力先などの設定が必要になりますので、詳しくはOracle Database のマニュアル等を参考にして設定してください。また、アーカイブログモードにするとトランザクションログがアーカイブログファイルに出力されるようになりますので、ファイルの定期的な整理の運用が必要となりますので留意してください。

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
SQL> alter database archivelog;

Database altered.

SQL> alter database open;

Database altered.

続いて補助ログの設定を有効にします。

SQL> alter database add supplemental log data;

Database altered.

ここまでがデータベースに対して必要な設定となります。

次に、CDC を使って同期をするテーブルに対して補助ログの設定を行います。まずはテーブルの補助ログの設定を以下のように確認します。以下のように「ALL COLUMN LOGGING」とならない場合は設定が必要です。

SQL> SELECT LOG_GROUP_TYPE FROM dba_log_groups WHERE OWNER = 'TESTUSER' AND TABLE_NAME = 'CDCTABLE';

LOG_GROUP_TYPE
-------------------
ALL COLUMN LOGGING

次のように設定します。

SQL> ALTER TABLE TESTUSER.CDCTABLE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

ここまででOracle LogMiner の設定は完了です。

なお、接続に使用するユーザに対してOracle LogMiner を使うための権限が必要です。以下のように付与しておきます。

SQL> grant select on sys.v_$database to testuser;
SQL> grant select on sys.v_$archived_log to testuser;
SQL> grant select on sys.dba_log_groups to testuser;
SQL> grant select on sys.v_$log to testuser;
SQL> grant select on sys.v_$logfile to testuser;
SQL> grant execute on dbms_logmnr To testuser;
SQL> grant LOGMINING to testuser;

これでOracle Database 側の設定は完了です。

接続作成

まずはCData Sync の管理画面からデータソースおよび同期先の接続を作成します。

まずは「接続」タブからOracle データソースを作成します。「データソース」の「Oracle」アイコンをクリックします。

このアイコンが無い場合は、「+Add More」ボタンからOracle コネクタを追加してください。Oracle コネクタはOCI ライブラリを含むため、ダウンロードに時間がかかります、ご了承ください。また、コネクタを追加後は、以下の手順でOCI ライブラリの場所を指定いただく必要があります。ご不明な点は、弊社テクニカルサポートへお気軽にお問い合わせください。

  • Sync をWindows 上でご利用の場合
    • システム環境変数のPATH に「C:\ProgramData\CData\sync\libs\oracleoci\x64」を追加し、Sync を再起動してください
  • Sync をLinux 上でご利用の場合
    • 環境変数に「LD_LIBRARY_PATH=/opt/sync/libs/oracleoci/x64」を追加し、Sync を再起動してください

以下のように必要項目を入力し「保存およびテスト」ボタンで「正常に更新されました」と表示されることを確認します。

おなじように同期先のRedshift 接続も作成します。

ジョブ作成

データソースおよび同期先の接続を作成したら、同期ジョブを作成します。

「ジョブ」タブで「+ジョブを作成」ボタンをクリックします。

任意のジョブ名を設定し、データソース・同期先に先ほど作成した接続を設定します。また、「レプリケーションの種類」を「変更データキャプチャ」に設定して「作成」ボタンをクリックします。

タスク作成

ジョブを作成したら、タスクを作成します。

「ジョブ設定」にある「+タスクを追加」ボタンをクリックします。

同期したいテーブルにチェックを入れ、「追加」をクリックします。

実行

タスクを作成したら、実行してみます。実行したいタスクにチェックを入れ、「実行」ボタンをクリックします。

今回は同期元のテスト用テーブルに10レコードある状態で実行しました。以下のように、「Records affected: 10」と表示され、10レコードが同期されたことが確認できます。

このあと、もう一度タスクを実行してみると、前回同期から変更が無いため、「Records affected: 0」と表示されます。

それでは、同期元のテーブルから1レコードを削除、1レコードを追加し、再度実行してみます。すると、以下のように「Records affected: 2」と表示されました。

同期先のテーブルを確認してみると、削除されたレコードは「_cdatasync_deleted」カラムが「true」となり、また追加したレコードが追加されていました。

おわりに

今回はCData Sync V22 の新機能としてOracle Database のLogMiner によるCDC 機能について紹介しました。 是非この機会に新しいCData Sync をお試しください。

関連コンテンツ

トライアル・お問い合わせ

30日間無償トライアルで、CData のリアルタイムデータ連携をフルにお試しいただけます。記事や製品についてのご質問があればお気軽にお問い合わせください。