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 のパーティション分割テーブルでバックフィルが失敗し、予期しないフェッチエラー(インデックスが範囲外)が発生した場合、これは Oracle のメタデータ バグが原因です。このバグにより、ALL_OBJECTS へのクエリがサブパーティションを返しません。

  • 回避策: Datastream ユーザー(REVOKE SELECT ON sys.dba_extents FROM USER_NAME; など)から SELECT ON DBA_EXTENTS 権限を一時的に取り消します。これにより、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 を使用する必要があります。

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

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

次のステップ