Oracle データベースからデータをストリーミングする

このセクションには、次に関する情報が含まれています。

  • Datastream が移行元 Oracle データベースから pull されているデータを処理する方法の動作
  • Datastream でサポートされている Oracle データベースのバージョン
  • データが移行先にストリーミングできるように移行元 Oracle データベースを設定する方法の概要
  • Oracle データベースを移行元として使用する場合の既知の制限事項

行動

Datastream は、オンライン REDO ログファイルからデータへの変更を抽出する 2 つの方法(Oracle バイナリログ リーダー(プレビュー)と Oracle LogMiner)をサポートしています。

バイナリログ リーダー方式 (プレビュー)では、次の動作 が確認されます。

  • オンライン ログファイルから変更を抽出する際に読み取り遅延が発生した場合、Datastream はアーカイブ ログファイルから変更を抽出します。

  • Datastream は、commit された変更のみを移行先に複製します。 commit されていないトランザクションまたはロールバックされたトランザクションは複製されません。

  • バイナリ リーダーは、4,000 文字を超える Oracle VARCHAR2 列の複製をサポートしています。

Datastream は、データへの変更を公開する Oracle LogMiner 機能もサポートしています。このメソッドの動作は次のとおりです。

  • 特定のデータベースのすべてのスキーマまたは特定のスキーマ、およびスキーマまたは特定のテーブルのすべてのテーブルを選択できます。
  • 履歴データはすべて複製されます。
  • 指定したデータベースとテーブルからの挿入、更新、削除など、すべてのデータ操作言語(DML)の変更が複製されます。
  • Datastream は、commit された変更と、場合によっては commit されていない変更を移行先に複製します。Datastream は、commit されていない変更を読み取ります。ロールバックの場合、Datastream の出力レコードには反対のオペレーションも含まれます。たとえば、ロールバックの INSERT オペレーションがある場合、出力レコードには対応する DELETE オペレーションも含まれます。この場合、イベントは ROWID のみを含む DELETE イベントとして表示されます。

ROWID ベースのバックフィル

Oracle では、ROWID はテーブル内の行の一意の識別子を格納する疑似列です。Datastream は、バックフィル オペレーションに ROWID 値を使用します。このため、バックフィル オペレーションが完了するまで、ソース Oracle データベースの ROWID 値を変更するようなアクションは行わないことをおすすめします。

ROWID 値を変更できるアクションは次のとおりです。

  • 行の物理的な移動:

    • エクスポートとインポートのオペレーション: テーブルをエクスポートしてからインポートすると、行の物理的な位置が変わり、新しい ROWID 値が生成される可能性があります。
    • ALTER TABLE (...) MOVE コマンド: テーブルを別の表領域に移動すると、物理ストレージが変更され、ROWID が変更される可能性があります。
    • ALTER TABLE (...) SHRINK SPACE コマンド: このコマンドはテーブルを圧縮します。これにより、行を移動して ROWID 値に影響を与える可能性があります。
    • パーティショニング オペレーション: パーティションの分割、マージ、移動により、行の物理的な配置とその ROWID 値を変更できます。
  • フラッシュバック オペレーション:

    • FLASHBACK TABLE コマンド: テーブルを以前の状態に復元するには、行を削除して再挿入するため、新しい ROWID 値が作成されます。
    • FLASHBACK_TRANSACTION_QUERY: FLASHBACK TABLE に類似しています。トランザクション内で行が削除または更新された場合、トランザクションをロールバックすると ROWID が変更される可能性があります。

Oracle 11.2.0.4 パーティション テーブルのバックフィルのトラブルシューティング

Oracle 11.2.0.4 のパーティション テーブルで、予期しないフェッチ エラー(インデックスが範囲外)でバックフィルが失敗する場合は、ALL_OBJECTS へのクエリがサブパーティションを返さない Oracle メタデータのバグが原因です。

  • 回避策: Datastream ユーザーから SELECT ON DBA_EXTENTS 権限を一時的に取り消します(例: REVOKE SELECT ON sys.dba_extents FROM USER_NAME;)。これにより、Datastream はインデックス ベースのバックフィルを使用し、メタデータの問題を回避します。

スタンバイ データベース

Oracle Active Data Guard スタンバイ データベースをソースとして使用する場合、Datastream はアーカイブされた REDO ログを読み取ります。Datastream がスタンバイ データベースに正常に適用された REDO ログのみを処理するようにするには、`V$ARCHIVED_LOG`V$ARCHIVED_LOG や `GV$ARCHIVED_LOG`GV$ARCHIVED_LOG などの標準の Oracle ビューをフィルタして、`APPLIED = 'YES'`APPLIED = 'YES' フィルタを含むレコードのみを含める必要があります。

これは、カスタムビューを作成することで実現できます。Datastream ユーザーにこれらのビューへの適切なアクセス権を付与してください。次に例を示します。

CREATE OR REPLACE VIEW USER_NAME.local_v$archived_log AS 
SELECT * FROM sys.v_$ARCHIVED_LOG
WHERE RESETLOGS_CHANGE# = (SELECT resetlogs_change# FROM v$database)
  AND APPLIED = 'YES';

CREATE OR REPLACE VIEW USER_NAME.local_gv$archived_log AS 
SELECT * FROM sys.gv_$ARCHIVED_LOG
WHERE RESETLOGS_CHANGE# = (SELECT resetlogs_change# FROM v$database)
  AND APPLIED = 'YES';

CREATE SYNONYM USER_NAME.v$archived_log FOR USER_NAME.local_v$archived_log;
CREATE SYNONYM USER_NAME.gv$archived_log FOR USER_NAME.local_gv$archived_log;

APPLIED = 'YES' フィルタを使用すると、データの更新速度に影響します。Datastream は、スタンバイ データベースの Managed Recovery Process(MRP)がログを適用し、APPLIED 列を YES に更新するまで、変更を抽出しません。MRP プロセスが遅延または一時停止した場合(スタンバイ適用プロセスを一時停止した場合など)、複製されたデータの鮮度に直接影響します。Datastream は再試行ループに入り、新しく適用されたアーカイブ ログが使用可能になるまで処理を遅延させます。

この構成は、ラージ オブジェクト(LOB)列を含むテーブルを複製する場合に非常に重要です。UPDATE オペレーションの場合、REDO ログに LOB 列の詳細な値は存在しないため、Datastream はデータベースにクエリを実行して関連する行を取得する必要があります。Datastream が適用されていない REDO ログを処理し、スタンバイ データベースから LOB 値を取得しようとすると、誤った古い値が取得される可能性があります。ログをフィルタして最初に完全に適用することで、Datastream は正しいデータを取得します。

バージョン

Datastream は、次のバージョンの Oracle データベースをサポートしています。

  • Oracle 11g、バージョン 11.2.0.4(Logminer CDC メソッドでのみサポート)
  • Oracle 12c、バージョン 12.1.0.2
  • Oracle 12c、バージョン 12.2.0.1
  • Oracle 18c
  • Oracle 19c
  • Oracle 21c

Datastream は、次の種類の Oracle データベースをサポートしています。

  • オンプレミスまたはクラウド プロバイダのいずれかでセルフホスト
  • Oracle 用の Amazon RDS
  • Oracle Cloud
  • Oracle Exadata
  • Oracle RAC
  • Oracle Active Data Guard スタンバイ データベース

設定

移行元 Oracle データベースを設定して、そのデータが移行先にストリーミングできるようにするには、アクセス権の付与、ロギングの設定、保持ポリシーの定義のために、データベースを構成する必要があります。

Datastream がデータを移行先に pull できるようにこのデータベースを構成する方法については、移行元 Oracle データベースの構成をご覧ください。

ベスト プラクティス

このセクションでは、Datastream で使用する Oracle ソースを構成する際の推奨されるベスト プラクティスについて説明します。

バイナリ リーダーの大文字と小文字の区別

バイナリ リーダー CDC メソッドで Oracle ソースを構成し、REDO ログとアーカイブログのディレクトリ名を指定する場合は、名前で大文字と小文字が区別されることに注意してください。Datastream 接続プロファイルで指定するディレクトリ名が、Oracle データベースのディレクトリ名と完全に一致していることを確認してください。

CDC の同時実行

レプリケーションの遅延を最小限に抑えるには、Datastream が Oracle ソースで作成される REDO ログをできるだけ早く処理できるようにします。バイナリ リーダー CDC メソッドを使用する場合、Datastream の同時実行は REDO ログファイル レベルで行われます。maxConcurrentCdcTasks で定義された各タスクは、一度に 1 つのファイルを処理します。

次の方法を使用することをおすすめします。

  • Datastream の同時実行を調整する: ビジネスのピーク時の REDO ログの切り替えの平均数を特定し、 maxConcurrentCdcTasks パラメータを適切に構成します。詳細については、 CDC タスクの最大数をご覧ください。
  • Oracle ログの切り替えを構成する: Oracle を構成して、ログを頻繁に切り替えます(10 ~ 20 分ごとなど)。これにより、より小さなワークユニットの安定したストリームが作成され、Datastream の同時実行タスクを効果的に並行して実行できます。

Oracle からの小さな REDO ログの頻繁な作成を処理するのに十分な数の同時実行タスクが Datastream に存在するように、設定を最適化することをおすすめします。詳細については、 ストリームの同時実行制御をご覧ください。

既知の制限事項

Oracle データベースを移行元として使用する場合の既知の制限事項は次のとおりです。

  • ストリームは 10,000 テーブルに制限されています。 ストリームに 10,000 個を超えるテーブルが含まれている場合、エラーが発生する可能性があります。
  • Datastream は Oracle マルチテナント アーキテクチャ(CDB/PDB)をサポートしていますが、ストリーム内に複製できるプラガブル データベースは 1 つだけです。
  • Oracle Autonomous データベースはサポートされていません。
  • 主キーのないテーブルの場合、Datastream は行の ROWID を使用して、コンシューマ側でマージ オペレーションを行います。ROWID は一意ではない場合があります。たとえば、Oracle のエクスポート/インポート ユーティリティで行を削除して再度挿入すると、行の ROWID が変更される可能性があります。Oracle で行を削除した場合は、ROWID を後で挿入される新しい行に割り当て直すことができます。
  • 索引構成表(IOT)はサポートされていません。
  • 一時テーブルはサポートされていません。
  • 次の Oracle データ型はサポートされておらず 、複製されません。これらの型の列は、移行先で NULL 値として複製されます。
    • ANYDATAANYDATASETANYTYPE
    • VARRAY(Oracle 配列)
    • BFILEBFILENAME
    • INTERVAL DAY TO SECONDINTERVAL YEAR TO MONTH
    • LONGLONG RAW
    • UROWID
    • UDT
    • メディア型と空間型: ORDAUDIOORDDATASOURCEORDDICOMORDDOCORDIMAGEORDVIDEOSDO_GEOMETRY(その他すべての MDSYS.SDO_* 型)。
  • XMLTYPE、バイナリラージ オブジェクト(BLOB)、文字ラージ オブジェクト(CLOB)国別文字ラージ オブジェクト(NCLOB)などのラージ オブジェクト データ型の列をストリーミングするには、ストリームの構成に streamLargeObjects フラグを含める必要があります。このフラグを含めない場合、Datastream はこのような列をストリーミングせず、これらの列は宛先で NULL 値に置き換えられます。詳細については、Oracle ソースのラージ オブジェクトのストリーミングを有効にするをご覧ください。 これらのデータ型をストリーミングする場合、Datastream はソース データベースにクエリを実行して、欠落している LOB 値を特定の時点(補足と呼ばれるアクティブなルックアップ プロセス)で取得する必要があります。これは、次のような場合に発生します。

    • UPDATE 中に、変更されていない LOB ペイロードが REDO ログから削除された場合
    • バイナリ XML 型を含む DML オペレーション中
    • ストリームが LogMiner メソッドを使用している場合、LOB を含むテーブルに対する解析済み DML 中

    Datastream はデータベースにクエリを実行してこれらの列をストリーミングするため、連続する更新や挿入後の迅速な削除など、迅速な更新を伴うシナリオでは、中間変更がキャプチャされない可能性があります。DELETE オペレーションでは補足はトリガーされません。この制限は、すべての中間変更がキャプチャされることを想定している追記専用書き込みモードを使用する場合に特に重要です。

  • Oracle 11g では、データ型 ANYDATA または UDT の列のあるテーブルはサポートされておらず、テーブル全体が複製されません。

  • Oracle Label Security(OLS)は複製されません。

  • Datastream は、イベントの処理中に移行元から最新のスキーマを定期的に取得します。スキーマが変更されると、古いスキーマが引き続き適用されている間に、新しいスキーマのイベントが読み取られることがあります。この場合、Datastream はスキーマの変更を検出し、スキーマの取得をトリガーして、失敗したイベントを再処理します。

  • 移行元のスキーマに対するすべての変更を自動的に検出できない場合があります。その場合、データが破損する可能性があります。次のスキーマの変更により、データが破損したり、イベントのダウンストリームが処理されなかったりする可能性があります。

    • 列をドロップする
    • テーブルの中央に列を追加する
    • 列のデータ型を変更する
    • 列の並べ替え
    • テーブルをドロップする(新しいデータを追加して同じテーブルを再作成する場合に関連)
    • テーブルを切り捨てる
  • Datastream はビューの複製をサポートしていません。

  • Datastream は、マテリアライズド ビューをサポートしています。ただし、ストリームの実行中に作成された新しいビューは自動的にバックフィルされません。

  • Oracle LogMiner メソッドを使用する場合、SAVEPOINT ステートメントはサポートされておらず、ロールバック時にデータの不一致が発生する可能性があります。

  • バイナリ リーダー メソッドを使用する場合、動的にパーティション化されたテーブルはサポートされていません。

  • Oracle LogMiner メソッドを使用する場合、Datastream は名前が 30 文字を超えるテーブルと列の複製をサポートしていません。

  • Datastream は、Oracle データベース用に次の文字セット エンコードをサポートしています。

    • AL16UTF16
    • AL32UTF8
    • IN8ISCII
    • IW8ISO8859P8
    • JA16SJIS
    • JA16SJISTILDE
    • KO16MSWIN949
    • US7ASCII
    • UTF8
    • WE8ISO8859P1
    • WE8ISO8859P9
    • WE8ISO8859P15
    • WE8MSWIN1252
    • ZHT16BIG5
  • Datastream は、ゼロの日付値の複製をサポートしていません。このような日付は NULL 値に置き換えられます。

  • Datastream は、Oracle Real Application Clusters(RAC)環境の単一クライアント アクセス名(SCAN)機能を使用するデータベースへの直接接続をサポートしていません。考えられるソリューションについては、Oracle ソースの動作と制限事項をご覧ください。

  • ソースが Oracle Active Data Guard スタンバイ データベースの場合、Datastream は表領域レベルの暗号化のみをサポートし、列レベルの暗号化はサポートしていません。

バイナリ リーダーを使用する場合の追加の制限事項

  • 高性能バイナリ リーダー メソッドは、Oracle 12c 以降でのみサポートされています。Oracle 11g 以前のバージョンでは、LogMiner を使用する必要があります。

  • バイナリ リーダーは、次の機能をサポートしていません。

    • Transparent Database Encryption(TDE)
    • ハイブリッド列圧縮
    • ファイルを保護する
    • Amazon RDS ソースでは ASM はサポートされていません。
    • バイナリ リーダー CDC メソッドは、Oracle 11g 以前のバージョンをサポートしていません。

次のステップ

  • Datastream で使用する Oracle ソースの構成方法 を学習する。