※ 本記事は、Loren Pentonによる”Oracle GoldenGate: Oracle to MySQL Precise Instantiation“を翻訳したものです。

2025年9月25日


多くの組織では、Oracleデータベースはヘルスケア患者管理、請求、顧客プロファイルなどの重要なシステムを強化し、MySQLはeコマース、コンテンツ管理、Webベースまたはヘルスケア・アプリケーションを推進します。2つをブリッジすることは、多くの場合、データだけでなくライブ・トランザクションも正確に移動することを意味します。

そこで登場するのがOracle GoldenGateです。

OracleとMySQLの間のレプリケーションの設定は、インスタンス化から始まり、リアルタイム同期の準備中に、MySQLを初期化するためのOracleデータの一貫したスナップショットを取得します。

ヘルスケア情報の複製、地域間のeコマース・データの同期、レガシー・アプリケーションの移行など、インスタンス化は最初の重要なステップです。

この記事では、アプリケーションまたはデータベースの停止を行わずに異種間(OracleからMySQL Database)のレプリケーション実装を作成するためのOracleの正確なインスタンス化方法を説明します。

Oracle to MySQL Database Initial Load
イメージ 1. OracleからMySQL Databaseへのインスタンス化

前提条件

インスタンス化プロセスを開始する前に、ソースおよびターゲットのOracle GoldenGate Hubs (OGGハブ)およびソースとターゲットのデータベース環境を構成してレプリケーションを有効にする必要があります。これらのステップを実行しないと、多くの場合、設定の失敗、一貫性のないデータ、またはサポートされていない構成エラーが発生します。

  • Oracleの表のMySQLへの変換 : Oracle GoldenGateには、データベース変換ツールはありません。Oracleの表、ビュー、ストアド・プロシージャおよびファンクションをMySQLに変換するには、このタスクを実行するユーティリティを選択する必要があります。
  • ターゲットOGGハブへのOpenSSLのインストール: Oracle GoldenGate 23ai for MySQLでは、デプロイメントを作成する前に、Oracle GoldenGateサーバーにOpenSSL 1.1が存在する必要があります。詳細は、Oracle GoldenGateのドキュメントを参照してください。
  • GoldenGateインストール: OracleおよびMySQL用のOracle GoldenGate 23ai (Microservices Architecture)の最新パッチ・リリースをインストールします。ソフトウェアのインストールとパッチ適用の詳細は、Oracle GoldenGateのドキュメントを参照してください。
  • OracleおよびMySQL GoldenGateのデプロイメントの作成: ソースおよびターゲットのOracle GoldenGateデプロイメントを作成します。詳細は、Oracle GoldenGateのドキュメントを参照してください。
  • データベース・バージョン: ソース(Oracle)およびターゲット(MySQL)データベースがパッチ・リリースの最新であることを確認します。
  • データベース構成:

インスタンス化前のステップ

レプリケーション用にOracle GoldenGateを設定する場合、表のメタデータを理解する時間を取ることは、単に良い方法ではなく、パフォーマンスと信頼性を確保するために不可欠です。

Oracle GoldenGateの初期ロードExtractプロセスはシングル・スレッドで、各表からのフェッチを実行します(アルファベット順に処理されます)。このアプローチは単純ですが、表が大きい環境や表数が多い環境では非効率です。すべての行が選択され、ダウンストリームがターゲットにストリーミングされるため、適切な準備をしなくてもすぐに時間がかかる可能性があります。

これを最適化するには、次のことが重要です:

  • レプリケートされる各ソース表の行数およびサイズの取得: 移動する必要があるデータの量を知ることは、インスタンス化に必要な時間とリソースの見積りに役立ちます。
  • ターゲット表のキー制約の確認: 主キー、一意制約および外部キーは、Oracle GoldenGateによる変更を正確かつ効率的にレプリケートする機能に影響します。
    • キーのない表では、変更データ・レプリケーションに特別な処理が必要になる場合があります。
    • データ適用エラーを防ぐために、インスタンス化のために外部キーを無効にする必要があります。
  • ソース側(Oracle)データベースのUNDO表領域およびUNDO_RETENTION設定を確認します。
    • Oracleのデフォルト設定はUNDO_MANAGEMENT AUTOであるため、データベースはUNDO表領域を最適化します。
    • Oracleのデフォルト設定は、UNDO_RETENTION 900 (秒)です。
    • UNDO表領域にUNDO_RETENTION期間を遵守するための十分な領域がない場合、Oracleは期限切れでないUNDO領域を再利用することがあります。これにより、古いUNDO情報を必要とする問合せで「snapshot too old (スナップショットが古すぎます)」エラーが発生し、初期ロードExtractが異常終了する可能性があります。
    • 十分なUNDO_RETENTION表領域またはUNDO表領域(あるいはその両方)を割り当てることができない場合は、正確なインスタンス化を使用できません。

このメタデータを事前に理解することで、情報に基づいた意思決定を行い、潜在的なボトルネックを特定し、環境の規模と複雑さに合わせてインスタンス化戦略を調整できます。

この概要を生成するために、次に示すSQL問合せを使用して、ソース表のサイズを取得します。

— Gather fresh statistics for the source schema
EXEC DBMS_STATS.GATHER_SCHEMA_STATS(‘[schema]’);

— Now print table size and row counts
COLUMN TABLE_NAME FORMAT a25
COLUMN NUM_ROWS FORMAT 9999999999
COLUMN SIZE_MB FORMAT 9,999,999.999

SELECT
    t.table_name,
    s.num_rows,
    ROUND(SUM(d.bytes) / 1024 / 1024, 2) AS size_mb
FROM
    all_tables t
JOIN
    all_tab_statistics s ON t.owner = s.owner AND t.table_name = s.table_name
JOIN
    dba_segments d ON t.owner = d.owner AND t.table_name = d.segment_name
WHERE
    t.owner = UPPER(‘[schema]’)
    AND d.segment_type = ‘TABLE’
GROUP BY
    t.table_name, s.num_rows
ORDER BY
    size_mb DESC;
Source Table Size
イメージ 2. ソース表サイズ

ターゲット表の制約をリストするには、次のMySQL問合せを使用します:

SELECT
    table_name,
    constraint_name,
    constraint_type
FROM
    information_schema.TABLE_CONSTRAINTS
WHERE
    constraint_schema = ‘[schema]’;
Target table constraints
イメージ 3. ターゲット表の制約

GoldenGate for Oracleのソース側のインスタンス化ステップ

この項では、レプリケーション設定のソース側で必要なすべてのステップを完了します。

Trandataの追加

ソースOracleデータベース接続の作成後、最初のステップは、ADD TRANDATA (表ごと)またはADD SCHEMATRANDATA (スキーマ内のすべての表用)を使用してサプリメンタル・ロギングを有効にすることです。

  • 推奨されるベスト・プラクティスはADD SCHEMATRANDATAです。

異機種ターゲット(OracleからMySQLなど)にレプリケートする場合、主キー列または一意キー列を変更しない更新の場合でも、Oracle GoldenGateによってすべての列レベルの変更が確実に取得されるため、すべての列のTRANDATAを有効にすることをお薦めします。これにより、レプリケーションの精度が向上します。

Add Trandata
イメージ 4. ソースTrandata

プライマリ変更データ取得(CDC)抽出の作成

統合Extractを作成し、登録SCNを記録します。このデモンストレーションで使用する統合Extractパラメータを次に示します:

EXTRACT IECC
USERIDALIAS dc1west DOMAIN OracleGoldenGate
EXTTRAIL ec

— Every 60 minutes, report the count of
— records processed since Extract start to
— the process report file.
— Rate reports the number of operations
— per second.
— The report file also contains DELTA
— throughput which is the number of records
— since the last report divided by the time
— since the last report.
REPORTCOUNT EVERY 60 MINUTES, RATE

— Extract generates a warning message to
— report file for long running transactions
— In this case any transaction which is open
— more than 1 hour.
— CHECKINTERVAL is the frequency at which
— Oracle GoldenGate checks for long
— transactions.
WARNLONGTRANS 1H, CHECKINTERVAL 10M

— Capture  changes for all tables in the
— TPCC schema.
TABLE PDB_WEST.TPCC.*;

レプリケーションの設定時に正確で一貫性のあるインスタンス化ポイントを確保するには、登録SCNの取得が重要です。開始SCNまたは登録済SCNを検索するには、次の問合せをソースOracle Databaseで実行し、戻り値をノートにとります。

COLUMN CAPTURE_NAME FORMAT a25
COLUMN START_SCN FORMAT 9999999999
SELECT capture_name, start_scn
FROM dba_capture
WHERE capture_name = ‘OGG$CAP_[CDC EXTRACT NAME]’;
Integrated Extract start SCN
イメージ 5. 統合Extract開始SCN

Oracle GoldenGateを使用して一貫性のある信頼性の高い初期ロードを実現するには、Extractを開始できる有効なSCN (システム変更番号)を識別することが重要です。このSCNは、ソースOracleデータベースにオープン・トランザクションが存在しないことを確認した後に記録する必要があります。

なぜでしょうか? CDC (チェンジ・データ・キャプチャ) Extractでは、登録後に開始するトランザクションのみが追跡されるためです。登録前に開始されたオープン・トランザクションは、後でコミットしても取得されず、潜在的なデータ損失につながります。

次の問合せを使用して、Extractの登録後にソース・データベースのすべてのオープン・トランザクションをリストします:

set linesize 150
set wrap off
COLUMN SQL_TEXT FORMAT a30
COLUMN TSTATUS FORMAT a7
COLUMN USERNAME FORMAT a15
COLUMN OSUSER FORMAT a15
COLUMN SID FORMAT 9999
COLUMN SERIAL# FORMAT 999999
SELECT
    T.START_SCN,
    T.STATUS AS TSTATUS,
    TO_CHAR(T.START_DATE, ‘MM/DD/YY HH24:MI:SS’) AS START_TIME,
    S.SID,
    S.SERIAL#,
    S.INST_ID,
    S.USERNAME,
    S.OSUSER,
    S.STATUS AS SSTATUS,
    TO_CHAR(S.LOGON_TIME, ‘MM/DD/YY HH24:MI:SS’) AS LOGON_TIME,
    S.SQL_ID,
    Q.SQL_TEXT
FROM
    gv$transaction T
JOIN
    gv$session S ON T.ses_addr = S.saddr AND T.inst_id = S.inst_id
LEFT JOIN
    gv$sql Q ON S.SQL_ID = Q.SQL_ID AND S.inst_id = Q.inst_id
UNION ALL
— Fallback row when there are no open transactions
SELECT
    D.CURRENT_SCN,
    ‘CURRENT’,
    TO_CHAR(CURRENT_DATE, ‘MM/DD/YY HH24:MI:SS’) AS START_TIME,
    NULL, NULL, NULL,
    ‘SYS’, NULL, NULL,
    TO_CHAR(CURRENT_DATE, ‘MM/DD/YY HH24:MI:SS’) AS LOGON_TIME,
    NULL, NULL
FROM
    v$database D
ORDER BY 1;
Current open transactions
イメージ 6. 現在の処理中のトランザクション

問合せを実行してオープン・トランザクションをチェックした後、各トランザクションのSTART_SCNをCDC Extractの登録SCNと比較します。この場合、ExtractはSCN 17658088で登録されました。

すべてのアクティブなトランザクションのSTART_SCN > 17658088であるため、最新のデータベースSCN値を初期ロードExtractの開始SCNとして選択することは安全です。これにより、初期ロードと統合Extractの間でデータが失われなくなります。

START_SCN < 17658088のオープン・トランザクションが出力に表示されている場合は、次の2つのオプションがあります:

  • これらのトランザクションが完了するまで待機します(問合せから消えます)。
  • 不要なセッションまたは長時間実行されているセッションを特定して終了します。
Current SCN
イメージ 7. 現在のSCN

初期ロード抽出の作成

TABLEパラメータにSQLPREDICATEオプションを使用し、前述のステップで選択したSCNを指定して、初期ロードExtractを作成します。

EXTRACT ILTPCC
USERIDALIAS dc1west DOMAIN OracleGoldenGate
EXTFILE ic, MEGABYTES 2000, PURGE

— Every 60 seconds, report the count of
— records processed since Extract start to
— the process report file.
— Rate reports the number of operations
— per second.
— The report file also contains DELTA
— throughput which is the number of records
— since the last report divided by the time
— since the last report.
REPORTCOUNT EVERY 60 SECONDS, RATE

TABLE PDB_WEST.TPCC.*, SQLPREDICATE “AS OF SCN 18104068”;

大きな表の考慮事項

行数が多い大規模な表では、初期ロードExtractをパラレル化してパフォーマンスを向上させ、全体的なロード時間を短縮することをお薦めします。これは、異なる表またはスキーマを個別の初期ロードExtractに割り当てることで実現できます。

単一の大きな表を扱う場合、@RANGE関数を使用して表を複数のExtractに分割し、表の様々なセグメントのパラレル処理を有効にすることで、効率をさらに向上させることができます:

TABLE [pdb].[schema].[table name] , FILTER (@RANGE ([n], [n])), SQLPREDICATE “AS OF SCN scn”;

@RANGEファンクションの詳細は、GoldenGate 23aiパラメータおよびファンクション・リファレンス・ガイドを参照してください。

Extractの起動

初期ロードExtractを起動します。すべての表からのすべてのデータの読取りが完了すると、自動的に停止します。

統合Extractを起動するには、「Start with Options」を選択します。

Start Integrated Extract with options
イメージ 8. 統合Extractはオプションから開始

開始オプションとして「After CSN」を選択し、初期ロード抽出のAS OF SCN設定で使用されるSCNを入力します。

Start after CSN
イメージ 9. 統合Extractの開始SCNの設定

分散パスの作成

ソースOracle GoldenGateサーバーからターゲットOracle GoldenGateサーバーへの2つの分散パスを作成して起動します。これは、Oracle GoldenGateのドキュメントで指定されており、1つはインスタンス化証跡データ用、もう1つはCDC証跡データ用です。

初期ロードReplicatの作成

続行する前に、Oracle GoldenGateが初期ロード証跡データをどのように処理するか、およびそれがダウンストリーム処理にどのように影響するかを理解することが重要です。

初期ロードExtractは、ソース表から直接データを読み取ります。つまり、トランザクション・メタデータ(BEGIN/COMMITレコードなど)は初期ロード証跡ファイルに書き込まれません。

Oracle GoldenGateでは、専用の初期ロードReplicatは使用されません。かわりに、CDCReplicatは、初期ロード中に取得されたデータの適用を担当します。

CDC Replicatは、操作をトランザクションにグループ化するために証跡ファイルのトランザクション境界に依存するため、Oracle GoldenGateは初期ロード・データの合成(偽)トランザクションIDを生成します。このIDは、証跡ファイルの順序番号、相対バイト・アドレス(RBA)、証跡の最初のレコードのタイムスタンプから導出されます。

合成トランザクションは、次のいずれかの条件で完了したとみなされます:

  • 処理中の各証跡でファイルの終わり(EOF)に達したか、または
  • Replicatによって読み取られたレコードの数は、MAXTRANSOPSパラメータによって設定された値に達します(デフォルト: 10,000,000レコード)

初期ロード・データ全体が1つの大きなトランザクションとして扱われる可能性があるため、特にパラレルReplicatを使用する場合は、Replicat構成を調整することが重要です。適切にチューニングされていない場合:

  • Replicatがハングしているか停止している可能性があります。
  • 統計は報告されず、また、
  • 合成トランザクションがコミットされるまで、チェックポイントは記録されません。

これらの問題を回避するために、パラレルReplicatでSPLIT_TRANS_RECSの設定を有効にします。パラレルReplicatを使用していない場合は、MAXTRANSOPS設定を確認して調整します。

  • MAXTRANSOPSでは、トランザクション当たりのレコード数に対する強い制限を定義します。
  • SPLIT_TRANS_RECSはパラレルReplicatに固有で、大規模なトランザクションを小規模な同時チャンクに分割するために使用され、チェックポイントおよびパフォーマンスが向上します。
REPLICAT ilcc
USERIDALIAS ggadmin_tpcc DOMAIN OracleGoldenGate

— Set minimum number of Appliers to 1 and
— spawn up to 6 to improve initial load
— performance.
— When everything has been applied, only 1 — Applier will be running, signalling
— initial load is complete.
MIN_APPLY_PARALLELISM 1
MAX_APPLY_PARALLELISM 6

— Every 60 seconds, report the count of
— records processed since Replicat starts
— to the process report file.
— Rate reports the number of operations per
— second.
— The report file also contains DELTA
— throughput which is the number of records
— since the last report divided by the time
— since the last report.
REPORTCOUNT EVERY 60 SECONDS, RATE

— Large transactions should be broken into
— pieces of specified size and applied
— concurrently.
SPLIT_TRANS_RECS 10000
MAP PDB_WEST.TPCC.*, TARGET tpcc.*;

Replicatを起動します。初期ロード・データの適用が完了すると、Replicatは停止しません。インスタンス化が完了したかどうかを判断する方法はいくつかあります。

Replicatチェックポイントと証跡ファイル・サイズのチェック

GoldenGateハブ・サーバーで、初期ロードに使用される証跡ファイルをリストし、最後の証跡順序番号とサイズをReplicatのチェックポイント順序番号およびRBA (Web UI)と比較します。

ExtractおよびReplicat統計の比較

初期ロードExtractレポートをレビューして、表ごとにフェッチされた行数を確認します。次に、Replicat統計をチェックして、同じ行数を確認します。照合番号は、初期ロードが正常に完了したことを示します。

初期ロードExtractおよびReplicatによってレポートされたレコード数が一致する場合、インスタンス化が完了します。初期ロードReplicatを停止します。

CDC Replicatの作成

インスタンス化が完了したら、CDC (チェンジ・データ・キャプチャ) Replicatを作成して起動し、キューに入れられた変更とリアルタイムの変更の両方を適用します。

REPLICAT PRCC
USERIDALIAS ggadmin_tpcc DOMAIN OracleGoldenGate

— Every 60 minutes, report the count of
— records processed since Replicat starts
— to the process report file.
— Rate reports the number of operations per second.
— The report file also contains DELTA
— throughput which is the number of records
— since the last report divided by the time
— since the last report.
REPORTCOUNT EVERY 60 MINUTES, RATE

— Large transactions should be broken into
— pieces of specified size and applied
— concurrently.
SPLIT_TRANS_RECS 10000

MAP PDB_WEST.TPCC.*, target tpcc.*;

インスタンス化後のクリーンアップ

インスタンス化後のOracle GoldenGateインストールをクリーン・アップするには、次のことをお薦めします:

  • インスタンス化データの適用に使用するReplicatを削除します。
  • インスタンス化データの送信に使用される分散パスを停止および削除します。
  • 初期ロードExtractを削除します。
  • Oracle GoldenGate証跡の消費時にディスク領域が解放されるように、各Oracle GoldenGateインスタンスの管理サービスWebUIで証跡パージ・タスクを作成します。

まとめ

この記事では、Oracle GoldenGateを使用してソースOracleデータベースからMySQLターゲット・データベースの正確なインスタンス化を実行する詳細なステップを示します。Oracle GoldenGateの機能についてさらに学習するには、次を参照してください: