11 Oracle Streamsの異機種間での情報の共有
この章では、Oracle DatabaseとOracle以外のデータベースの間で情報を共有するための、Oracle Streamsのサポートに関連する概念について説明します。
この章には次のトピックが含まれます:
-
Oracle Streamsを使用したOracle以外のデータベース間でのデータの共有
注意:
新機能のXStreamは、Oracle Database 11g リリース2(11.2)以上で使用できます。XStreamを使用すると、Oracle CallインタフェースおよびJavaアプリケーションが、ストリーム内のデータベースの変更にアクセス可能になります。XStreamの詳細は、Oracle Database XStreamについてのマニュアルを参照してください。
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を示します。
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を伝播させることができます。
関連項目:
-
取得プロセス、同期取得、ステージングおよび伝播の概要は、『Oracle Streams概要および管理』 を参照してください
-
Oracle Streamsレプリケーション環境の取得プロセス、同期取得、ステージングおよび伝播の詳細は、「Oracle Streamsレプリケーションの準備」を参照してください
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
句を使用してください。
関連項目:
-
異機種間サービスとOracle Database Gatewayの詳細は、『Oracle Database Heterogeneous Connectivityユーザーズ・ガイド』 を参照してください
-
Oracle Database GatewayのOracleマニュアルを参照してください。
11.1.2.1.2 OracleとOracle以外への環境での適用プロセスの作成
データベース・リンクを作成済で、正常に動作している場合は、DBMS_APPLY_ADM
パッケージのCREATE_APPLY
プロシージャを使用して適用プロセスを作成し、apply_database_link
パラメータにデータベース・リンクを指定します。適用プロセスの作成後は、そのルールを使用してOracle以外のデータベースで適用する変更を指定できます。
関連項目:
-
DBMS_APPLY_ADM
パッケージのプロシージャの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』 を参照してください -
適用プロセスのルールを指定する方法は、『Oracle Streams概要および管理』 を参照してください
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
パラメータを使用してメッセージ・ハンドラ・プロシージャを指定します。
関連項目:
メッセージ処理オプションおよびメッセージ・ハンドラの管理の詳細は、『Oracle Streams概要および管理』 を参照してください
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
適用プロセスでは、データ型のうち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の両方でサポートされる必要があります。
関連項目:
-
これらのデータ型の詳細は、『Oracle Database SQL言語リファレンス』を参照
-
Oracle Database Gateway固有のOracleマニュアルを参照してください。
11.1.2.3 Oracle以外のデータベースで適用されるDML変更のタイプ
特定の表に対するDML変更をOracle以外のデータベースで適用するように指定する場合、適用プロセスで適用できるのは次のタイプのDML変更のみです。
-
INSERT
-
UPDATE
-
DELETE
注意:
適用プロセスでDDL変更をOracle以外のデータベースで適用することはできません。
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.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の一貫性のある参照が保証されます。
関連項目:
トランザクション型のキューとコミット時間キューの詳細は、『Oracle Streams概要および管理』を参照してください。
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のルールを追加できます。
関連項目:
-
適用プロセス、ルールおよびルールベースの変換の詳細は、『Oracle Streams概要および管理』 を参照してください
11.2.4 Oracle以外のデータベースからOracle Databaseへのインスタンス化
Oracle以外のデータベースに存在する表を、Oracle Databaseで自動的にインスタンス化する方法はありません。ただし、次の一般的な手順に従って表を手動でインスタンス化できます。
- Oracle以外のデータベースで、Oracle以外のユーティリティを使用して表をフラット・ファイルにエクスポートします。
- Oracle Databaseで、Oracle以外のデータベースにある表と一致する空の表を作成します。
- 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に伝播できます。