Oracle GoldenGate

Oracle GoldenGate 包括的ガイド

1. はじめに

1.1 Oracle GoldenGate とは

Oracle GoldenGate(以下OGG)は、異種混合のIT環境においてリアルタイムのデータ統合・レプリケーションを実現するソフトウェア製品である。Oracle社が提供するこのミドルウェアは、トランザクションログベースの変更データキャプチャ(CDC: Change Data Capture)技術を核として、ソースデータベースのトランザクションログからデータ変更を抽出し、ターゲットシステムにほぼリアルタイムで適用する。

OGGの最大の特徴は、ソースデータベースへの影響を最小限に抑えながら、高速かつ信頼性の高いデータレプリケーションを実現できる点にある。従来のトリガーベースやスナップショットベースのレプリケーション方式と比較して、トランザクションログベースのアプローチは以下の点で優れている。

  • 低オーバーヘッド: ソースデータベースに追加のトリガーやテーブルを作成する必要がなく、本番環境への影響が極めて小さい
  • リアルタイム性: トランザクションがコミットされた直後に変更データをキャプチャし、ターゲットに伝播できる
  • データ整合性: トランザクション単位でのレプリケーションを保証し、ソースとターゲット間のデータ一貫性を維持する
  • 異種環境対応: Oracle Database だけでなく、SQL Server、MySQL、PostgreSQL、DB2、Teradata、Amazon RDS、BigQuery など多様なデータベースプラットフォームをサポートする

1.2 主なユースケース

Oracle GoldenGate は以下のような多様なユースケースに対応する。

データレプリケーションと高可用性(HA)

プライマリデータベースからスタンバイデータベースへのリアルタイムレプリケーションにより、災害復旧(DR)環境を構築する。Oracle Data Guard と異なり、異種データベース間でもレプリケーションが可能であり、より柔軟なHA/DR構成を実現できる。

ゼロダウンタイムマイグレーション

データベースのバージョンアップグレードやプラットフォーム移行(例:オンプレミスからクラウドへの移行)時に、OGGを使用してソースとターゲットを同期させながら、計画的なカットオーバーによりダウンタイムを最小化する。

リアルタイムデータウェアハウス・ETL

OLTPシステムからデータウェアハウスやデータレイクへのリアルタイムデータフィードを実現する。従来のバッチETLと異なり、ほぼリアルタイムでの分析が可能になる。

双方向レプリケーション(Active-Active)

複数のデータセンターで同一データを更新可能なActive-Active構成を実現する。地理的に分散したアプリケーションにおいて、各拠点でローカルな読み書きを可能にする。

データ配信とイベント駆動アーキテクチャ

データベースの変更イベントを Apache Kafka、JMS、Amazon Kinesis などのメッセージングシステムに配信し、マイクロサービスアーキテクチャにおけるイベント駆動型のデータパイプラインを構築する。

1.3 Oracle GoldenGate のバージョンと歴史

Oracle GoldenGate は元々 GoldenGate Software 社が開発した製品であり、2009年にOracle社が買収した。以下に主要なバージョンの変遷を示す。

バージョンリリース年主な特徴
GoldenGate 9.x~2009年Oracle買収前のバージョン
Oracle GoldenGate 11g2010年Oracle製品としての初のメジャーリリース
Oracle GoldenGate 12c (12.1/12.2/12.3)2013-2017年マルチテナント対応、統合Replicat、Coordinated Replicat
Oracle GoldenGate 18c2018年Microservices Architecture (MA) の導入
Oracle GoldenGate 19c2019年長期サポート版、パフォーマンス改善
Oracle GoldenGate 21c2021年REST API強化、AutoCDR
Oracle GoldenGate 23ai2024年AI機能統合、Oracle Database 23ai対応

現在のOGGには大きく分けて2つのアーキテクチャが存在する。

  1. Classic Architecture(クラシックアーキテクチャ): 従来型のコマンドライン(GGSCI)ベースの管理方式
  2. Microservices Architecture(マイクロサービスアーキテクチャ): REST APIとWebベースの管理コンソールを提供するモダンな管理方式

2. コアコンセプトと用語

2.1 変更データキャプチャ(CDC)の基本原理

Oracle GoldenGate の根幹をなす技術は、変更データキャプチャ(CDC)である。CDCとは、データベースに対する変更(INSERT、UPDATE、DELETE)を検出し、その変更データを下流のシステムに伝播させる技術の総称である。

OGGが採用するログベースCDCの動作原理は以下の通りである。

  1. トランザクションログの読み取り: データベースのトランザクションログ(Oracle の場合は Redo Log / Archive Log)を直接読み取る
  2. 変更レコードの解析: ログエントリから、対象テーブルに対するDML操作(INSERT/UPDATE/DELETE)を識別し、変更前後のデータ値を抽出する
  3. トランザクション再構築: 個々のログエントリを元のトランザクション単位に再構築する。コミットされたトランザクションのみがターゲットに伝播される
  4. データ変換(オプション): 必要に応じてカラムマッピング、フィルタリング、データ変換を適用する
  5. ターゲットへの適用: 変更データをターゲットデータベースに対してSQL文として適用する

2.2 主要コンポーネント

Oracle GoldenGate は以下の主要コンポーネントで構成される。

Manager プロセス

OGG環境全体を管理する常駐プロセスである。各ノード(ソース側・ターゲット側)で1つのManagerが動作し、以下の役割を担う。

  • Extract、Replicat、Data Pump などの子プロセスの起動・停止・監視
  • Trail ファイルのディスク管理(ローテーション、パージ)
  • ネットワーク通信用ポートの動的割り当て
  • レポートファイルの管理

Extract プロセス

ソースデータベースのトランザクションログからデータ変更を抽出するプロセスである。以下の2種類が存在する。

  • Primary Extract(プライマリExtract): データベースのトランザクションログから直接変更データを読み取り、ローカルTrailファイルに書き出す
  • Initial Load Extract: 既存データの初期ロードを行うための特殊なExtract。テーブルの全データをソースから読み取ってターゲットに送る

Data Pump プロセス

ローカルTrailファイルからデータを読み取り、リモートのターゲットシステムへネットワーク経由で送信するプロセスである。Data Pumpはオプションのコンポーネントであるが、以下の理由から本番環境では使用が強く推奨される。

  • ネットワーク障害時のバッファリング(ストア&フォワード)
  • Primary Extractからネットワーク送信処理を分離することによるパフォーマンス向上
  • データフィルタリングや変換の実行ポイントとしての活用

Replicat プロセス

ターゲット側でTrailファイルからデータ変更を読み取り、ターゲットデータベースに適用するプロセスである。以下の種類がある。

  • Classic Replicat: 単一スレッドで順次的にトランザクションを適用する。最もシンプルだが、大量トランザクション環境ではボトルネックになりうる
  • Coordinated Replicat: 複数のスレッドで並列にトランザクションを適用する。スレッド間の依存関係を自動的に管理し、データ整合性を維持しながら高スループットを実現する
  • Integrated Replicat(Oracle Database専用): Oracle Databaseの内部APIを使用してデータを適用する。DDLレプリケーションの自動処理やパラレル適用を自然にサポートする
  • Parallel Replicat: OGG 21c以降で導入された高性能Replicat。大規模トランザクションの並列処理を最適化する

Trail ファイル

Extract プロセスが書き出す変更データの中間ファイルである。OGG独自のバイナリ形式で、変更レコードを効率的に格納する。

  • Local Trail(ローカルTrail): ソース側に作成されるTrailファイル。通常、2文字のプレフィックス(例:lt)で識別される
  • Remote Trail(リモートTrail): ターゲット側に作成されるTrailファイル。通常、2文字のプレフィックス(例:rt)で識別される

Trail ファイルはシーケンス番号付きで管理され(例:lt000001lt000002...)、一定サイズに達すると新しいファイルにローテーションされる。

Checkpoint

各プロセスの処理位置を記録する仕組みである。チェックポイントにより、プロセスの再起動時に中断した位置から処理を再開できる。チェックポイント情報はチェックポイントテーブル(データベース内)またはチェックポイントファイル(ファイルシステム上)に保存される。

2.3 データフロー概要

OGGにおけるデータフローの典型的な流れを以下に示す。

[ソースDB] → [Redo/Archive Log]
                    ↓
              [Extract プロセス]
                    ↓
              [Local Trail ファイル]
                    ↓
              [Data Pump プロセス]
                    ↓  (TCP/IP ネットワーク)
              [Remote Trail ファイル]
                    ↓
              [Replicat プロセス]
                    ↓
              [ターゲットDB]

この多段階のアーキテクチャにより、各コンポーネントが独立して動作し、障害時のリカバリや性能のチューニングを柔軟に行うことができる。

3. アーキテクチャ詳細

3.1 Classic Architecture(クラシックアーキテクチャ)

Classic Architecture は Oracle GoldenGate の伝統的な構成であり、コマンドラインインタフェース GGSCI(GoldenGate Software Command Interface)を通じてすべての操作を行う。

ディレクトリ構成

Classic Architecture のインストール後の標準的なディレクトリ構造は以下の通りである。

$OGG_HOME/
├── ggsci              # GGSCIコマンドラインツール
├── extract            # Extractプロセスバイナリ
├── replicat           # Replicatプロセスバイナリ
├── mgr                # Managerプロセスバイナリ
├── defgen             # 定義ファイル生成ツール
├── dirdat/            # Trailファイル格納ディレクトリ
├── dirdef/            # テーブル定義ファイル格納ディレクトリ
├── dirrpt/            # レポートファイル格納ディレクトリ
├── dirchk/            # チェックポイントファイル格納ディレクトリ
├── dirpcs/            # プロセスステータスファイル格納ディレクトリ
├── dirprm/            # パラメータファイル格納ディレクトリ
│   ├── mgr.prm        # Managerパラメータ
│   ├── ext1.prm       # Extractパラメータ
│   ├── pump1.prm      # Data Pumpパラメータ
│   └── rep1.prm       # Replicatパラメータ
├── dirtmp/            # 一時ファイル格納ディレクトリ
└── dirsql/            # SQLスクリプト格納ディレクトリ

GGSCI の基本操作

GGSCIは対話型のコマンドラインシェルであり、以下の基本コマンドで操作する。

-- GGSCIの起動
$ cd $OGG_HOME
$ ./ggsci

-- プロセス状態の確認
GGSCI> INFO ALL

-- 特定プロセスの詳細情報
GGSCI> INFO EXTRACT ext1, DETAIL
GGSCI> INFO REPLICAT rep1, DETAIL

-- プロセスの起動・停止
GGSCI> START MANAGER
GGSCI> START EXTRACT ext1
GGSCI> START REPLICAT rep1

GGSCI> STOP EXTRACT ext1
GGSCI> STOP REPLICAT rep1

-- パラメータファイルの編集
GGSCI> EDIT PARAMS ext1
GGSCI> EDIT PARAMS rep1

-- プロセスの追加・削除
GGSCI> ADD EXTRACT ext1, TRANLOG, BEGIN NOW
GGSCI> ADD EXTTRAIL ./dirdat/lt, EXTRACT ext1, MEGABYTES 200
GGSCI> DELETE EXTRACT ext1

-- ラグ(遅延)の確認
GGSCI> LAG EXTRACT ext1
GGSCI> LAG REPLICAT rep1

-- 統計情報の表示
GGSCI> STATS EXTRACT ext1, TOTAL
GGSCI> STATS REPLICAT rep1, TOTAL

3.2 Microservices Architecture(MA)

Oracle GoldenGate 18c 以降で導入された Microservices Architecture(MA)は、RESTful APIとWebベースの管理インタフェースを提供する。

MA のコンポーネント構成

MAは以下の独立したサービスで構成される。

サービスデフォルトポート説明
Service Manager任意(例:9100)全サービスのライフサイクル管理
Administration Server自動割当Extract/Replicat の設定・管理
Distribution Server自動割当リモートTrailへのデータ送信(Data Pump相当)
Receiver Server自動割当リモートからのデータ受信
Performance Metrics Server自動割当パフォーマンスメトリクスの収集・提供

MAの利点

  1. Web管理コンソール: ブラウザベースのGUIでOGG環境の一元管理が可能
  2. REST API: CI/CDパイプラインとの統合、自動化スクリプトの作成が容易
  3. セキュリティ強化: TLS/SSL通信の標準サポート、認証・認可の統合管理
  4. デプロイメント(OGG Free): Oracle GoldenGate Free 版ではMAが標準
  5. Kubernetes対応: コンテナ環境へのデプロイメントを正式サポート

MAのデプロイメント構成例

[Service Manager (Port 9100)]
    │
    ├── [Administration Server (Port 9101)]
    │       ├── Extract ext1
    │       └── Replicat rep1
    │
    ├── [Distribution Server (Port 9102)]
    │       └── Distribution Path path1
    │
    ├── [Receiver Server (Port 9103)]
    │       └── Receiver path
    │
    └── [Performance Metrics Server (Port 9104)]
            └── メトリクスダッシュボード

REST API の使用例

# デプロイメントの状態確認
curl -u oggadmin:password -X GET \
  https://ogg-host:9100/services/v2/deployments \
  -H "Content-Type: application/json"

# Extract の作成
curl -u oggadmin:password -X POST \
  https://ogg-host:9101/services/v2/extracts/ext1 \
  -H "Content-Type: application/json" \
  -d '{
    "description": "Primary Extract",
    "config": [
      "EXTRACT ext1",
      "USERIDALIAS ogg_src DOMAIN OracleGoldenGate",
      "EXTTRAIL lt",
      "TABLE hr.*;"
    ],
    "source": {
      "tranlogs": "integrated"
    },
    "registration": {
      "containers": ["pdb1"]
    },
    "begin": "now"
  }'

# Replicat の状態確認
curl -u oggadmin:password -X GET \
  https://ogg-host:9101/services/v2/replicats/rep1/info \
  -H "Content-Type: application/json"

3.3 Extract プロセスの詳細アーキテクチャ

Classic Extract vs Integrated Extract

Oracle Database をソースとする場合、2種類のExtractモードがある。

Classic Extract(Classic Capture)

  • OGGプロセスが直接 Redo Log ファイルを読み取り、解析する
  • Oracle Database のバージョンやプラットフォームに依存しにくい
  • 非Oracle データベースでは唯一の選択肢

Integrated Extract(Integrated Capture)

  • Oracle Database の Logmining Server API を使用してログを読み取る
  • Oracle Database 11.2.0.3 以降でサポート
  • マルチテナント(CDB/PDB)環境に対応
  • Oracle の内部APIを使用するため、Oracle のログフォーマット変更に自動的に追従する
  • 推奨される方式

Integrated Extract の内部動作は以下の通りである。

[Oracle Database Instance]
    │
    ├── [Redo Log Writer (LGWR)]
    │       └── Redo Log Files
    │
    ├── [Logmining Server]  ← Oracle内部コンポーネント
    │       ├── Redo Log の読み取り
    │       ├── Logical Change Records (LCR) の生成
    │       └── LCR を Extract に送信
    │
    └── [Integrated Extract プロセス]
            ├── LCR の受信
            ├── フィルタリング・変換
            └── Trail ファイルへの書き出し

Integrated Extract の登録コマンド例:

-- GGSCIでの登録
GGSCI> DBLOGIN USERIDALIAS ogg_src
GGSCI> REGISTER EXTRACT ext1 DATABASE CONTAINER (pdb1)

-- Extractの追加
GGSCI> ADD EXTRACT ext1, INTEGRATED TRANLOG, BEGIN NOW
GGSCI> ADD EXTTRAIL ./dirdat/lt, EXTRACT ext1, MEGABYTES 200

Extract パラメータファイルの詳細例

-- ext1.prm (Integrated Extract パラメータ)
EXTRACT ext1

-- データベース接続
USERIDALIAS ogg_src DOMAIN OracleGoldenGate

-- Integrated Capture モード
TRANLOGOPTIONS INTEGRATEDPARAMS (MAX_SGA_SIZE 256)

-- Extract のパフォーマンスチューニング
FETCHOPTIONS FETCHPKUPDATECOLS
CACHEMGR CACHESIZE 2G, CACHEDIRECTORY /tmp/ogg_cache 10G

-- Trail ファイル設定
EXTTRAIL ./dirdat/lt
-- Trail ファイルサイズ(MB)
-- MEGABYTES 500 はADD EXTTRAILで指定済み

-- DDL レプリケーション
DDL INCLUDE MAPPED

-- テーブルマッピング
TABLE pdb1.hr.employees;
TABLE pdb1.hr.departments;
TABLE pdb1.hr.job_history;
TABLE pdb1.sales.*;

-- 特定テーブルの除外
TABLEEXCLUDE pdb1.sales.temp_*;

-- 大きなトランザクションの処理設定
EOFDELAY 1
WARNLONGTRANS 2H, CHECKINTERVAL 30M

3.4 Replicat プロセスの詳細アーキテクチャ

Replicat モードの比較

特徴Classic ReplicatCoordinated ReplicatIntegrated ReplicatParallel Replicat
並列処理なし(単一スレッド)あり(マルチスレッド)あり(DB内部並列)あり(高度な並列)
適用方式直接SQL実行直接SQL実行Database Inbound Server直接SQL実行
DDL対応手動設定必要手動設定必要自動手動設定必要
依存関係管理N/AOGGが管理DBが管理OGGが管理
パフォーマンス低〜中非常に高
対応DB全DB全DBOracle のみ全DB

Replicat パラメータファイルの詳細例

-- rep1.prm (Parallel Replicat パラメータ)
REPLICAT rep1

-- データベース接続
USERIDALIAS ogg_tgt DOMAIN OracleGoldenGate

-- Parallel Replicat 設定
-- MAP_PARALLELISM: 並列適用スレッド数
-- MIN_APPLY_PARALLELISM: 最小並列度
-- MAX_APPLY_PARALLELISM: 最大並列度
MAP_PARALLELISM 4
MIN_APPLY_PARALLELISM 2
MAX_APPLY_PARALLELISM 8

-- トランザクション整合性の維持
-- SPLIT_TRANS_RECS: 大きなトランザクションの分割閾値
SPLIT_TRANS_RECS 1000

-- エラーハンドリング
REPERROR (DEFAULT, ABEND)
REPERROR (1403, DISCARD)  -- ORA-01403: no data found
REPERROR (1, DISCARD)     -- ORA-00001: unique constraint violated

-- Discard ファイル(エラーレコード記録)
DISCARDFILE ./dirrpt/rep1_discard.dsc, PURGE, MEGABYTES 100

-- DDL レプリケーション
DDL INCLUDE MAPPED

-- チェックポイントテーブル
-- (ADD CHECKPOINTTABLE で事前に作成済み)

-- テーブルマッピング
MAP pdb1.hr.employees, TARGET hr.employees;
MAP pdb1.hr.departments, TARGET hr.departments;
MAP pdb1.hr.job_history, TARGET hr.job_history;

-- カラムマッピングの例
MAP pdb1.sales.orders, TARGET analytics.fact_orders, &
    COLMAP (USEDEFAULTS, &
            order_date_key = @COMPUTE (order_date - DATE (2000,1,1)), &
            load_timestamp = @DATENOW());

-- フィルタ条件の例(特定条件のレコードのみ適用)
MAP pdb1.sales.transactions, TARGET sales.transactions, &
    FILTER (@STREQ (status, 'COMPLETED'));

4. Manager プロセスとネットワーク構成

4.1 Manager パラメータの詳細

Manager プロセスは OGG 環境全体のオーケストレーターであり、そのパラメータファイル(mgr.prm)はすべてのOGGノードで必須である。

-- mgr.prm (Manager パラメータファイル)

-- Manager の通信ポート
PORT 7809

-- 動的ポート範囲(Data Pump/Collector 用)
DYNAMICPORTLIST 7810-7820

-- Trail ファイルの自動パージ設定
-- 使用済みTrailファイルを7日後に自動削除
PURGEOLDEXTRACTS ./dirdat/lt*, USECHECKPOINTS, MINKEEPDAYS 7
PURGEOLDEXTRACTS ./dirdat/rt*, USECHECKPOINTS, MINKEEPDAYS 7

-- レポートファイルの自動ローテーション
-- REPORTROLLOVER TIME_REPORT_ROTATION
AUTOSTART EXTRACT *
AUTOSTART REPLICAT *

-- プロセス異常終了時の自動再起動
AUTORESTART EXTRACT *, RETRIES 3, WAITMINUTES 5, RESETMINUTES 60
AUTORESTART REPLICAT *, RETRIES 3, WAITMINUTES 5, RESETMINUTES 60

-- セキュリティ設定
-- ACCESSRULE により接続を許可するIPアドレスを制限
ACCESSRULE, PROG *, IPADDR 192.168.1.*, ALLOW
ACCESSRULE, PROG *, IPADDR 10.0.0.*, ALLOW
ACCESSRULE, PROG *, IPADDR *, DENY

-- ラグ閾値(アラート用)
LAGREPORTHOURS 1
LAGINFOMINUTES 0
LAGCRITICALMINUTES 10

4.2 ネットワーク構成とファイアウォール設定

OGG環境のネットワーク設計では、以下のポートと通信要件を考慮する必要がある。

必要なネットワークポート

通信方向ポートプロトコル用途
ソース→ターゲット7809(Manager)TCPManagerプロセス通信
ソース→ターゲット7810-7820(動的)TCPData Pump → Collector通信
クライアント→MA9100-9104HTTPSMicroservices Architecture WebUI/API
OGG→Database1521(Oracle)TCPデータベース接続

ネットワークレイテンシの影響

OGGのレプリケーションパフォーマンスはネットワークレイテンシに大きく影響される。以下のガイドラインが推奨される。

  • 同一データセンター内(< 1ms): 最高のパフォーマンス。Data Pump の TCPBUFSIZE はデフォルトで十分
  • 地域間(1-50ms): Data Pump の TCPBUFSIZE を増加させ、COMPRESS(圧縮)を有効にする
  • 大陸間(50-200ms): 圧縮必須、TCPBUFSIZE の最大化、複数Data Pumpによる並列送信を検討
-- Data Pump パラメータでのネットワーク最適化例
EXTRACT pump1
USERIDALIAS ogg_src DOMAIN OracleGoldenGate
RMTHOST target-ogg-host, MGRPORT 7809, COMPRESS, COMPRESSTHRESHOLD 1000
RMTTRAIL ./dirdat/rt
PASSTHRU
TABLE pdb1.hr.*;
TABLE pdb1.sales.*;

4.3 認証とクレデンシャル管理

OGGでのデータベース認証には、クレデンシャルストアの使用が推奨される。

-- クレデンシャルストアの作成
GGSCI> ADD CREDENTIALSTORE

-- ソースDB用クレデンシャルの追加
GGSCI> ALTER CREDENTIALSTORE ADD USER ogg_admin@orcl_src PASSWORD ******* ALIAS ogg_src DOMAIN OracleGoldenGate

-- ターゲットDB用クレデンシャルの追加
GGSCI> ALTER CREDENTIALSTORE ADD USER ogg_admin@orcl_tgt PASSWORD ******* ALIAS ogg_tgt DOMAIN OracleGoldenGate

-- クレデンシャル一覧の確認
GGSCI> INFO CREDENTIALSTORE

-- パラメータファイルでの使用
-- USERID ogg_admin@orcl_src, PASSWORD ******* の代わりに
USERIDALIAS ogg_src DOMAIN OracleGoldenGate

5. Trail ファイルの仕組み

5.1 Trail ファイルの構造

Trail ファイルは OGG 独自のバイナリ形式で、以下の情報を格納する。

Trail レコードの構成要素

各 Trail レコードには以下の情報が含まれる。

  • ヘッダ情報: レコードタイプ(INSERT/UPDATE/DELETE)、タイムスタンプ、トランザクション情報
  • テーブル識別子: スキーマ名、テーブル名
  • カラムデータ: 変更されたカラムの値(変更前/変更後)
  • キー情報: プライマリキーまたはユニークキーの値
  • トランザクション境界: BEGIN/COMMIT マーカー

Trail ファイルの命名規則

dirdat/lt000001    -- ローカルTrail、シーケンス1
dirdat/lt000002    -- ローカルTrail、シーケンス2
dirdat/rt000001    -- リモートTrail、シーケンス1

プレフィックス(ltrtなど)は2文字で指定し、6桁のシーケンス番号が自動的に付与される。シーケンス番号は 000000999999 の範囲でローテーションする。

5.2 Trail ファイルの管理

サイズ管理

-- Trail ファイルの最大サイズを500MBに設定
GGSCI> ADD EXTTRAIL ./dirdat/lt, EXTRACT ext1, MEGABYTES 500

-- パラメータファイルでの設定
EXTTRAIL ./dirdat/lt, MEGABYTES 500

自動パージ

Manager パラメータで自動パージを設定する。

-- チェックポイントに基づく安全なパージ
PURGEOLDEXTRACTS ./dirdat/lt*, USECHECKPOINTS, MINKEEPDAYS 3
PURGEOLDEXTRACTS ./dirdat/rt*, USECHECKPOINTS, MINKEEPDAYS 3

-- 時間ベースのパージ(チェックポイント無視 - 非推奨)
-- PURGEOLDEXTRACTS ./dirdat/lt*, MINKEEPHOURS 24

Trail の暗号化

セキュリティ要件が高い環境では、Trail ファイルを暗号化できる。

-- Extract パラメータでの暗号化設定
ENCRYPTTRAIL AES256

-- 暗号化キーの管理
ENCRYPT DATA USING AES256 KEYNAME mykey1

5.3 Logdump ユーティリティ

logdump は Trail ファイルの内容を人間が読める形式で表示するデバッグツールである。

-- logdump の起動
$ cd $OGG_HOME
$ ./logdump

-- Trail ファイルを開く
Logdump> OPEN ./dirdat/lt000001

-- 表示設定
Logdump> GHDR ON       -- ヘッダ情報の表示
Logdump> DETAIL ON     -- 詳細データの表示
Logdump> DETAIL DATA   -- カラムデータの16進数表示
Logdump> USERTOKEN ON  -- ユーザートークンの表示

-- レコードの閲覧
Logdump> NEXT           -- 次のレコードを表示
Logdump> COUNT           -- レコード数のカウント
Logdump> SCANFOREND      -- ファイル末尾までスキャン

-- 特定テーブルのレコードを検索
Logdump> FILTER INCLUDE FILENAME hr.employees
Logdump> NEXT

-- 出力例
___________________________________________________________________
Hdr-Ind    :     E  (x45)     Partition  :     .  (x04)
UndoFlag   :     .  (x00)     BeforeAfter:     A  (x41)
RecLength  :    82  (x0052)   IO Time    : 2024/03/15 10:30:45.123
IOType     :     5  (x05)     OrigNode   :   255  (xFF)
TransInd   :     .  (x03)     FormatType :     R  (x52)
SyskeyLen  :     0  (x00)     Incomplete :     .  (x00)
AuditRBA   :       1234       AuditPos   : 56789012
Continued  :     N  (x00)     RecCount   :     1  (x01)

2024/03/15 10:30:45.123  Insert     Len    82 RBA 1234
Name: HR.EMPLOYEES  (TDR Index: 1)
After  Image:                                    Partition x04  G  b
 0000 0005 0000 0003 3130 3100 0100 0000  | ........101.....
 0008 4b69 6e67 0002 0000 0009 4144 5f50  | ..King......AD_P
 ...
Column     0 (x0000), Len     4 (x0004)  EMPLOYEE_ID = 101
Column     1 (x0001), Len     5 (x0005)  LAST_NAME = King
...

6. レプリケーショントポロジー

Oracle GoldenGate は、様々なレプリケーショントポロジーをサポートする。

6.1 単方向(Unidirectional)レプリケーション

最もシンプルな構成で、ソースからターゲットへの一方向のデータ伝播を行う。

[ソースDB] ──Extract──> [Trail] ──Replicat──> [ターゲットDB]

ユースケース: DR構成、レポーティング用レプリカ、データウェアハウスへのフィード

6.2 双方向(Bidirectional)レプリケーション

2つのデータベース間で相互にデータを同期する Active-Active 構成。

[サイトA DB] ──Extract A──> [Trail] ──Replicat A'──> [サイトB DB]
     ↑                                                     │
     └──Replicat B'──< [Trail] <──Extract B──────────────────┘

重要な考慮点: ループ防止(レプリケートされたデータを再度キャプチャしない仕組み)と、コンフリクト検出・解決(CDR: Conflict Detection and Resolution)の設定が必須。

ループ防止の設定例

-- サイトA の Extract パラメータ
EXTRACT extA
USERIDALIAS ogg_siteA DOMAIN OracleGoldenGate
TRANLOGOPTIONS EXCLUDETAG 00
EXTTRAIL ./dirdat/la
TABLE hr.*;

-- サイトA の Replicat パラメータ(サイトBからのデータ適用時にタグを設定)
REPLICAT repA
USERIDALIAS ogg_siteA DOMAIN OracleGoldenGate
DBOPTIONS SETTAG 00
MAP hr.*, TARGET hr.*;

TRANLOGOPTIONS EXCLUDETAGDBOPTIONS SETTAG の組み合わせにより、Replicatが適用したトランザクションにタグを付与し、Extractがそのタグ付きトランザクションをスキップする。

6.3 ファンアウト(Fan-out / Broadcast)

1つのソースから複数のターゲットにデータを配信する構成。

                          ┌──Replicat 1──> [ターゲットDB 1]
[ソースDB] ──Extract──>──┤
                          ├──Replicat 2──> [ターゲットDB 2]
                          │
                          └──Replicat 3──> [ターゲットDB 3]
-- Data Pump 1 (ターゲット1向け)
EXTRACT pump1
USERIDALIAS ogg_src DOMAIN OracleGoldenGate
RMTHOST target1-host, MGRPORT 7809
RMTTRAIL ./dirdat/r1
PASSTHRU
TABLE hr.*;

-- Data Pump 2 (ターゲット2向け)
EXTRACT pump2
USERIDALIAS ogg_src DOMAIN OracleGoldenGate
RMTHOST target2-host, MGRPORT 7809
RMTTRAIL ./dirdat/r2
PASSTHRU
TABLE hr.*;

6.4 統合(Consolidation / Fan-in)

複数のソースから1つのターゲットにデータを集約する構成。

[ソースDB 1] ──Extract 1──>──┐
                               ├──> [ターゲットDB]
[ソースDB 2] ──Extract 2──>──┤
                               │
[ソースDB 3] ──Extract 3──>──┘

注意点: 各ソースのデータが競合しないようスキーマ設計やフィルタリングが必要。

6.5 カスケード(Cascading)

中間ノードを経由する多段レプリケーション。

[ソースDB] ──> [中間DB] ──> [最終ターゲットDB]

地理的に分散した環境や、ネットワーク制約がある場合に有用。

6.6 ピアツーピア(Peer-to-Peer)

3つ以上のノードが相互にレプリケーションする構成。双方向レプリケーションの拡張版。

[サイトA] ←──→ [サイトB]
    ↑    ╲      ╱    ↑
    │     ╲    ╱     │
    ↓      ╲╱       ↓
         [サイトC]

この構成では、各サイトのExtractとReplicatのペアが必要であり、コンフリクト解決の設定が非常に重要になる。


7. 設定の具体例

7.1 基本的な単方向レプリケーションの構成手順

以下に、Oracle Database 19c から Oracle Database 19c への単方向レプリケーションの完全な構成手順を示す。

Step 1: ソースデータベースの準備

-- ソースDB: supplemental logging の有効化
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
ALTER DATABASE FORCE LOGGING;

-- スキーマレベルの supplemental logging
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

-- または、テーブルレベルで個別に設定
ALTER TABLE hr.employees ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
ALTER TABLE hr.departments ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

-- OGG管理ユーザーの作成
CREATE USER ogg_admin IDENTIFIED BY "SecurePass123#";
GRANT CREATE SESSION, ALTER SESSION TO ogg_admin;
GRANT RESOURCE TO ogg_admin;
GRANT SELECT ANY DICTIONARY TO ogg_admin;
GRANT FLASHBACK ANY TABLE TO ogg_admin;
GRANT SELECT ANY TABLE TO ogg_admin;
GRANT INSERT, UPDATE, DELETE ON hr.employees TO ogg_admin;
GRANT INSERT, UPDATE, DELETE ON hr.departments TO ogg_admin;

-- GoldenGate Replication 用の権限
EXEC DBMS_GOLDENGATE_AUTH.GRANT_ADMIN_PRIVILEGE('ogg_admin');

-- アーカイブログモードの確認
ARCHIVE LOG LIST;

Step 2: ターゲットデータベースの準備

-- ターゲットDB: OGG管理ユーザーの作成
CREATE USER ogg_admin IDENTIFIED BY "SecurePass123#";
GRANT CREATE SESSION, ALTER SESSION TO ogg_admin;
GRANT RESOURCE TO ogg_admin;
GRANT SELECT ANY DICTIONARY TO ogg_admin;
GRANT INSERT, UPDATE, DELETE ON hr.employees TO ogg_admin;
GRANT INSERT, UPDATE, DELETE ON hr.departments TO ogg_admin;

-- チェックポイントテーブル用の権限
GRANT CREATE TABLE TO ogg_admin;
ALTER USER ogg_admin QUOTA UNLIMITED ON USERS;

Step 3: ソース側 OGG の設定

-- GGSCI でソース側を設定
$ cd $OGG_HOME
$ ./ggsci

-- クレデンシャルストアの設定
GGSCI> ADD CREDENTIALSTORE
GGSCI> ALTER CREDENTIALSTORE ADD USER ogg_admin@orcl_src ALIAS ogg_src DOMAIN OracleGoldenGate

-- DB接続テスト
GGSCI> DBLOGIN USERIDALIAS ogg_src

-- チェックポイントテーブルの作成
GGSCI> ADD CHECKPOINTTABLE ogg_admin.gg_checkpoint

-- Supplemental Log の確認
GGSCI> ADD SCHEMATRANDATA hr ALLCOLS

-- Manager パラメータ設定
GGSCI> EDIT PARAMS mgr
-- mgr.prm
PORT 7809
DYNAMICPORTLIST 7810-7830
PURGEOLDEXTRACTS ./dirdat/lt*, USECHECKPOINTS, MINKEEPDAYS 7
AUTORESTART EXTRACT *, RETRIES 3, WAITMINUTES 5
LAGREPORTHOURS 1
LAGCRITICALMINUTES 10
-- Extract プロセスの追加
GGSCI> ADD EXTRACT ext1, INTEGRATED TRANLOG, BEGIN NOW
GGSCI> REGISTER EXTRACT ext1 DATABASE

-- Extract Trail の追加
GGSCI> ADD EXTTRAIL ./dirdat/lt, EXTRACT ext1, MEGABYTES 200

-- Extract パラメータ設定
GGSCI> EDIT PARAMS ext1
-- ext1.prm
EXTRACT ext1
USERIDALIAS ogg_src DOMAIN OracleGoldenGate
EXTTRAIL ./dirdat/lt

-- パフォーマンス設定
FETCHOPTIONS FETCHPKUPDATECOLS
TRANLOGOPTIONS INTEGRATEDPARAMS (MAX_SGA_SIZE 256)

-- テーブル指定
TABLE hr.employees;
TABLE hr.departments;
TABLE hr.job_history;
TABLE hr.locations;
TABLE hr.countries;
TABLE hr.regions;
-- Data Pump の追加
GGSCI> ADD EXTRACT pump1, EXTTRAILSOURCE ./dirdat/lt
GGSCI> ADD RMTTRAIL ./dirdat/rt, EXTRACT pump1, MEGABYTES 200

-- Data Pump パラメータ設定
GGSCI> EDIT PARAMS pump1
-- pump1.prm
EXTRACT pump1
USERIDALIAS ogg_src DOMAIN OracleGoldenGate
RMTHOST target-ogg-host, MGRPORT 7809, COMPRESS
RMTTRAIL ./dirdat/rt
PASSTHRU
TABLE hr.*;

Step 4: ターゲット側 OGG の設定

$ cd $OGG_HOME
$ ./ggsci

-- クレデンシャルストアの設定
GGSCI> ADD CREDENTIALSTORE
GGSCI> ALTER CREDENTIALSTORE ADD USER ogg_admin@orcl_tgt ALIAS ogg_tgt DOMAIN OracleGoldenGate

-- DB接続テスト
GGSCI> DBLOGIN USERIDALIAS ogg_tgt

-- チェックポイントテーブルの作成
GGSCI> ADD CHECKPOINTTABLE ogg_admin.gg_checkpoint

-- Manager パラメータ設定
GGSCI> EDIT PARAMS mgr
-- mgr.prm (ターゲット側)
PORT 7809
DYNAMICPORTLIST 7810-7830
PURGEOLDEXTRACTS ./dirdat/rt*, USECHECKPOINTS, MINKEEPDAYS 7
AUTORESTART REPLICAT *, RETRIES 3, WAITMINUTES 5
LAGREPORTHOURS 1
LAGCRITICALMINUTES 10
-- Replicat の追加
GGSCI> ADD REPLICAT rep1, PARALLEL, EXTTRAIL ./dirdat/rt, CHECKPOINTTABLE ogg_admin.gg_checkpoint

-- Replicat パラメータ設定
GGSCI> EDIT PARAMS rep1
-- rep1.prm
REPLICAT rep1
USERIDALIAS ogg_tgt DOMAIN OracleGoldenGate

-- Parallel Replicat 設定
MAP_PARALLELISM 4
MIN_APPLY_PARALLELISM 2
MAX_APPLY_PARALLELISM 8

-- エラーハンドリング
REPERROR (DEFAULT, ABEND)
DISCARDFILE ./dirrpt/rep1_discard.dsc, PURGE, MEGABYTES 100

-- テーブルマッピング
MAP hr.employees, TARGET hr.employees;
MAP hr.departments, TARGET hr.departments;
MAP hr.job_history, TARGET hr.job_history;
MAP hr.locations, TARGET hr.locations;
MAP hr.countries, TARGET hr.countries;
MAP hr.regions, TARGET hr.regions;

Step 5: 初期データロードとプロセス起動

-- ソース側
GGSCI> START MANAGER
GGSCI> START EXTRACT ext1
GGSCI> START EXTRACT pump1

-- ターゲット側
GGSCI> START MANAGER
GGSCI> START REPLICAT rep1

-- 状態確認
GGSCI> INFO ALL
GGSCI> INFO EXTRACT ext1, DETAIL
GGSCI> INFO REPLICAT rep1, DETAIL

-- ラグ確認
GGSCI> LAG EXTRACT ext1
GGSCI> LAG REPLICAT rep1

7.2 Oracle から Kafka へのデータ配信

OGG for Big Data を使用して、Oracle Database の変更データを Apache Kafka に配信する設定例。

Extract 側(通常の設定と同様)

-- ext_kafka.prm
EXTRACT ext_kafka
USERIDALIAS ogg_src DOMAIN OracleGoldenGate
EXTTRAIL ./dirdat/lk
TABLE hr.employees;
TABLE hr.departments;

Replicat 側(OGG for Big Data / Kafka Handler)

-- rep_kafka.prm
REPLICAT rep_kafka
TARGETDB LIBFILE libggjava.so SET property=dirprm/kafka.props
REPORTCOUNT EVERY 60 SECONDS, RATE
GROUPTRANSOPS 1000
MAP hr.employees, TARGET hr.employees;
MAP hr.departments, TARGET hr.departments;
# kafka.props (Kafka Handler プロパティ)
gg.handlerlist=kafkahandler
gg.handler.kafkahandler.type=kafka
gg.handler.kafkahandler.KafkaProducerConfigFile=dirprm/kafka-producer.properties
gg.handler.kafkahandler.topicMappingTemplate=${schemaName}_${tableName}
gg.handler.kafkahandler.keyMappingTemplate=${primaryKeys}
gg.handler.kafkahandler.format=json
gg.handler.kafkahandler.format.metaColumnsTemplate=${optype},${timestamp}
gg.handler.kafkahandler.SchemaTopicName=oggschema
gg.handler.kafkahandler.BlockingSend=true
gg.handler.kafkahandler.includeTokens=false

# JSON フォーマッタ設定
gg.handler.kafkahandler.format.insertOpKey=I
gg.handler.kafkahandler.format.updateOpKey=U
gg.handler.kafkahandler.format.deleteOpKey=D
gg.handler.kafkahandler.format.treatAllColumnsAsStrings=false
gg.handler.kafkahandler.format.iso8601Format=true
gg.handler.kafkahandler.format.pkUpdateHandling=delete-insert
# kafka-producer.properties
bootstrap.servers=kafka-broker1:9092,kafka-broker2:9092,kafka-broker3:9092
acks=all
retries=3
retry.backoff.ms=1000
key.serializer=org.apache.kafka.common.serialization.StringSerializer
value.serializer=org.apache.kafka.common.serialization.StringSerializer
compression.type=snappy
linger.ms=100
batch.size=65536
buffer.memory=67108864

# セキュリティ設定(必要に応じて)
security.protocol=SASL_SSL
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \
  username="kafka_user" password="kafka_password";
ssl.truststore.location=/etc/kafka/ssl/truststore.jks
ssl.truststore.password=changeit

Kafka に出力される JSON メッセージの例:

{
  "table": "HR.EMPLOYEES",
  "op_type": "U",
  "op_ts": "2024-03-15 10:30:45.123456",
  "current_ts": "2024-03-15 10:30:46.789012",
  "pos": "00000000000001234567",
  "before": {
    "EMPLOYEE_ID": 101,
    "LAST_NAME": "King",
    "SALARY": 24000
  },
  "after": {
    "EMPLOYEE_ID": 101,
    "LAST_NAME": "King",
    "SALARY": 25000
  }
}

8. DDL レプリケーション

8.1 DDL レプリケーションの概要

Oracle GoldenGate は DML(INSERT/UPDATE/DELETE)だけでなく、DDL(Data Definition Language)操作のレプリケーションもサポートする。DDLレプリケーションにより、ソースデータベースのスキーマ変更をターゲットに自動的に伝播できる。

サポートされるDDL操作

  • CREATE / ALTER / DROP TABLE
  • CREATE / ALTER / DROP INDEX
  • CREATE / ALTER / DROP SEQUENCE
  • CREATE / ALTER / DROP VIEW
  • CREATE / ALTER / DROP PROCEDURE / FUNCTION / PACKAGE
  • CREATE / ALTER / DROP TRIGGER
  • CREATE / ALTER / DROP TYPE
  • TRUNCATE TABLE
  • ALTER TABLE ADD / MODIFY / DROP COLUMN
  • ALTER TABLE ADD / DROP CONSTRAINT
  • GRANT / REVOKE

8.2 DDL レプリケーションの設定

Integrated Mode での DDL レプリケーション

Integrated Extract + Integrated Replicat の構成では、DDLレプリケーションが最もシームレスに動作する。

-- Extract パラメータ(DDL有効化)
EXTRACT ext1
USERIDALIAS ogg_src DOMAIN OracleGoldenGate
EXTTRAIL ./dirdat/lt

-- DDL レプリケーションの有効化
DDL INCLUDE MAPPED

-- DDL のフィルタリング
-- 特定のスキーマのDDLのみキャプチャ
DDL INCLUDE OBJNAME hr.*
DDL EXCLUDE OBJNAME hr.temp_*

TABLE hr.*;
-- Replicat パラメータ(DDL有効化)
REPLICAT rep1
USERIDALIAS ogg_tgt DOMAIN OracleGoldenGate

DDL INCLUDE MAPPED
DDLERROR DEFAULT DISCARD RETRYOP MAXRETRIES 3

MAP hr.*, TARGET hr.*;

8.3 Classic Mode での DDL レプリケーション

Classic Architecture では、DDLレプリケーション用のトリガーとメタデータテーブルのインストールが必要。

-- ソースDBでのDDLサポートオブジェクトのインストール
-- marker_setup.sql はOGG_HOMEに含まれる
@marker_setup.sql
@ddl_setup.sql
@role_setup.sql
GRANT GGS_GGSUSER_ROLE TO ogg_admin;
@ddl_enable.sql

-- インストール確認
@ddl_status.sql

8.4 DDL レプリケーションの注意点

  1. テーブルスペース: ターゲットに同名のテーブルスペースが存在しない場合、DDLは失敗する。DDLSUBST パラメータで置換可能
  2. ストレージ句: ソース固有のストレージパラメータは DDL REMOVECOMMENTS で除去可能
  3. 権限: DDLを実行するOGGユーザーに適切な権限が必要
  4. パフォーマンス: 大量のDDL操作はレプリケーションのラグを増大させる可能性がある
-- DDLサブスティテューションの例
DDLSUBST 'TABLESPACE users' WITH 'TABLESPACE users_tgt'
DDLSUBST 'STORAGE (INITIAL' WITH '/* STORAGE (INITIAL'
DDLSUBST 'FREELISTS' WITH 'FREELISTS */ /*'

9. コンフリクト検出と解決(CDR)

9.1 コンフリクトの種類

双方向レプリケーションやマルチマスター環境では、同一レコードが複数のサイトで同時に変更される可能性がある。主なコンフリクトの種類は以下の通りである。

1. Update コンフリクト(更新競合)

同一レコードが2つのサイトで異なる値に更新された場合に発生する。

サイトA: UPDATE employees SET salary = 50000 WHERE employee_id = 101;
サイトB: UPDATE employees SET salary = 55000 WHERE employee_id = 101;

2. Insert コンフリクト(挿入競合)

同一のプライマリキー値を持つレコードが2つのサイトで同時に挿入された場合に発生する。

サイトA: INSERT INTO employees (employee_id, ...) VALUES (999, ...);
サイトB: INSERT INTO employees (employee_id, ...) VALUES (999, ...);

3. Delete コンフリクト(削除競合)

あるサイトでレコードが削除された後、別のサイトでそのレコードに対する更新が到着した場合に発生する。

サイトA: DELETE FROM employees WHERE employee_id = 101;
サイトB: UPDATE employees SET salary = 50000 WHERE employee_id = 101; -- 到着時に対象レコードが存在しない

9.2 CDR(Conflict Detection and Resolution)の設定

OGGでは、Replicat パラメータ内でコンフリクト検出と解決のルールを定義する。

コンフリクト検出の設定

-- rep_bidir.prm
REPLICAT rep_bidir
USERIDALIAS ogg_siteA DOMAIN OracleGoldenGate

-- コンフリクト検出と解決の設定
MAP hr.employees, TARGET hr.employees, &
  COMPARECOLS (ON UPDATE ALL, ON DELETE ALL), &
  RESOLVECONFLICT (UPDATEROWEXISTS, (DEFAULT, USEMAX (last_modified_date))), &
  RESOLVECONFLICT (INSERTROWEXISTS, (DEFAULT, USEMAX (last_modified_date))), &
  RESOLVECONFLICT (DELETEROWEXISTS, (DEFAULT, OVERWRITE)), &
  RESOLVECONFLICT (UPDATEROWMISSING, (DEFAULT, DISCARD)), &
  RESOLVECONFLICT (DELETEROWMISSING, (DEFAULT, DISCARD));

解決ストラテジーの種類

ストラテジー説明
USEMAX(column)指定カラムの値が大きい方を採用(タイムスタンプベースの解決に最適)
USEMIN(column)指定カラムの値が小さい方を採用
OVERWRITEソース(到着データ)で無条件に上書き
DISCARD到着データを破棄(ターゲット側のデータを維持)
USEDELTA数値カラムの差分を加算(在庫カウンタなどに有用)

9.3 AutoCDR(OGG 21c以降)

Oracle GoldenGate 21c では AutoCDR(Automatic Conflict Detection and Resolution)が導入された。AutoCDR は、データベース側に組み込まれたCDR機能であり、OGG レベルでの設定を大幅に簡素化する。

-- AutoCDR の有効化(Oracle Database 側)
BEGIN
  DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR(
    schema_name     => 'HR',
    table_name      => 'EMPLOYEES',
    conflict_handler => DBMS_GOLDENGATE_ADM.LATEST_TIMESTAMP,
    timestamp_column => 'LAST_MODIFIED_DATE'
  );
END;
/

-- AutoCDR の状態確認
SELECT * FROM DBA_GOLDENGATE_AUTO_CDR;

10. パフォーマンスチューニング

10.1 Extract のチューニング

トランザクションログ読み取りの最適化

-- ext1.prm のパフォーマンスチューニング

-- Integrated Extract の SGA 使用量
TRANLOGOPTIONS INTEGRATEDPARAMS (MAX_SGA_SIZE 512)

-- キャッシュマネージャの設定
-- 大量のUPDATE操作がある場合、キャッシュを増やす
CACHEMGR CACHESIZE 4G
CACHEMGR CACHEDIRECTORY /u01/ogg_cache 20G

-- フェッチの最適化
-- UPDATE時にプライマリキー以外のカラムもフェッチ
FETCHOPTIONS FETCHPKUPDATECOLS
-- フェッチ失敗時の動作
FETCHOPTIONS MISSINGCOLS (REPORT)

-- バッチ処理の最適化
GROUPTRANSOPS 10000

-- I/O最適化
EOFDELAY 1
EOFDELAYCSECS 100

-- 大きなトランザクションの管理
WARNLONGTRANS 2H, CHECKINTERVAL 30M

不要なテーブルの除外

-- 一時テーブルや監査テーブルを除外してExtract負荷を軽減
TABLE hr.*;
TABLEEXCLUDE hr.temp_*;
TABLEEXCLUDE hr.audit_log;
TABLEEXCLUDE hr.session_data;

10.2 Data Pump のチューニング

-- pump1.prm のパフォーマンスチューニング

EXTRACT pump1
USERIDALIAS ogg_src DOMAIN OracleGoldenGate

-- ネットワーク転送の最適化
RMTHOST target-host, MGRPORT 7809, COMPRESS, COMPRESSTHRESHOLD 500
-- TCP バッファサイズの調整(バイト単位)
-- TCPBUFSIZE 262144

-- リモートTrail
RMTTRAIL ./dirdat/rt

-- パススルーモード(変換なしの高速転送)
PASSTHRU

-- 複数Data Pumpによる並列送信
-- テーブル範囲で分割する例
TABLE hr.employees;
TABLE hr.departments;

複数の Data Pump を使用する場合のテーブル分割例:

-- pump_hr.prm(HRスキーマ用)
EXTRACT pump_hr
RMTHOST target-host, MGRPORT 7809, COMPRESS
RMTTRAIL ./dirdat/rh
PASSTHRU
TABLE hr.*;

-- pump_sales.prm(SALESスキーマ用)
EXTRACT pump_sales
RMTHOST target-host, MGRPORT 7809, COMPRESS
RMTTRAIL ./dirdat/rs
PASSTHRU
TABLE sales.*;

10.3 Replicat のチューニング

Parallel Replicat の最適化

-- rep1.prm のパフォーマンスチューニング

REPLICAT rep1
USERIDALIAS ogg_tgt DOMAIN OracleGoldenGate

-- 並列度の設定
MAP_PARALLELISM 6
MIN_APPLY_PARALLELISM 4
MAX_APPLY_PARALLELISM 12

-- 大きなトランザクションの分割
SPLIT_TRANS_RECS 5000

-- バッチ適用の最適化
GROUPTRANSOPS 5000

-- 配列バインドによるバッチINSERT
BATCHSQL BATCHTRANSOPS 5000, OPSPERBATCH 2000

-- SQL キャッシュの最適化
SQLEXEC_CACHE_SIZE 4096

BATCHSQL の詳細設定

BATCHSQL は、複数の同一SQL文をバッチ実行することでReplicatのパフォーマンスを大幅に向上させる機能である。

-- BATCHSQL の詳細設定例
BATCHSQL &
  BATCHTRANSOPS 5000, &       -- バッチあたりのトランザクション操作数
  OPSPERBATCH 2000, &         -- バッチあたりの操作数
  BYTESPERARRAY 524288, &     -- 配列バインドの最大バイト数
  OPSPERARRAY 500             -- 配列バインドの最大操作数

10.4 パフォーマンスモニタリング指標

主要なモニタリング指標

指標確認方法推奨値
Extract ラグLAG EXTRACT ext1< 5秒
Replicat ラグLAG REPLICAT rep1< 10秒
Trail ファイルバックログINFO EXTRACT ext1, DETAIL1-2ファイル以下
Extract スループットSTATS EXTRACT ext1, TOTAL環境依存
Replicat スループットSTATS REPLICAT rep1, TOTAL環境依存
チェックポイント遅延INFO EXTRACT ext1, SHOWCH最小限

統計情報の詳細表示

-- Extract の統計(テーブル別)
GGSCI> STATS EXTRACT ext1, TABLE hr.employees

-- 期間指定の統計
GGSCI> STATS EXTRACT ext1, HOURLY
GGSCI> STATS EXTRACT ext1, DAILY
GGSCI> STATS EXTRACT ext1, TOTAL, REPORTRATE HR

-- Replicat の統計(操作タイプ別)
GGSCI> STATS REPLICAT rep1, TOTAL, TABLE hr.employees, REPORTDETAIL

11. Microservices Architecture の運用

11.1 デプロイメントの作成

MA環境のセットアップには oggca.sh(Oracle GoldenGate Configuration Assistant)を使用する。

# デプロイメントの作成(対話型)
$ cd $OGG_HOME
$ ./bin/oggca.sh

# サイレントモードでの作成
$ ./bin/oggca.sh \
  -silent \
  -responseFile /path/to/response.rsp

レスポンスファイルの例:

# oggca_response.rsp
oracle.install.responseFileVersion=/oracle/install/rspfmt_oggca_response_schema_v21_1_0
CONFIGURATION_OPTION=ADD
DEPLOYMENT_NAME=oggdeploy1
ADMINISTRATOR_USER=oggadmin
ADMINISTRATOR_PASSWORD=SecurePass123#
SERVICEMANAGER_PORT=9100
OGG_SOFTWARE_HOME=/u01/app/ogg
OGG_DEPLOYMENT_HOME=/u01/ogg/deployments/oggdeploy1
HOST_NAME=ogg-host.example.com
CREATE_NEW_SERVICEMANAGER=true
REGISTER_SERVICEMANAGER_AS_A_SERVICE=true
INTEGRATE_METRICS_SERVER=true
OGG_SCHEMA=ogg_admin

11.2 Distribution Path の設定

MA では Data Pump の代わりに Distribution Server 上で Distribution Path を設定する。

# Distribution Path の作成(REST API)
curl -u oggadmin:password -X POST \
  https://ogg-host:9102/services/v2/sources \
  -H "Content-Type: application/json" \
  -d '{
    "name": "distpath1",
    "source": {
      "trailName": "lt",
      "trailSubDirectoryMapping": {
        "name": "oggdeploy1"
      }
    },
    "target": {
      "uri": "wss://target-ogg-host:9103/services/v2/targets?trail=rt",
      "authMode": "oauth"
    },
    "status": "running"
  }'

11.3 Performance Metrics Server の活用

Performance Metrics Server は Prometheus 互換のメトリクスエンドポイントを提供する。

# メトリクスの取得
curl -u oggadmin:password \
  https://ogg-host:9104/services/v2/metrics

# Prometheus の scrape_config 設定例
scrape_configs:
  - job_name: 'oracle-goldengate'
    scheme: https
    basic_auth:
      username: oggadmin
      password: SecurePass123#
    tls_config:
      insecure_skip_verify: true
    static_configs:
      - targets: ['ogg-host:9104']

主要なメトリクス:

メトリクス説明
ogg_extract_lag_secondsExtract のレプリケーションラグ(秒)
ogg_replicat_lag_secondsReplicat のレプリケーションラグ(秒)
ogg_extract_bytes_processedExtract の処理バイト数
ogg_replicat_operations_appliedReplicat の適用操作数
ogg_trail_bytes_writtenTrail ファイルの書き込みバイト数

12. モニタリングと管理

12.1 GGSCI による日常運用

日次チェック項目

-- 1. 全プロセスの状態確認
GGSCI> INFO ALL

Program     Status      Group       Lag at Chkpt  Time Since Chkpt
MANAGER     RUNNING
EXTRACT     RUNNING     EXT1        00:00:02      00:00:01
EXTRACT     RUNNING     PUMP1       00:00:03      00:00:01
REPLICAT    RUNNING     REP1        00:00:05      00:00:02

-- 2. ラグの確認
GGSCI> LAG EXTRACT ext1
GGSCI> LAG REPLICAT rep1

-- 3. エラーの確認
GGSCI> VIEW REPORT ext1
GGSCI> VIEW REPORT rep1

-- 4. 統計情報の確認
GGSCI> STATS EXTRACT ext1, TOTAL, REPORTRATE HR
GGSCI> STATS REPLICAT rep1, TOTAL, REPORTRATE HR

-- 5. Trail ファイルのディスク使用量確認
GGSCI> INFO EXTTRAIL ./dirdat/lt, DETAIL
GGSCI> INFO EXTTRAIL ./dirdat/rt, DETAIL

トラブルシューティングコマンド

-- プロセスの詳細情報(チェックポイント含む)
GGSCI> INFO EXTRACT ext1, DETAIL
GGSCI> INFO EXTRACT ext1, SHOWCH

-- プロセスの現在位置
GGSCI> STATUS EXTRACT ext1
GGSCI> STATUS REPLICAT rep1

-- レポートファイルの表示(エラーログ含む)
GGSCI> VIEW REPORT ext1
GGSCI> VIEW REPORT rep1

-- 最新のN行を表示
GGSCI> VIEW REPORT rep1, LAST 100

12.2 アラートとモニタリング

OGG のログファイル構成

$OGG_HOME/
├── ggserr.log           # 全体エラーログ(全プロセスの重要メッセージ)
├── dirrpt/
│   ├── EXT1_info.log   # Extractプロセスのレポート
│   ├── PUMP1_info.log  # Data Pumpのレポート
│   ├── REP1_info.log   # Replicatのレポート
│   └── MGR_info.log    # Managerのレポート
└── dirpcs/              # プロセスステータスファイル

外部監視スクリプトの例

#!/bin/bash
# ogg_monitor.sh - OGG モニタリングスクリプト

OGG_HOME=/u01/app/ogg
LAG_THRESHOLD_SEC=60
EMAIL_TO="dba-team@example.com"

# プロセス状態チェック
check_process_status() {
    local status=$($OGG_HOME/ggsci << EOF
INFO ALL
EXIT
EOF
)
    
    # ABENDEDまたはSTOPPEDプロセスの検出
    echo "$status" | grep -E "ABENDED|STOPPED" | while read line; do
        local process=$(echo "$line" | awk '{print $3}')
        send_alert "OGG Process $process is not running: $line"
    done
}

# ラグチェック
check_lag() {
    local lag_output=$($OGG_HOME/ggsci << EOF
LAG EXTRACT ext1
LAG REPLICAT rep1
EXIT
EOF
)
    
    echo "$lag_output" | grep -oP 'Lag: \K[0-9:]+' | while read lag; do
        local hours=$(echo "$lag" | cut -d: -f1)
        local minutes=$(echo "$lag" | cut -d: -f2)
        local seconds=$(echo "$lag" | cut -d: -f3)
        local total_seconds=$((hours*3600 + minutes*60 + seconds))
        
        if [ $total_seconds -gt $LAG_THRESHOLD_SEC ]; then
            send_alert "OGG lag exceeds threshold: ${lag} (threshold: ${LAG_THRESHOLD_SEC}s)"
        fi
    done
}

send_alert() {
    local message="$1"
    echo "$message" | mail -s "OGG Alert: $(hostname)" $EMAIL_TO
    logger -t ogg_monitor "$message"
}

# メインループ
check_process_status
check_lag

13. セキュリティ

13.1 認証と認可

データベースレベルのセキュリティ

OGG用のデータベースユーザーには、最小権限の原則に基づいて必要な権限のみを付与する。

-- ソース側(Extract用)の最小権限セット
CREATE USER ogg_extract IDENTIFIED BY "StrongPassword1#";

-- 基本権限
GRANT CREATE SESSION TO ogg_extract;
GRANT ALTER SESSION TO ogg_extract;
GRANT SELECT ANY DICTIONARY TO ogg_extract;
GRANT SELECT ANY TABLE TO ogg_extract;
GRANT FLASHBACK ANY TABLE TO ogg_extract;

-- Integrated Extract 用の権限
EXEC DBMS_GOLDENGATE_AUTH.GRANT_ADMIN_PRIVILEGE('ogg_extract', 'CAPTURE');

-- ターゲット側(Replicat用)の最小権限セット
CREATE USER ogg_replicat IDENTIFIED BY "StrongPassword2#";

GRANT CREATE SESSION TO ogg_replicat;
GRANT ALTER SESSION TO ogg_replicat;
GRANT SELECT ANY DICTIONARY TO ogg_replicat;

-- 対象テーブルへのDML権限(個別に付与が推奨)
GRANT INSERT, UPDATE, DELETE ON hr.employees TO ogg_replicat;
GRANT INSERT, UPDATE, DELETE ON hr.departments TO ogg_replicat;

-- Integrated Replicat 用の権限
EXEC DBMS_GOLDENGATE_AUTH.GRANT_ADMIN_PRIVILEGE('ogg_replicat', 'APPLY');

クレデンシャルストア

パスワードをパラメータファイルに平文で記述することを避けるため、クレデンシャルストアを使用する。

-- クレデンシャルストアの作成(AES-256暗号化)
GGSCI> ADD CREDENTIALSTORE

-- エントリの追加
GGSCI> ALTER CREDENTIALSTORE ADD USER ogg_extract@orcl_src &
       PASSWORD StrongPassword1# ALIAS ogg_src DOMAIN OracleGoldenGate

-- エントリの更新(パスワードローテーション時)
GGSCI> ALTER CREDENTIALSTORE ALTER USER ogg_extract@orcl_src &
       PASSWORD NewStrongPassword3# ALIAS ogg_src

-- エントリの削除
GGSCI> ALTER CREDENTIALSTORE DELETE USER ogg_extract@orcl_src ALIAS ogg_src

13.2 通信の暗号化

ネットワーク暗号化

OGG プロセス間の通信を暗号化する。

-- Data Pump パラメータでの暗号化設定
EXTRACT pump1
RMTHOST target-host, MGRPORT 7809, ENCRYPT AES256

-- OGGNetパラメータファイル(ogg.net)での設定
INCLUDE /u01/app/ogg/dirogg/ogg.net
-- ogg.net の内容
-- OGGNet::TLS::Required=TRUE
-- OGGNet::TLS::CertificateFile=/u01/app/ogg/ssl/ogg_cert.pem
-- OGGNet::TLS::PrivateKeyFile=/u01/app/ogg/ssl/ogg_key.pem
-- OGGNet::TLS::CAFile=/u01/app/ogg/ssl/ca_cert.pem

MA のTLS設定

Microservices Architecture では、全通信がHTTPS/WSSで暗号化される。

# 自己署名証明書の作成(テスト環境用)
$ keytool -genkey -alias oggma -keyalg RSA -keysize 2048 \
  -keystore $OGG_HOME/ssl/keystore.jks \
  -storepass changeit -keypass changeit \
  -dname "CN=ogg-host.example.com,OU=DBA,O=Company,L=Tokyo,ST=Tokyo,C=JP" \
  -validity 365

# 信頼ストアへの証明書インポート
$ keytool -export -alias oggma \
  -keystore $OGG_HOME/ssl/keystore.jks \
  -storepass changeit \
  -file $OGG_HOME/ssl/ogg_cert.cer

$ keytool -import -alias oggma_target \
  -keystore $OGG_HOME/ssl/truststore.jks \
  -storepass changeit \
  -file /path/to/target_ogg_cert.cer \
  -noprompt

Trail ファイルの暗号化

-- Extract パラメータでTrail暗号化を有効化
EXTRACT ext1
ENCRYPTTRAIL AES256
EXTTRAIL ./dirdat/lt
TABLE hr.*;

-- Replicat側では自動的に復号される(同一のマスターキーが必要)
-- マスターキーの作成
GGSCI> CREATE MASTERKEY
GGSCI> INFO MASTERKEY

13.3 データマスキングとフィルタリング

セキュリティ要件に基づき、特定のカラムデータをマスキングしてレプリケーションすることができる。

-- Replicat パラメータでのデータマスキング例
MAP hr.employees, TARGET hr.employees, &
  COLMAP (USEDEFAULTS, &
          -- SSN(社会保障番号)をマスキング
          ssn = @STREXT(ssn, 1, 3) || '-XX-XXXX', &
          -- メールアドレスをマスキング
          email = @STRCAT('user', @NUMSTR(employee_id), '@masked.com'), &
          -- 給与を非表示(固定値で置換)
          salary = 0);

-- 特定のカラムをレプリケーション対象から除外
MAP hr.employees, TARGET hr.employees, &
  COLSEXCEPT (ssn, credit_card_number, bank_account);

14. トラブルシューティング

14.1 よくある問題と解決策

1. Extract が ABENDED(異常終了)する

症状: Extract プロセスが起動後すぐ、または稼働中に ABENDED 状態になる。

診断手順:

-- レポートファイルでエラー内容を確認
GGSCI> VIEW REPORT ext1

-- ggserr.log でエラー詳細を確認
$ tail -200 $OGG_HOME/ggserr.log

-- プロセスの詳細情報
GGSCI> INFO EXTRACT ext1, DETAIL

よくある原因と対処:

エラー原因対処
OGG-00868: Archived log not foundアーカイブログが削除されたExtract のチェックポイントを前進させるか、RMANのアーカイブログ保持期間を延長
OGG-01028: Insufficient privileges権限不足DBMS_GOLDENGATE_AUTH.GRANT_ADMIN_PRIVILEGE を実行
OGG-00664: OCI ErrorOracle クライアントの問題ORACLE_HOMELD_LIBRARY_PATH を確認
OGG-02091: Cannot find table definitionテーブル定義が見つからないDEFGEN でテーブル定義ファイルを再生成

2. Replicat の適用遅延(ラグ増大)

診断手順:

-- ラグの確認
GGSCI> LAG REPLICAT rep1

-- 統計情報でボトルネックを特定
GGSCI> STATS REPLICAT rep1, TABLE *, REPORTDETAIL

-- チェックポイント情報
GGSCI> INFO REPLICAT rep1, SHOWCH

対処法:

  • Parallel/Coordinated Replicat への移行
  • GROUPTRANSOPSBATCHSQL パラメータの調整
  • 並列度(MAP_PARALLELISM)の増加
  • ターゲットDBのインデックス最適化(プライマリキーの確認)
  • 大きなトランザクションの SPLIT_TRANS_RECS 設定

3. ネットワーク障害後のリカバリ

-- Data Pump の状態確認
GGSCI> INFO EXTRACT pump1, DETAIL

-- 接続が切れた場合、Data Pump は自動的にリトライする
-- Manager の AUTORESTART 設定を確認
GGSCI> VIEW PARAMS mgr

-- 手動でのリカバリが必要な場合
GGSCI> STOP EXTRACT pump1
GGSCI> START EXTRACT pump1

4. チェックポイントの問題

-- チェックポイント位置の確認
GGSCI> INFO EXTRACT ext1, SHOWCH

-- チェックポイントの手動変更(注意: データ損失・重複の可能性)
GGSCI> ALTER EXTRACT ext1, BEGIN 2024-03-15 10:00:00
GGSCI> ALTER REPLICAT rep1, EXTSEQNO 1, EXTRBA 0

-- 特定のTrailファイル位置からの再開
GGSCI> ALTER REPLICAT rep1, EXTSEQNO 5, EXTRBA 1234567

14.2 テーブル定義ファイル(DEF ファイル)

異種データベース間やスキーマが異なる環境では、テーブル定義ファイルが必要。

# DEF ファイルの生成
$ cd $OGG_HOME
$ ./defgen PARAMFILE dirprm/defgen_src.prm
-- defgen_src.prm
DEFSFILE ./dirdef/source_defs.def PURGE
USERIDALIAS ogg_src DOMAIN OracleGoldenGate
TABLE hr.employees;
TABLE hr.departments;
TABLE hr.job_history;
-- Replicat パラメータでのDEFファイル指定
REPLICAT rep1
USERIDALIAS ogg_tgt DOMAIN OracleGoldenGate
SOURCEDEFS ./dirdef/source_defs.def
MAP hr.employees, TARGET hr.employees;

14.3 データ整合性の検証

OGG には veridata というデータ比較ツールが提供されている(別途ライセンス)。簡易的な検証には以下のアプローチを使用する。

-- ソース側のレコード数確認
SELECT table_name, num_rows
FROM all_tables
WHERE owner = 'HR'
ORDER BY table_name;

-- ターゲット側と比較
-- チェックサムベースの比較
SELECT ORA_HASH(
  DBMS_UTILITY.GET_HASH_VALUE(
    employee_id || last_name || salary, 0, 1073741824
  )
) AS checksum
FROM hr.employees;

15. ベストプラクティスと運用ガイドライン

15.1 設計・構築フェーズ

テーブル設計の推奨事項

  1. プライマリキーの設定: すべてのレプリケーション対象テーブルにプライマリキーまたはユニーク制約を設定する。キーがないテーブルでは全カラム比較が必要になり、パフォーマンスが大幅に低下する

  2. Supplemental Logging: 必要最小限の supplemental logging を設定する

-- テーブルレベルで必要なカラムのみ
ALTER TABLE hr.employees ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
ALTER TABLE hr.employees ADD SUPPLEMENTAL LOG DATA (UNIQUE INDEX) COLUMNS;
-- または、全カラム(シンプルだがログ量が増大)
ALTER TABLE hr.employees ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
  1. LOB カラム: Large Object(LOB)カラムのレプリケーションはパフォーマンスに影響する。可能であれば LOB の使用を最小化するか、別テーブルに分離する

  2. トリガーの管理: ターゲット側のトリガーは、Replicat による適用時に意図しない副作用を引き起こす可能性がある

-- Replicat パラメータでトリガー無効化
DBOPTIONS SUPPRESSTRIGGERS

ネットワーク設計

  1. 専用ネットワーク: 可能であれば、OGGレプリケーション用の専用ネットワーク回線を確保する
  2. 帯域幅の見積もり: ピーク時のトランザクション量から必要な帯域幅を算出する
    • 目安: 1GB/時間のRedo生成量に対し、約10-20 Mbpsの帯域幅が必要
  3. 圧縮の活用: WAN環境では必ず COMPRESS オプションを使用する

15.2 運用フェーズ

監視項目と推奨閾値

監視項目警告閾値重大閾値確認頻度
Extract ラグ30秒60秒1分間隔
Replicat ラグ60秒300秒1分間隔
Trail ファイルバックログ5ファイル10ファイル5分間隔
ディスク使用率(dirdat)70%85%5分間隔
プロセス状態STOPPEDABENDED1分間隔
ggserr.log エラーWARNINGERROR/CRITICALリアルタイム

バックアップとリカバリ

  1. OGG環境のバックアップ対象:

    • パラメータファイル(dirprm/*.prm
    • クレデンシャルストア(dircrd/
    • チェックポイントファイル(dirchk/
    • テーブル定義ファイル(dirdef/
    • マスターキーウォレット
  2. Trail ファイル: バックアップ不要(再生成可能、ただし保持期間に注意)

  3. リカバリ手順のテスト: 定期的にリカバリ手順をテストし、手順書を最新に保つ

パッチ適用とアップグレード

  1. ローリングアップグレード: OGG はローリングアップグレードをサポートする。以下の順序で適用する:

    • ターゲット側 OGG のアップグレード(Replicat を停止→アップグレード→再開)
    • ソース側 OGG のアップグレード(Extract/Pump を停止→アップグレード→再開)
  2. 互換性マトリクス: アップグレード前に Oracle のサポートマトリクスを確認し、OGG バージョンとデータベースバージョンの互換性を確認する

15.3 クラウド環境でのOGG

Oracle Cloud Infrastructure(OCI)での利用

Oracle GoldenGate は OCI 上でマネージドサービスとして提供されている(OCI GoldenGate)。

OCI GoldenGate の特徴:

  • フルマネージド型サービス(インフラ管理不要)
  • 自動パッチ適用とバックアップ
  • Oracle Autonomous Database、Exadata との統合
  • REST APIによる完全自動化
  • 従量課金モデル

OCI GoldenGate の構成例:

[オンプレミス Oracle DB]
    └── OGG Extract (オンプレミス)
          └── ネットワーク(VPN/FastConnect)
                └── [OCI GoldenGate Service]
                      └── Replicat
                            └── [Autonomous Database]

ハイブリッドクラウド構成

-- オンプレミス → クラウド のマイグレーション構成
[オンプレミス]                          [OCI]
Oracle DB 19c ──Extract──>          OCI GoldenGate
                  │                      │
              Data Pump ──────────> Receiver Server
                                        │
                                    Replicat
                                        │
                                  Autonomous DB

15.4 OGG のライセンスと製品エディション

エディション特徴
Oracle GoldenGateフル機能版。Oracle Database Enterprise Edition に含まれるオプション
OGG for Non-Oracle非Oracle データベースとの連携用
OGG for Big DataKafka、HDFS、Spark 等のBigData プラットフォーム向け
OGG Free無償版。機能制限あり(最大20GB/日のデータ処理)
OCI GoldenGateOracle Cloud 上のマネージドサービス

16. データ変換とマッピング機能

16.1 カラムマッピング(COLMAP)

OGGは柔軟なデータ変換機能を提供する。

-- 基本的なカラムマッピング
MAP src.orders, TARGET tgt.fact_orders, &
  COLMAP (USEDEFAULTS, &
          -- カラム名の変更
          order_key = order_id, &
          -- 定数値の設定
          source_system = 'PROD_DB', &
          -- 日付変換
          order_date_key = @DATE('YYYY-MM-DD', 'YYYYMMDD', order_date), &
          -- 数式
          total_with_tax = @COMPUTE(total_amount * 1.10), &
          -- 文字列操作
          full_name = @STRCAT(first_name, ' ', last_name), &
          -- 条件分岐
          region_name = @IF(@STREQ(region_code, 'JP'), 'Japan', &
                        @IF(@STREQ(region_code, 'US'), 'United States', 'Other')), &
          -- 現在のタイムスタンプ
          etl_load_time = @DATENOW());

16.2 組み込み関数

OGGには豊富な組み込み関数がある。

文字列関数

関数説明
@STRCAT(s1, s2, ...)文字列結合@STRCAT(first, ' ', last)
@STREXT(s, start, end)部分文字列抽出@STREXT(phone, 1, 3)
@STRLEN(s)文字列長@STRLEN(name)
@STRUP(s)大文字変換@STRUP(name)
@STRLOW(s)小文字変換@STRLOW(email)
@STREQ(s1, s2)文字列比較@STREQ(status, 'A')
@STRTRIM(s)前後の空白除去@STRTRIM(name)
@STRFIND(s, sub)部分文字列検索@STRFIND(url, 'https')

日付関数

関数説明
@DATE(fmt1, fmt2, val)日付フォーマット変換@DATE('YYYY-MM-DD','YYYYMMDD',dt)
@DATENOW()現在日時@DATENOW()
@DATEDIFF(unit, d1, d2)日付差@DATEDIFF('DD', start, end)
@DATEADD(unit, amt, dt)日付加算@DATEADD('HH', 9, utc_time)

数値・制御関数

関数説明
@COMPUTE(expr)数式計算@COMPUTE(qty * price)
@IF(cond, t, f)条件分岐@IF(amt>0,'CR','DR')
@COLTEST(col, test)NULL判定等@COLTEST(col, MISSING)
@GETENV(info)環境情報取得@GETENV('TRANSACTION','CSN')
@NUMSTR(n)数値→文字列@NUMSTR(employee_id)
@STRNUM(s)文字列→数値@STRNUM(amount_str)
@TOKEN(name)ユーザートークン取得@TOKEN('TKN-HOST')

16.3 フィルタリング

-- WHERE句によるフィルタリング
MAP hr.employees, TARGET hr.employees, &
  WHERE (department_id = 90);

-- FILTER関数によるフィルタリング(より高度)
MAP hr.employees, TARGET hr.employees, &
  FILTER (@STREQ(status, 'ACTIVE') AND @COMPUTE(salary > 50000));

-- 操作タイプによるフィルタリング
-- INSERT のみレプリケーション
MAP audit.events, TARGET audit.events, &
  FILTER (@GETENV('GGHEADER', 'OPTYPE') = 'INSERT');

17. 高度な構成パターン

17.1 初期データロード

既存データの初期同期には以下の方法がある。

OGG Initial Load(OGG自身による初期ロード)

-- ソース側: Initial Load Extract の設定
GGSCI> ADD EXTRACT initext, SOURCEISTABLE

-- パラメータファイル
-- initext.prm
EXTRACT initext
USERIDALIAS ogg_src DOMAIN OracleGoldenGate
RMTHOST target-host, MGRPORT 7809
RMTFILE ./dirdat/ri
TABLE hr.employees;
TABLE hr.departments;
-- ターゲット側: Initial Load Replicat の設定
GGSCI> ADD REPLICAT initrep, SPECIALRUN

-- パラメータファイル
-- initrep.prm
REPLICAT initrep
USERIDALIAS ogg_tgt DOMAIN OracleGoldenGate
SOURCEDEFS ./dirdef/source_defs.def
DISCARDFILE ./dirrpt/initrep.dsc, PURGE
MAP hr.employees, TARGET hr.employees;
MAP hr.departments, TARGET hr.departments;

Oracle Data Pump + OGG の併用(推奨)

大量データの初期ロードでは、Oracle Data Pump(expdp/impdp)とOGGを組み合わせる方法が最も効率的。

手順:
1. Extract を起動してRedo変更のキャプチャを開始(Replicat はまだ起動しない)
2. ソースDBでData Pump Export(SCN指定)を実行
3. ターゲットDBでData Pump Import を実行
4. Import完了後、Replicat をExport時のSCNから起動
-- Step 1: Extract 起動前に現在のSCNを記録
SELECT CURRENT_SCN FROM V$DATABASE;  -- 例: 1234567

-- Step 2: Extract を起動
GGSCI> START EXTRACT ext1

-- Step 3: Data Pump Export(SCN指定)
$ expdp ogg_admin/password@orcl_src \
    SCHEMAS=hr \
    DIRECTORY=dp_dir \
    DUMPFILE=hr_export.dmp \
    FLASHBACK_SCN=1234567

-- Step 4: Data Pump Import
$ impdp ogg_admin/password@orcl_tgt \
    SCHEMAS=hr \
    DIRECTORY=dp_dir \
    DUMPFILE=hr_export.dmp \
    TABLE_EXISTS_ACTION=REPLACE

-- Step 5: Replicat を SCN 1234567 以降から起動
GGSCI> ADD REPLICAT rep1, PARALLEL, EXTTRAIL ./dirdat/rt, BEGIN 2024-03-15 10:00:00
-- または SCN ベースで
GGSCI> START REPLICAT rep1, AFTERCSN 1234567

17.2 LOB データのレプリケーション

Large Object(CLOB、BLOB、NCLOB)のレプリケーションには追加の設定が必要。

-- Extract パラメータ
EXTRACT ext1
USERIDALIAS ogg_src DOMAIN OracleGoldenGate

-- LOBの取得設定
FETCHOPTIONS FETCHPKUPDATECOLS
-- インラインLOBの閾値(バイト)
-- これより小さいLOBはTrailに直接格納
DBOPTIONS ALLOWLOBDATATRUNCATE

EXTTRAIL ./dirdat/lt
TABLE hr.employees;
TABLE hr.documents;  -- BLOB/CLOBカラムを含むテーブル

17.3 Integrated Diagnostics Pack(IDP)

OGG には組み込みの診断ツールが含まれる。

# 診断バンドルの生成
$ cd $OGG_HOME
$ ./diag/ogg_diag_collector.sh

# 生成される診断情報:
# - 全プロセスのパラメータファイル
# - レポートファイル
# - ggserr.log
# - チェックポイント情報
# - Trail ファイルのヘッダ情報
# - OS レベルの情報(CPU、メモリ、ディスク)

18. まとめ

Oracle GoldenGate は、リアルタイムデータレプリケーションのための業界をリードするソリューションである。本ガイドで解説した内容を以下にまとめる。

アーキテクチャの要点

  1. ログベースCDC: トランザクションログからの変更データキャプチャにより、ソースDBへの影響を最小化
  2. モジュラー設計: Extract → Trail → Data Pump → Trail → Replicat の多段構成により、障害耐性と柔軟性を確保
  3. Classic/MA の選択: 新規構築では Microservices Architecture を推奨。REST API、WebUI、セキュリティ機能が充実
  4. 多様なReplicatモード: ワークロードに応じて Classic、Coordinated、Integrated、Parallel Replicat を選択

運用のポイント

  1. プライマリキー必須: レプリケーション対象テーブルには必ずプライマリキーを設定
  2. ラグ監視: Extract/Replicat のラグを常時監視し、閾値を設定してアラート
  3. クレデンシャルストア: パスワードの平文保存を避け、暗号化されたクレデンシャルストアを使用
  4. BATCHSQL/Parallel Replicat: 大量トランザクション環境では適用パフォーマンスの最適化が重要

ユースケース別推奨構成

ユースケース推奨構成
DR/HA単方向 + Integrated Extract/Replicat
マイグレーションData Pump初期ロード + OGG差分同期
Active-Active双方向 + AutoCDR/CDR
リアルタイムDWH単方向 + BATCHSQL + Parallel Replicat
イベント配信OGG for Big Data + Kafka Handler
クラウド移行OCI GoldenGate マネージドサービス

Oracle GoldenGate の適切な設計・構築・運用により、企業のデータ統合基盤を信頼性高く実現できる。