この章では、Oracle DatabaseとOracle以外のデータベースの間で情報を共有するための、Oracle Streamsのサポートに関連する概念について説明します。
この章の内容は次のとおりです。
Oracle Streamsを使用したOracle以外のデータベース間でのデータの共有
注意: 新機能のXStreamは、Oracle Database 11g リリース2(11.2)以上で使用できます。XStreamを使用すると、Oracle CallインタフェースおよびJavaアプリケーションが、ストリーム内のデータベースの変更にアクセス可能になります。XStreamの詳細は、Oracle Database XStreamについてのマニュアルを参照してください。 |
Oracleソース・データベースからOracle以外の宛先データベースへとDML変更を共有するために、Oracle Databaseはプロキシとして機能し、通常は宛先データベースで実行される手順の一部を実行します。つまり、Oracle以外の宛先データベースを対象とするLCRは、Oracle Database自体でデキューされ、Oracle Databaseの適用プロセスはOracle Database Gatewayを介してネットワーク接続経由で変更をOracle以外のデータベースに適用します。図11-1に、Oracle以外のデータベースとデータを共有しているOracle Databaseを示します。
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 Streams概要および管理』 |
この項では、変更を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
句を使用してください。
関連項目:
|
データベース・リンクを作成済で、正常に動作している場合は、DBMS_APPLY_ADM
パッケージのCREATE_APPLY
プロシージャを使用して適用プロセスを作成し、apply_database_link
パラメータにデータベース・リンクを指定します。適用プロセスの作成後は、そのルールを使用してOracle以外のデータベースで適用する変更を指定できます。
関連項目:
|
Oracle以外のデータベースでいずれかの表に代替キー列を使用する場合は、DBMS_APPLY_ADM
パッケージのSET_KEY_COLUMNS
プロシージャを実行するときに、そのデータベースへのデータベース・リンクを指定します。
関連項目: 『Oracle Streams概要および管理』 |
適用プロセスでOracle以外のデータベースに変更を適用する場合は、parallelism
適用プロセス・パラメータをデフォルト設定の1
に設定する必要があります。現在、Oracle以外のデータベースへのパラレル適用はサポートされていません。ただし、複数の適用プロセスを使用すると、Oracle以外のデータベースに変更を適用できます。
プロシージャDMLハンドラを使用してOracle以外のデータベースでいずれかの表の行LCRを処理する場合は、DBMS_APPLY_ADM
パッケージのSET_DML_HANDLER
プロシージャを実行するときに、そのデータベースへのデータベース・リンクを指定します。
関連項目: 適用プロセスのメッセージ処理オプションの詳細は、『Oracle Streams概要および管理』を参照してください。 |
メッセージ・ハンドラを使用して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.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マニュアルを参照してください。 |
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.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マニュアルを参照してください。 |
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以外のメッセージ・システムからOracleキューへの伝播中に起動される、ユーザー定義変換の仕様もサポートされます。
関連項目: メッセージ・ゲートウェイの詳細は、『Oracle Streamsアドバンスト・キューイング・ユーザーズ・ガイド』を参照してください。 |
Oracle以外のデータベースから変更を取得してOracle Databaseに伝播させるには、カスタム・アプリケーションが必要です。このアプリケーションは、トランザクション・ログを読み込むか、トリガーを使用するか、または他のなんらかの方法で、Oracle以外のデータベースに対する変更を取得します。このアプリケーションではトランザクションをアセンブルし、順序付けし、それぞれの変更を論理変更レコード(LCR)に変換する必要があります。次に、アプリケーションでDBMS_STREAMS_MESSAGING
パッケージまたはDBMS_AQ
パッケージを使用して、LCRをOracle Databaseにエンキューします。アプリケーションは、各トランザクションのLCRをすべてエンキューした後にコミットする必要があります。図11-2に、Oracle Databaseとデータを共有しているOracle以外のデータベースを示します。
カスタム・ユーザー・アプリケーションでは、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
パッケージのCREATE_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.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に伝播できます。