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

Datastream を使用すると、ソース Oracle データベースから過去のデータと継続的な変更を宛先にストリーミングして、リアルタイム分析とデータベース同期を行うことができます。

Oracle ソースを構成する前に、Datastream のレプリケーション動作、サポートされているバージョンとデータベース タイプ、データベースの設定、ベスト プラクティス、既知の制限事項を確認してください。

動作

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

スタンバイ データベース

Oracle Active Data Guard スタンバイ データベースをソースとして使用すると、Datastream はアーカイブされた REDO ログを読み取ります。Datastream がスタンバイ データベースに正常に適用された REDO ログのみを処理するようにするには、V$ARCHIVED_LOG や GV$ARCHIVED_LOG などの標準の Oracle ビューをフィルタして、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 は、スタンバイ データベースのマネージド リカバリ プロセス(MRP)がログを適用し、APPLIED 列を YES に更新するまで待機してから、変更を抽出します。MRP プロセスが遅延または一時停止した場合(スタンバイ適用プロセスを一時停止した場合など)、レプリケートされたデータの鮮度に直接影響します。Datastream は再試行ループに入り、新しく適用されたアーカイブ ログが使用可能になるまで処理を遅らせます。

この構成は、ラージ オブジェクト(LOB)列を含むテーブルを複製する場合に特に関連します。UPDATE オペレーションの場合、LOB 列の詳細な値は redo ログに存在しません。そのため、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 の同時実行

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

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

  • Datastream で同時実行を調整する: ピーク時の営業時間における REDO ログの切り替えの平均数を特定し、それに応じて maxConcurrentCdcTasks パラメータを構成します。詳細については、CDC タスクの最大数をご覧ください。
  • Oracle ログの切り替えを構成する: ログを頻繁に(10 ~ 20 分ごとに)切り替えるように Oracle を構成します。これにより、小さな作業単位が安定して生成され、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 値として複製されます。
    • ANYDATA、ANYDATASET、ANYTYPE
    • VARRAY(Oracle 配列)
    • BFILE、BFILENAME
    • INTERVAL DAY TO SECOND、INTERVAL YEAR TO MONTH
    • LONG、LONG RAW
    • UROWID
    • UDT
    • メディアタイプと空間タイプ: ORDAUDIO、ORDDATASOURCE、ORDDICOM、ORDDOC、ORDIMAGE、ORDVIDEO、SDO_GEOMETRY(およびその他のすべての MDSYS.SDO_* タイプ)。
  • XMLTYPE、バイナリラージ オブジェクト(BLOB)、文字ラージ オブジェクト(CLOB)、国別文字ラージ オブジェクト(NCLOB)などのラージ オブジェクト データ型の列をストリーミングするには、ストリームの構成に streamLargeObjects フラグを含める必要があります。このフラグを含めない場合、Datastream はこのような列をストリーミングせず、これらの列は宛先で NULL 値に置き換えられます。詳細については、Oracle ソースのラージ オブジェクトのストリーミングを有効にするをご覧ください。これらのデータ型をストリーミングする場合、Datastream はソース データベースにクエリを実行して、欠落している LOB 値をポイントインタイムで取得する必要があります(補完と呼ばれるアクティブなルックアップ プロセス)。これは、次のようなシナリオで発生します。

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

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

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

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

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

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

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

  • Datastream は、仮想列(GENERATED ALWAYS AS (...) VIRTUAL)の複製をサポートしていません。これは、Oracle が仮想列の値をディスクに保存したり、REDO ログに書き込んだりしないためです。仮想列は宛先スキーマから除外されます。仮想列が複合主キーの一部である場合、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)
    • ハイブリッド列圧縮
    • ファイルを保護する
    • Amazon RDS ソースでは ASM はサポートされていません。
    • バイナリ リーダー CDC メソッドは、Oracle 11g 以前のバージョンをサポートしていません。

次のステップ