この章では、Oracle DatabaseとOracle以外のデータベースの間で情報を共有するための、Oracle Streamsのサポートに関連する概念について説明します。
この章の内容は次のとおりです。
Oracleソース・データベースからOracle以外の接続先データベースへとDML変更を共有するために、Oracle Databaseはプロキシとして機能し、通常は接続先データベースで実行される手順の一部を実行します。つまり、Oracle以外の接続先データベースを対象とするLCRは、Oracle Database自体でデキューされ、Oracle Databaseの適用プロセスはOracle Database Gatewayを介してネットワーク接続経由で変更をOracle以外のデータベースに適用します。図5-1に、Oracle以外のデータベースとデータを共有しているOracle Databaseを示します。
図5-1 Oracle DatabaseからOracle以外のデータベースへの異機種間データ共有

Oracle Database Gatewayを構成してトランザクション・モデルCOMMIT_CONFIRMを使用する必要があります。
|
参照: Oracle Database Gatewayのトランザクション・モデルCOMMIT_CONFIRMを使用する方法の詳細は、Oracle Database Gateway固有のOracleマニュアルを参照してください。 |
OracleからOracle以外への環境では、取得プロセスまたは同期取得はOracleのみの環境の場合と同様に動作します。つまり、取得プロセスは、REDOログ内で変更を検索し、それを取得プロセスのルールに基づいて取得し、取得された変更をANYDATAキューに論理変更レコード(LCR)としてエンキューします。同期取得は、内部メカニズムを使用して、同期取得のルールに基づいて変更を取得し、取得された変更をANYDATAキューに行LCRとしてエンキューします。また、1つの取得プロセスまたは同期取得で、Oracle DatabaseとOracle以外のデータベースの両方で適用される変更を取得できます。
同様に、LCRをステージングするANYDATAキューは、Oracleのみの環境の場合と同様に動作します。Oracle以外のデータベースで適用される前に、Oracle Database内の任意の数の中間キューにLCRを伝播させることができます。
|
参照:
|
Oracle Database内で実行される適用プロセスは、異機種間サービスとOracle Database Gatewayを使用して、LCRにカプセル化された変更をOracle以外のデータベース内のデータベース・オブジェクトに直接適用します。LCRは、OracleのみのOracle Streams環境の場合のようには、Oracle以外のデータベース内のキューに伝播しません。かわりに、変更は適用プロセスによってデータベース・リンクを介してOracle以外のデータベースに直接適用されます。
|
注意: Oracle Streamsの適用プロセスでは、Generic Connectivityはサポートされていません。 |
|
参照:
|
この項では、変更をOracle以外のデータベースに適用する適用プロセスの構成について説明します。
Oracle以外のデータベースに変更を適用する適用プロセスを作成する前に、異機種間サービス、Oracle Database Gatewayおよびデータベース・リンクを構成します。
Oracle Streamsでは、次のOracle Database Gatewaysがサポートされます。
Oracle Database Gateway for Sybase 11gリリース1(11.1)
Oracle Database Gateway for Informix 11gリリース1(11.1)
Oracle Database Gateway for SQL Server 11gリリース1(11.1)
Oracle Database Gateway for DRDA 11gリリース1(11.1)、10gリリース2(10.2)および10gリリース1(10.1)
データベース・リンクは、Oracle以外のデータベースに変更を適用するために、適用プロセスで使用されます。データベース・リンクの作成には、明示的なCONNECT TO句を使用してください。
|
参照:
|
データベース・リンクを作成済で、正常に動作している場合は、DBMS_APPLY_ADMパッケージのCREATE_APPLYプロシージャを使用して適用プロセスを作成し、apply_database_linkパラメータにデータベース・リンクを指定します。適用プロセスの作成後は、そのルールを使用してOracle以外のデータベースで適用する変更を指定できます。
|
参照:
|
Oracle以外のデータベースでいずれかの表に代替キー列を使用する場合は、DBMS_APPLY_ADMパッケージのSET_KEY_COLUMNSプロシージャを実行するときに、そのデータベースへのデータベース・リンクを指定します。
適用プロセスでOracle以外のデータベースに変更を適用する場合は、parallelism適用プロセス・パラメータをデフォルト設定の1に設定する必要があります。現在、Oracle以外のデータベースへのパラレル適用はサポートされていません。ただし、複数の適用プロセスを使用すると、Oracle以外のデータベースに変更を適用できます。
DMLハンドラを使用してOracle以外のデータベースでいずれかの表の行LCRを処理する場合は、DBMS_APPLY_ADMパッケージのSET_DML_HANDLERプロシージャを実行するときに、そのデータベースへのデータベース・リンクを指定します。
メッセージ・ハンドラを使用してOracle以外のデータベース用のユーザー・メッセージを処理する場合は、DBMS_APPLY_ADMパッケージのCREATE_APPLYプロシージャを実行するときに、apply_database_linkパラメータを使用してそのデータベースへのデータベース・リンクを指定し、message_handlerパラメータを使用してメッセージ・ハンドラ・プロシージャを指定します。
|
参照: メッセージ処理オプションおよびメッセージ・ハンドラの管理の詳細は、『Oracle Streams概要および管理』を参照してください。 |
変更をOracle以外のデータベースに適用する場合、適用プロセスでは次のデータ型の列に対する変更のみが適用されます。
CHAR
VARCHAR2
NCHAR
NVARCHAR2
NUMBER
DATE
RAW
TIMESTAMP
TIMESTAMP WITH TIME ZONE
TIMESTAMP WITH LOCAL TIME ZONE
INTERVAL YEAR TO MONTH
INTERVAL DAY TO SECOND
適用プロセスでは、データ型のうちCLOB、NCLOB、BLOB、BFILE、LONG、LONG RAW、ROWID、UROWID、ユーザー定義型(オブジェクト型、REF、VARRAY、NESTED TABLEなど)およびOracleが提供する型(ANY型、XML型、空間型、メディア型など)の列における変更は、Oracle以外のデータベースには適用されません。これ以外のデータ型がLCRに含まれている場合、適用プロセスにエラーが発生し、エラーの原因となったLCRを含むトランザクションがOracle Databaseのエラー・キューに移動します。
各Oracle Database Gatewayは、データ型に関してさらに制限を伴う場合があります。あるデータ型がOracleからOracle以外への環境でサポートされるには、そのデータ型がOracle Streamsと使用するOracle Database Gatewayの両方でサポートされる必要があります。
|
参照:
|
特定の表に対するDML変更をOracle以外のデータベースで適用するように指定する場合、適用プロセスで適用できるのは次のタイプのDML変更のみです。
INSERT
UPDATE
DELETE
|
注意: 適用プロセスでDDL変更をOracle以外のデータベースで適用することはできません。 |
変更をOracle以外のデータベースに適用する適用プロセスを起動する前に、次の手順に従って、そのデータベースで各表をインスタンス化します。
DBMS_HS_PASSTHROUGHパッケージまたはOracle以外のデータベースに用意されているツールを使用して、Oracle以外のデータベースで表を作成します。
次の例では、DBMS_HS_PASSTHROUGHパッケージを使用して、Oracle以外のデータベースhet.net内でhr.regions表を作成します。
DECLARE ret INTEGER; BEGIN ret := DBMS_HS_PASSTHROUGH.EXECUTE_IMMEDIATE@het.net ( 'CREATE TABLE regions (region_id INTEGER, region_name VARCHAR(50))'); END; / COMMIT;
|
参照: 異機種間サービスとOracle Database Gatewayの詳細は、『Oracle Database Heterogeneous Connectivity管理者ガイド』とOracle Database Gateway固有のOracleマニュアルを参照してください。 |
Oracle DatabaseとOracle以外のデータベース間で共有される変更がOracle Database側の取得プロセスまたは同期取得によって取得される場合は、データを共有予定の表すべてをインスタンス化のために準備します。
次のアクションを実行する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.net内の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.net 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.net SELECT * FROM hr.region@!;
|
注意: 前述の例のプロシージャを作成および実行するユーザーには、DBMS_FLASHBACKパッケージについてのEXECUTE権限と、関連する表についてのすべての権限が必要です。 |
|
参照: コールバック機能とOracle Database Gatewayの詳細は、『Oracle Database Heterogeneous Connectivity管理者ガイド』とOracle Database Gateway固有のOracleマニュアルを参照してください。 |
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パッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。 |
OracleからOracle以外への環境での変換では、Oracleのみの環境の場合と同様に、取得または適用中のルールベースの変換を指定できます。また、LCRをOracle以外のデータベースに適用する前に、1つ以上のOracle中間データベースに伝播させる場合は、Oracle DatabaseのキューからOracle Databaseの他のキューへの伝播中に、ルールベースの変換を指定できます。
|
参照: ルールベースの変換の詳細は、『Oracle Streams概要および管理』を参照してください。 |
メッセージ・ゲートウェイはOracle Databaseの機能であり、OracleキューとOracle以外のメッセージ・キューイング・システムの間の伝播を提供します。OracleキューにエンキューされたメッセージはOracle以外のキューに自動的に伝播し、Oracle以外のキューにエンキューされたメッセージはOracleキューに自動的に伝播します。この機能によって、Oracle以外のメッセージ・システムへの保証付きメッセージ配信が提供され、Oracle以外のメッセージ・システムについてはシステム固有のメッセージ・フォーマットがサポートされます。また、OracleキューとOracle以外のメッセージ・システムの間での伝播中に起動される、ユーザー定義変換の仕様もサポートされます。
|
参照: メッセージ・ゲートウェイの詳細は、『Oracle Streamsアドバンスト・キューイング・ユーザーズ・ガイド』を参照してください。 |
Oracle以外のデータベースでLCRを適用するときに適用プロセスに未処理エラーが発生すると、そのLCRを含むトランザクションは、適用プロセスを実行中のOracle Databaseにあるエラー・キューに置かれます。適用プロセスは、Oracleのみの環境の場合と同様にデータ競合を検出しますが、現在、OracleからOracle以外への環境では、自動競合解消はサポートされていません。したがって、発生したデータ競合は適用エラーとして処理されます。
OracleからOracle以外へのStreams環境内のデータ共有を含む詳細な例は、第20章「単一ソースの異機種間レプリケーションの例」を参照してください。
Oracle以外のデータベースから変更を取得してOracle Databaseに伝播させるには、カスタム・アプリケーションが必要です。このアプリケーションは、トランザクション・ログを読み込むか、トリガーを使用するか、または他のなんらかの方法で、Oracle以外のデータベースに対する変更を取得します。このアプリケーションではトランザクションをアセンブルし、順序付けし、それぞれの変更を論理変更レコード(LCR)に変換する必要があります。次に、アプリケーションでDBMS_STREAMS_MESSAGINGパッケージまたはDBMS_AQパッケージを使用して、LCRをOracle Databaseにエンキューします。アプリケーションは、各トランザクションのLCRをすべてエンキューした後にコミットする必要があります。図5-2に、Oracle Databaseとデータを共有しているOracle以外のデータベースを示します。
図5-2 Oracle以外のデータベースからOracle Databaseへの異機種間データ共有

カスタム・ユーザー・アプリケーションでは、Oracle以外のデータベースでの変更をLCRにアセンブルし、LCRをOracle Databaseにエンキューする必要があるため、変更の取得全体を受け持つことになります。これは、アプリケーションではOracle以外のデータベースで変更を表すLCRを構成し、そのLCRをOracle Databaseのキューにエンキューする必要があることを意味します。アプリケーションでは、同時に複数のトランザクションをエンキューできますが、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の一貫性のある参照が保証されます。
|
参照: トランザクション型のキューとコミット時間キューの詳細は、『Oracle Streams概要および管理』を参照してください。 |
Oracle以外からOracleへの環境では、適用プロセスはOracleのみの環境の場合と同様に動作します。つまり、各LCRは適用プロセスのルールに基づいて関連付けられたキューからデキューされ、ルールベースの変換が実行され、LCRがハンドラに送信されるか、または直接適用されます。エラー処理と競合解消の動作も、Oracleのみの環境の場合と同じです。そのため、ビルトインの更新の競合ハンドラを指定するか、カスタム競合ハンドラを作成して競合を解消できます。
適用プロセスは、取得LCRではなく永続LCRを適用するように構成する必要があります。そのため、適用プロセスはDBMS_APPLY_ADMパッケージのCREAT_APPLYプロシージャを使用して作成する必要があります。また、このプロシージャを実行するときはapply_capturedパラメータをFALSEに設定する必要があります。適用プロセスを作成すると、DBMS_STREAMS_ADMパッケージのプロシージャを使用して適用プロセスのルール・セットにLCRのルールを追加できます。
Oracle以外のデータベースに存在する表を、Oracle Databaseで自動的にインスタンス化する方法はありません。ただし、次の一般的な手順に従って表を手動でインスタンス化できます。
Oracle以外のデータベースで、Oracle以外のユーティリティを使用して表をフラット・ファイルにエクスポートします。
Oracle Databaseで、Oracle以外のデータベースにある表と一致する空の表を作成します。
Oracle Databaseで、SQL*Loaderを使用してフラット・ファイルの内容を表にロードします。
|
参照: SQL*Loaderの使用については、『Oracle Databaseユーティリティ』を参照してください。 |
Oracle Streamsでは、Oracle以外の2つのデータベース間でのデータ共有が、Oracle以外からOracleへのデータ共有とOracleからOracle以外へのデータ共有の組合せを介してサポートされます。この種の環境では、Oracle以外の2つのデータベース間に位置する中間データベースとして、Oracle Database内でOracle Streamsが使用されます。
たとえば、Oracle以外からOracle以外への環境は、次のデータベースで構成されている場合があります。
Oracle以外のデータベースhet1.net
Oracle Database dbs1.net
Oracle以外のデータベースhet2.net
ユーザー・アプリケーションでは、het1.netでの変更をアセンブルし、それをdbs1.netにエンキューします。次に、dbs1.netの適用プロセスが、異機種間サービスとOracle Database Gatewayを使用して変更をhet2.netに適用します。dbs1.netの別の適用プロセスは、dbs1.netでキューにある一部またはすべての変更をローカルに適用できます。dbs1.netの1つ以上の伝播は、キューにある一部またはすべての変更を他のOracle Databaseに伝播できます。