11 Oracle Streamsの異機種間での情報の共有

この章では、Oracle DatabaseとOracle以外のデータベースの間で情報を共有するための、Oracle Streamsのサポートに関連する概念について説明します。

この章には次のトピックが含まれます:

11.1 Oracle Streamsを使用したOracleからOracle以外のデータベースへのデータの共有

Oracleソース・データベースからOracle以外の宛先データベースへとDML変更を共有するために、Oracle Databaseはプロキシとして機能し、通常は宛先データベースで実行される手順の一部を実行します。つまり、Oracle以外の宛先データベースを対象とするLCRは、Oracle Database自体でデキューされ、Oracle Databaseの適用プロセスはOracle Database Gatewayを介してネットワーク接続経由で変更をOracle以外のデータベースに適用します。図11-1に、Oracle以外のデータベースとデータを共有しているOracle Databaseを示します。

図11-1 OracleからOracle以外のデータベースへの異機種間データ共有

図11-1の説明が続きます
図11-1「OracleからOracle以外のデータベースへの異機種間データ共有」の説明

Oracle Database Gatewayを構成してトランザクション・モデルCOMMIT_CONFIRMを使用する必要があります。

関連項目:

Oracle Database Gatewayのトランザクション・モデルCOMMIT_CONFIRMを使用する方法の詳細は、Oracle Database Gateway固有のOracleマニュアルを参照してください。

11.1.1 OracleからOracle以外への環境での変更の取得とステージング

OracleからOracle以外への環境では、取得プロセスまたは同期取得はOracleのみの環境の場合と同様に動作します。つまり、取得プロセスは、REDOログ内で変更を検索し、それを取得プロセスのルールに基づいて取得し、取得された変更をANYDATAキューに論理変更レコード(LCR)としてエンキューします。同期取得は、内部メカニズムを使用して、同期取得のルールに基づいて変更を取得し、取得された変更をANYDATAキューに行LCRとしてエンキューします。また、1つの取得プロセスまたは同期取得で、Oracle DatabaseとOracle以外のデータベースの両方で適用される変更を取得できます。

同様に、LCRをステージングするANYDATAキューは、Oracleのみの環境の場合と同様に動作します。Oracle以外のデータベースで適用される前に、Oracle Database内の任意の数の中間キューにLCRを伝播させることができます。

関連項目:

11.1.2 OracleからOracle以外への環境での変更の適用

Oracle Database内で実行される適用プロセスは、異機種間サービスとOracle Database Gatewayを使用して、LCRにカプセル化された変更をOracle以外のデータベース内のデータベース・オブジェクトに直接適用します。LCRは、OracleのみのOracle Streams環境の場合のようには、Oracle以外のデータベース内のキューに伝播しません。かわりに、変更は適用プロセスによってデータベース・リンクを介してOracle以外のデータベースに直接適用されます。

注意:

Oracle Streamsの適用プロセスでは、Generic Connectivityはサポートされていません。

11.1.2.1 OracleからOracle以外への環境での適用プロセスの構成

この項では、変更をOracle以外のデータベースに適用する適用プロセスの構成について説明します。

11.1.2.1.1 OracleとOracle以外の環境で適用プロセスを作成する前に

Oracle以外のデータベースに変更を適用する適用プロセスを作成する前に、異機種間サービス、Oracle Database Gatewayおよびデータベース・リンクを構成します。

Oracle Streamsでは、次のOracle Database Gatewaysがサポートされます。

  • Oracle Database Gateway for Sybase

  • Oracle Database Gateway for Informix

  • Oracle Database Gateway for SQL Server

  • Oracle Database Gateway for DRDA

データベース・リンクは、Oracle以外のデータベースに変更を適用するために、適用プロセスで使用されます。データベース・リンクの作成には、明示的なCONNECT TO句を使用してください。

関連項目:

11.1.2.1.2 OracleとOracle以外への環境での適用プロセスの作成

データベース・リンクを作成済で、正常に動作している場合は、DBMS_APPLY_ADMパッケージのCREATE_APPLYプロシージャを使用して適用プロセスを作成し、apply_database_linkパラメータにデータベース・リンクを指定します。適用プロセスの作成後は、そのルールを使用してOracle以外のデータベースで適用する変更を指定できます。

関連項目:

11.1.2.1.3 OracleからOracle以外への異機種間環境での代替キー列

Oracle以外のデータベースでいずれかの表に代替キー列を使用する場合は、DBMS_APPLY_ADMパッケージのSET_KEY_COLUMNSプロシージャを実行するときに、そのデータベースへのデータベース・リンクを指定します。

11.1.2.1.4 OracleからOracle以外への異機種間環境での並列性

適用プロセスでOracle以外のデータベースに変更を適用する場合は、parallelism適用プロセス・パラメータをデフォルト設定の1に設定する必要があります。現在、Oracle以外のデータベースへのパラレル適用はサポートされていません。ただし、複数の適用プロセスを使用すると、Oracle以外のデータベースに変更を適用できます。

11.1.2.1.5 OracleからOracle以外への異機種間環境でのプロシージャDMLハンドラ

プロシージャDMLハンドラを使用してOracle以外のデータベースでいずれかの表の行LCRを処理する場合は、DBMS_APPLY_ADMパッケージのSET_DML_HANDLERプロシージャを実行するときに、そのデータベースへのデータベース・リンクを指定します。

関連項目:

適用プロセスのメッセージ処理オプションの詳細は、『Oracle Streams概要および管理』 を参照してください

11.1.2.1.6 OracleからOracle以外への異機種間環境でのメッセージ・ハンドラ

メッセージ・ハンドラを使用してOracle以外のデータベース用のユーザー・メッセージを処理する場合は、DBMS_APPLY_ADMパッケージのCREATE_APPLYプロシージャを実行するときに、apply_database_linkパラメータを使用してそのデータベースへのデータベース・リンクを指定し、message_handlerパラメータを使用してメッセージ・ハンドラ・プロシージャを指定します。

11.1.2.1.7 OracleからOracle以外への異機種間環境でのエラーおよび競合ハンドラ

現在、Oracle DatabaseからOracle以外のデータベースへとデータを共有する場合、エラー・ハンドラと競合ハンドラはサポートされていません。適用エラーが発生すると、エラーの原因となったLCRを含むトランザクションは、Oracle Databaseのエラー・キューに移動します。

11.1.2.2 Oracle以外のデータベースで適用されるデータ型

変更をOracle以外のデータベースに適用する場合、適用プロセスでは次のデータ型の列に対する変更のみが適用されます。

  • CHAR

  • VARCHAR2

  • NCHAR

  • NVARCHAR2

  • NUMBER

  • DATE

  • RAW

  • TIMESTAMP

  • TIME WITH TIME ZONE

  • TIMESTAMP WITH LOCAL TIME ZONE

  • INTERVAL YEAR TO MONTH

  • INTERVAL DAY TO SECOND

適用プロセスでは、データ型のうちCLOBNCLOBBLOBBFILELONGLONG RAWROWIDUROWID、ユーザー定義型(オブジェクト型、REF、VARRAY、NESTED TABLEなど)およびOracleが提供する型(ANY型、XML型、空間型、メディア型など)の列における変更は、Oracle以外のデータベースには適用されません。これ以外のデータ型がLCRに含まれている場合、適用プロセスにエラーが発生し、エラーの原因となったLCRを含むトランザクションがOracle Databaseのエラー・キューに移動します。

各Oracle Database Gatewayは、データ型に関してさらに制限を伴う場合があります。あるデータ型がOracleからOracle以外への環境でサポートされるには、そのデータ型がOracle Streamsと使用するOracle Database Gatewayの両方でサポートされる必要があります。

関連項目:

11.1.2.3 Oracle以外のデータベースで適用されるDML変更のタイプ

特定の表に対するDML変更をOracle以外のデータベースで適用するように指定する場合、適用プロセスで適用できるのは次のタイプのDML変更のみです。

  • INSERT

  • UPDATE

  • DELETE

注意:

適用プロセスでDDL変更をOracle以外のデータベースで適用することはできません。

11.1.2.4 OracleからOracle以外への環境でのインスタンス化

変更をOracle以外のデータベースに適用する適用プロセスを起動する前に、次の手順に従って、そのデータベースで各表をインスタンス化します。

  1. DBMS_HS_PASSTHROUGHパッケージまたはOracle以外のデータベースに用意されているツールを使用して、Oracle以外のデータベースで表を作成します。

    次の例では、DBMS_HS_PASSTHROUGHパッケージを使用して、Oracle以外のデータベースhet.example.com内でhr.regions表を作成します。

    DECLARE 
     ret INTEGER; 
    BEGIN 
    ret := DBMS_HS_PASSTHROUGH.EXECUTE_IMMEDIATE@het.example.com ( 
      'CREATE TABLE regions (region_id INTEGER, region_name VARCHAR(50))'); 
    END; 
    / 
    COMMIT; 

    関連項目:

    異機種間サービスとOracle Database Gatewayの詳細は、『Oracle Database Heterogeneous Connectivityユーザーズ・ガイド』 とOracle Database Gateway固有のOracleマニュアルを参照してください

  2. Oracle DatabaseとOracle以外のデータベース間で共有される変更がOracle Database側の取得プロセスまたは同期取得によって取得される場合は、データを共有予定の表すべてをインスタンス化のために準備します。
  3. 次のアクションを実行するPL/SQLプロシージャ(またはCプログラム)を作成します。
    • DBMS_FLASHBACKパッケージのGET_SYSTEM_CHANGE_NUMBERファンクションを使用し、現行のSCNを取得する。

    • DBMS_FLASHBACKパッケージのENABLE_AT_SYSTEM_CHANGE_NUMBERプロシージャを起動し、取得されたSCNを現行セッションに設定する。このアクションによって、すべてのフェッチが同じSCNを使用して実行されることが確実になります。

    • Oracle Databaseの表から行を1行ずつフェッチしてOracle以外のサイトの表に移入することにより、Oracle以外のデータベースの表に対する挿入を行う。すべてのフェッチは、GET_SYSTEM_CHANGE_NUMBERファンクションを使用して取得されたSCNで実行する必要があります。

    たとえば、次のPL/SQLプロシージャでは、フラッシュバックSCNを取得し、現行のOracle Database内のhr.regions表の各行をフェッチして、Oracle以外のデータベースhet.example.com内のhr.regions表に挿入しています。Oracle以外のデータベースに行が挿入される前に、フラッシュバックが無効化されていることに注意してください。

    SET SERVEROUTPUT ON
    CREATE OR REPLACE PROCEDURE insert_reg IS
      CURSOR c1 IS
        SELECT region_id, region_name FROM hr.regions;
      c1_rec c1 % ROWTYPE;
      scn NUMBER;
    BEGIN
      scn := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER();
      DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(
         query_scn  =>  scn);
      /* Open c1 in flashback mode */
      OPEN c1;
      /* Disable Flashback */
      DBMS_FLASHBACK.DISABLE;
      LOOP
        FETCH c1 INTO c1_rec;
        EXIT WHEN c1%NOTFOUND;
       /*
         Note that all the DML operations inside the loop are performed
         with Flashback disabled
       */
       INSERT INTO hr.regions@het.example.com VALUES (
         c1_rec.region_id,
         c1_rec.region_name);
      END LOOP;
      COMMIT;
      DBMS_OUTPUT.PUT_LINE('SCN = ' || scn);
      EXCEPTION WHEN OTHERS THEN 
        DBMS_FLASHBACK.DISABLE; 
        RAISE;
    END;
    /
    

    戻されたSCNをメモします。

    使用しているOracle Database Gatewayで異機種間サービスのコールバック機能がサポートされている場合、次のSQL文で前述の例のループを置換できます。

    INSERT INTO hr.region@het.example.com SELECT * FROM hr.region@!;
    

    注意:

    前述の例のプロシージャを作成および実行するユーザーには、DBMS_FLASHBACKパッケージについてのEXECUTE権限と、関連する表についてのすべての権限が必要です。

    関連項目:

    コールバック機能とOracle Database Gatewayの詳細は、『Oracle Database Heterogeneous Connectivityユーザーズ・ガイド』 とOracle Database Gateway固有のOracleマニュアルを参照してください

  4. Oracle以外のデータベースで表のインスタンス化SCNを設定します。DBMS_APPLY_ADMパッケージのSET_TABLE_INSTANTIATION_SCNプロシージャに対して手順3で取得されたSCNを指定し、手順3で取得されたSCNより前に発生した変更を含むLCRをすべてスキップするように、適用プロセスへ指示します。apply_database_linkパラメータを、Oracle以外のリモート・データベース用のデータベース・リンクに設定してください。

    関連項目:

    SET_TABLE_INSTANTIATION_SCNプロシージャの詳細は、「宛先データベースでのインスタンス化SCNの設定」および『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』 を参照してください

11.1.3 OracleからOracle以外への環境での変換

OracleからOracle以外への環境での変換では、Oracleのみの環境の場合と同様に、取得または適用中のルールベースの変換を指定できます。また、LCRをOracle以外のデータベースに適用する前に、1つ以上のOracle中間データベースに伝播させる場合は、Oracle DatabaseのキューからOracle Databaseの他のキューへの伝播中に、ルールベースの変換を指定できます。

関連項目:

ルールベースの変換の詳細は、『Oracle Streams概要および管理』 を参照してください

11.1.4 メッセージ・ゲートウェイとOracle Streams

メッセージ・ゲートウェイはOracle Databaseの機能であり、OracleキューとOracle以外のメッセージ・キューイング・システムの間の伝播を提供します。OracleキューにエンキューされたメッセージはOracle以外のキューに自動的に伝播され、Oracle以外のキューにエンキューされたメッセージはOracleキューに自動的に伝播されます。この機能では、Oracle以外のメッセージ・システムへの保証付きメッセージ配信が提供され、Oracle以外のメッセージ・システムについてはシステム固有のメッセージ・フォーマットがサポートされます。また、OracleキューからOracle以外のメッセージ・システムへ、またはOracle以外のメッセージ・システムからOracleキューへの伝播中に起動される、ユーザー定義変換の仕様もサポートされます。

関連項目:

メッセージ・ゲートウェイの詳細は、『Oracle Databaseアドバンスト・キューイング・ユーザーズ・ガイド』 を参照してください

11.1.5 OracleからOracle以外への環境でのエラー処理

Oracle以外のデータベースでLCRを適用するときに適用プロセスに未処理エラーが発生すると、そのLCRを含むトランザクションは、適用プロセスを実行中のOracle Databaseにあるエラー・キューに置かれます。適用プロセスは、Oracleのみの環境の場合と同様にデータ競合を検出しますが、現在、OracleからOracle以外への環境では、自動競合解消はサポートされていません。したがって、発生したデータ競合は適用エラーとして処理されます。

11.1.6 OracleからOracle以外へのStreams環境の例

OracleからOracle以外へのStreams環境内のデータ共有を含む詳細な例は、『Oracle Streams拡張例』を参照してください。

11.2 Oracle Streamsを使用したOracle以外のデータベースからOracle Databaseへのデータの共有

Oracle以外のデータベースから変更を取得してOracle Databaseに伝播させるには、カスタム・アプリケーションが必要です。このアプリケーションは、トランザクション・ログを読み込むか、トリガーを使用するか、または他のなんらかの方法で、Oracle以外のデータベースに対する変更を取得します。このアプリケーションではトランザクションをアセンブルし、順序付けし、それぞれの変更を論理変更レコード(LCR)に変換する必要があります。次に、アプリケーションでDBMS_STREAMS_MESSAGINGパッケージまたはDBMS_AQパッケージを使用して、LCRをOracle Databaseにエンキューします。アプリケーションは、各トランザクションのLCRをすべてエンキューした後にコミットする必要があります。図11-2に、Oracle Databaseとデータを共有しているOracle以外のデータベースを示します。

図11-2 Oracle以外のデータベースからOracle Databaseへの異機種間データ共有

図11-2の説明が続きます
図11-2「Oracle以外のデータベースからOracleへの異機種間データ共有」の説明

11.2.1 Oracle以外からOracleへの環境での変更の取得

カスタム・ユーザー・アプリケーションでは、Oracle以外のデータベースでの変更をLCRにアセンブルし、LCRをOracle Databaseにエンキューする必要があるため、変更の取得全体を受け持つことになります。したがって、アプリケーションではOracle以外のデータベースで変更を表すLCRを構成し、そのLCRをOracle Databaseのキューにエンキューする必要があります。アプリケーションでは、同時に複数のトランザクションをエンキューできますが、Oracle以外のソース・データベースのトランザクションと同じ順序で、トランザクションがコミットされる必要があります。

関連項目:

LCRを構成およびエンキューする方法の詳細は、「LCRの構成とエンキュー」を参照してください

11.2.2 Oracle以外からOracleへの環境でのステージング

変更が適用されるOracle Databaseと変更が発生するOracle以外のデータベースの両方で、同じトランザクション一貫性を確保するには、トランザクション型のキューを使用してOracle DatabaseでLCRをステージングしてください。たとえば、1つのトランザクションに3行の変更が含まれており、カスタム・アプリケーションでは変更ごとに1つずつ合計3つの行LCRをエンキューしてからコミットする場合を考えます。トランザクション型のキューを使用すると、3番目の行LCRの後で適用プロセスによってコミットが実行され、トランザクションの一貫性が保持されます。非トランザクション型のキューを使用すると、コミットは適用プロセスによって行LCRごとに実行されます。DBMS_STREAMS_ADMパッケージのSET_UP_QUEUEプロシージャでは、自動的にトランザクション型のキューが作成されます。

また、Oracle Databaseのキューはコミット時間キューである必要があります。コミット時間キューでは、LCRを含むトランザクションのおおよそのコミット・システム変更番号(おおよそのCSCN)によってLCRが順序付けされます。LCRをエンキューしたアプリケーションで、トランザクションが正しい順序でコミットされる場合、コミット時間キューでは、キュー内のLCR間で、トランザクション間の依存性による順序付けが保持されます。また、コミット時間キューによって、キュー内のLCRの一貫性のある参照が保証されます。

11.2.3 Oracle以外からOracleへの環境での変更の適用

Oracle以外からOracleへの環境では、適用プロセスはOracleのみの環境の場合と同様に動作します。つまり、各LCRは適用プロセスのルールに基づいて関連付けられたキューからデキューされ、ルールベースの変換が実行され、LCRがハンドラに送信されるか、または直接適用されます。エラー処理と競合解消の動作も、Oracleのみの環境の場合と同じです。そのため、ビルトインの更新の競合ハンドラを指定するか、カスタム競合ハンドラを作成して競合を解消できます。

適用プロセスは、取得LCRではなく永続LCRを適用するように構成する必要があります。そのため、適用プロセスはDBMS_APPLY_ADMパッケージのCREATE_APPLYプロシージャを使用して作成する必要があり、このプロシージャを実行するときは、apply_capturedパラメータをFALSEに設定する必要があります。適用プロセスの作成後に、DBMS_STREAMS_ADMパッケージのプロシージャを使用して、適用プロセスのルール・セットにLCRのルールを追加できます。

関連項目:

11.2.4 Oracle以外のデータベースからOracle Databaseへのインスタンス化

Oracle以外のデータベースに存在する表を、Oracle Databaseで自動的にインスタンス化する方法はありません。ただし、次の一般的な手順に従って表を手動でインスタンス化できます。

  1. Oracle以外のデータベースで、Oracle以外のユーティリティを使用して表をフラット・ファイルにエクスポートします。
  2. Oracle Databaseで、Oracle以外のデータベースにある表と一致する空の表を作成します。
  3. Oracle Databaseで、SQL*Loaderを使用してフラット・ファイルの内容を表にロードします。

関連項目:

SQL*Loaderの使用については、『Oracle Databaseユーティリティ』 を参照してください

11.3 Oracle Streamsを使用したOracle以外のデータベース間でのデータの共有

Oracle Streamsでは、Oracle以外の2つのデータベース間でのデータ共有が、Oracle以外からOracleへのデータ共有とOracleからOracle以外へのデータ共有の組合せを介してサポートされます。この種の環境では、Oracle以外の2つのデータベース間に位置する中間データベースとして、Oracle Database内でOracle Streamsが使用されます。

たとえば、Oracle以外からOracle以外への環境は、次のデータベースで構成されている場合があります。

  • Oracle以外のデータベースhet1.example.com

  • Oracle Database dbs1.example.com

  • Oracle以外のデータベースhet2.example.com

ユーザー・アプリケーションでは、het1.example.comでの変更をアセンブルし、それをdbs1.example.comにエンキューします。次に、dbs1.example.comの適用プロセスが、異機種間サービスとOracle Database Gatewayを使用して変更をhet2.example.comに適用します。dbs1.example.comの別の適用プロセスは、dbs1.example.comでキューにある一部またはすべての変更をローカルに適用できます。dbs1.example.comの1つ以上の伝播は、キューにある一部またはすべての変更を他のOracle Databaseに伝播できます。