Oracle Database 2日でデータ・レプリケーションおよび統合ガイド 11g リリース1(11.1) E05777-03 |
|
この章では、Oracle Streamsレプリケーションに関する概念を示し、データベース間のデータの連続的なレプリケート方法を説明します。
この章は次の項で構成されています。
参照:
レプリケーションは、複数のデータベースでデータベース・オブジェクトとデータを共有するプロセスです。データベース・オブジェクトとデータを複数のデータベースでメンテナンスするために、あるデータベースでのこれらのデータベース・オブジェクトの1つに対する変更が他のデータベースと共有されます。このようにして、レプリケーション環境内のすべてのデータベースでデータベース・オブジェクトとデータの同期が維持されます。
一部のレプリケーション環境は、共有データベース・オブジェクトに対して行われた変更を絶えずレプリケートする必要があります。Oracle Streamsは、連続レプリケーションのためのOracle Database機能です。通常、このような環境では、共有データベース・オブジェクトを含むデータベースがほぼ常にネットワークに接続され、これらのネットワーク接続上でデータベース変更を絶えずプッシュします。
1つの共有データベース・オブジェクトに対して変更が行われると、Oracle Streamsは次のアクションを実行して、同じ変更が他の各データベースの対応する共有データベース・オブジェクトに対して行われるようにします。
図4-1に、Oracle Streams情報フローを示します。
Oracle Streamsレプリケーションを使用して、複数のデータベースでデータを共有し、これらのデータベースでデータを効率よく最新に保つことができます。たとえば、全世界にいくつかのコール・センターを持つ会社は、顧客情報を各コール・センターのローカル・データベースに格納できます。このような環境では、Oracle Streamsでの連続レプリケーションにより、ある場所の顧客データに対して行った変更が、できるだけ早く他のすべての場所にプッシュされるようにすることができます。
Oracle Streamsを使用してデータベース・オブジェクトに対する変更を取得する場合、変更は論理変更レコード(LCR)に書式設定されます。LCRは、データベース変更を説明する特定の形式のメッセージです。変更がデータ操作言語(DML)操作だった場合は、行LCRにより、DML操作の結果として発生した行変更がそれぞれカプセル化されます。1つのDML操作によって複数の行変更が発生する場合があるため、1つのDML操作によって複数の行LCRが発生することがあります。変更がデータ定義言語(DDL)操作だった場合、1つのDDL LCRがDDL変更をカプセル化します。
次の各項で、Oracle Streamsレプリケーションを詳細に説明します。
Oracle Streamsは、データベース変更を自動的に取得する2つの方法を提供します。
単一の取得プロセスまたは単一の同期取得は、1つのデータベースのみに対して行われた変更を取得できます。変更が発生したデータベースは、変更のソース・データベースと呼ばれます。
取得プロセスは、REDOログに記録された変更を非同期に取得するOracle Databaseのオプションのバックグラウンド処理です。取得プロセスは、データベース変更を取得すると、それを論理変更レコード(LCR)に変換し、LCRをエンキューします。
取得プロセスは、単一のキューに常に関連付けられ、LCRをこのキューにのみエンキューします。パフォーマンスを向上させるために、取得されたLCRは常にバッファ・キューに格納されます。バッファ・キューは、キューに関連付けられているシステム・グローバル領域(SGA)メモリーです。
図4-2では、取得プロセスがどのように動作するかを示します。
取得プロセスは、ソース・データベースまたはリモート・データベース上で実行できます。ソース・データベース上で実行する場合、取得プロセスはローカル取得プロセスと呼ばれます。リモート・データベース上で実行する場合、取得プロセスはダウンストリーム取得プロセスと呼ばれます。
ダウンストリーム取得では、REDO転送サービスは、ソース・データベースのログ・ライター・プロセス(LGWR)を使用して、ダウンストリーム取得を実行するデータベースにREDOデータを送信します。異なるデータベースが変更を取得するため、ダウンストリーム取得プロセスではソース・データベースのリソースが少なくてすみます。一方、ローカル取得プロセスは、ダウンストリーム取得よりも構成と管理が簡単です。ローカル取得プロセスによって、プラットフォームまたはOracle Databaseのバージョンが異なるレプリケーション環境にも柔軟性が提供されます。
参照:
|
REDOログの非同期マイニングのかわりに、同期取得は内部メカニズムを使用して、データ操作言語(DML)の変更が表に対して行われたときにその変更を取得します。単一のDML変更によって、表の1つ以上の行が変更されることがあります。同期取得はそれぞれの行変更を取得し、それを行の論理変更レコード(LCR)に変換してエンキューします。
同期取得は常に単一のキューに関連付けられ、行LCRをこのキューにのみエンキューします。同期取得は常に行LCRを永続キューにエンキューします。永続キューは、メモリーではなくハード・ディスク上のキュー表にメッセージを格納するキューの部分です。
通常、同期取得は、比較的少数の表に対する変更を取得するレプリケーション環境で使用するのが最適です。多くの表、スキーマ全体またはデータベース全体に対する変更を取得する必要がある場合は、同期取得のかわりに取得プロセスを使用する必要があります。
図4-3では、同期取得がどのように動作するかを示します。
伝播は1つのキューから他のキューにメッセージを送信します。Oracle Streamsを使用して、同じデータベース内、または異なるデータベース内の2つのキュー間のメッセージ伝播を構成できます。Oracle Streamsは、データベース・リンクとOracle Schedulerジョブを使用してメッセージを送信します。伝播は常に「ソース・キュー」と「宛先キュー」の間で行われます。Oracle Streamsレプリケーション環境では、伝播は通常、ローカル・データベース内のソース・キューからリモート・データベース内の宛先キューにデータベース変更を記述するメッセージを(LCRの形式で)送信します。
図4-4では、伝播を示します。
参照:
|
データベース変更が取得されて伝播された後、これらの変更はキューに存在し、レプリケーション・プロセスを完了するために適用する準備ができます。適用プロセスは、論理変更レコード(LCR)およびその他のタイプのメッセージを特定のキューからデキューするオプションのOracle Databaseバックグラウンド・プロセスです。単純なOracle Streamsレプリケーション環境では、通常、適用プロセスはデキューするLCR内の変更をローカル・データベースのデータベース・オブジェクトに直接適用します。
適用プロセスは、常に単一のキューに関連付けられ、このキューからのみメッセージをデキューします。単一の適用プロセスは、バッファ・キューまたは永続キューからメッセージをデキューできますが、両方からデキューすることはできません。したがって、適用プロセスが、取得プロセスによって取得された変更を適用する場合は、バッファ・キューからLCRをデキューするように適用プロセスを構成する必要があります。一方、適用プロセスが、同期取得によって取得された変更を適用する場合は、永続キューからLCRをデキューするように適用プロセスを構成する必要があります。
図4-5では、適用プロセスがどのように動作するかを示します。
適用プロセスは、LCRを正常に適用できない場合に、LCR、およびトランザクション内の他のすべてのLCRをエラー・キューという特別なキューに移動します。エラー・キューには、データベースの現在の適用エラーがすべて含まれます。データベースに複数の適用プロセスがある場合、エラー・キューには各適用プロセスの適用エラーが含まれます。エラーの原因となった条件を修正してから、エラー・キュー内の対応するトランザクションを再実行して変更を適用します。たとえば、表の行を変更してトランザクション・エラーの原因となった条件を修正し、トランザクションを再実行できます。
適用プロセスが変更をデータベース・オブジェクトに適用するためには、インスタンス化システム変更番号(SCN)をデータベース・オブジェクトに対して設定する必要があります。インスタンス化SCNは、ソース・データベースのSCNの後にコミットされた変更のみが適用プロセスによって適用されることを指定するデータベース・オブジェクトのSCNです。表のインスタンス化SCNでは、ソース・データベースと宛先データベースで指定されたSCNに一貫性があることを前提としています。通常、インスタンス化SCNは、Oracle Streamsレプリケーション環境を構成するときに自動的に設定されます。
Oracle Streamsレプリケーション構成では、レプリケート対象を指定する必要があります。取得プロセス、同期取得、伝播および適用プロセスは、Oracle Streamsクライアントと呼ばれます。Oracle Streamsクライアントがレプリケートする対象は、ルールによって決まります。ルールはOracle Streamsクライアントごとに個別に設定でき、異なるOracle Streamsクライアント間でルールが一致している必要はありません。
ルールはルール・セットに編成でき、各Oracle Streamsクライアントの動作は、Oracle Streamsクライアントに関連付けられているルール・セット内のルールによって決まります。ポジティブ・ルール・セットとネガティブ・ルール・セットを取得プロセス、伝播および適用プロセスに関連付けることができますが、同期取得に関連付けることができるのはポジティブ・ルール・セットのみです。
レプリケーション環境では、データベース変更がルール・セットを満たす場合にOracle Streamsクライアントがそのタスクを実行します。一般に、変更がOracle Streamsクライアントのルール・セットを満たすのは、変更についてネガティブ・ルール・セットのどのルールもTRUE
と評価されず、ポジティブ・ルール・セットの1つ以上のルールが変更についてTRUE
と評価される場合です。ネガティブ・ルール・セットが常に最初に評価されます。
Oracle Streamsレプリケーション環境でルール・セットを使用すると、具体的には次のことができます。
ルールベース変換は、複数のデータベースでデータベース・オブジェクトが同一でない場合に柔軟性を提供する追加の構成オプションです。ルールベース変換では、各データベースで正常に適用できるように、データベース・オブジェクトに対する変更を修正できます。ルールベース変換は、ポジティブ・ルール・セット内のルールがTRUE
と評価された場合のメッセージに対する修正を示します。
たとえば、変更が発生したデータベースで表に5つの列があり、別のデータベースの共有表には5つの列のうちの4つしかないとします。データ操作言語(DML)操作がソース・データベースの表に対して実行されると、行変更が取得され、行LCRとして書式設定されます。ルールベース変換は、他のデータベースに正常に適用できるようにこれらの行LCR内の余分な列を削除できます。行LCRが変換されない場合、行LCRには余分な列があるため他のデータベースでの適用プロセスでエラーが発生します。
ルールベース変換には、宣言とカスタムの2種類があります。宣言ルールベース変換には、DML変更(行LCR)の結果として発生した行変更の一般的な変換シナリオのセットが含まれます。カスタム・ルールベース変換には、変換を実行するためのユーザー定義PL/SQLファンクションが必要です。このマニュアルでは、宣言ルールベース変換についてのみ説明します。
次の宣言ルールベース変換を使用できます。
これらの宣言ルールベース変換の1つを追加するときに、変換に関連付けるルールを指定します。指定したルールが行LCRについてTRUE
と評価される場合、Oracle Streamsは行 LCRで宣言変換を内部的に実行します。通常、ルールとルール・セットはOracle Streamsレプリケーション環境を構成するときに自動的に作成されます。
1つのルールに対して複数の宣言ルールベース変換を構成できますが、カスタム・ルールベース変換は、1つのルールに対して1つのみ構成できます。また、1つのルールに対して宣言ルールベース変換とカスタム・ルールベース変換の両方を構成することもできます。
変換は、Oracle Streams情報フローの任意のステージ(取得中、伝播中または適用中)で発生します。変換がいつ発生するかは、変換が関連付けられているルールによって決まります。たとえば、伝播中に変換を実行するには、変換を伝播のポジティブ・ルール・セットのルールに関連付けます。
サプリメンタル・ロギングは、操作(行の更新など)が実行されるたびにREDOログに配置される追加の列データのプロセスです。取得プロセスは、この追加情報を取得し、論理変更レコード(LCR)に配置します。これらのLCRを適用する適用プロセスは、データベース変更を正しく適用するためにこの追加情報を必要とします。
競合は、表のデータを共有している2つの異なるデータベースが表の同じ行をほぼ同時に変更した場合に発生します。これらの変更がこれらのデータベースの一方で取得され、もう一方のデータベースに送信されると、適用プロセスは、行LCRを表に適用しようとしたときに競合を検出します。デフォルトでは、適用エラーがエラー・キューに入れられ、そこで手動で解消できます。適用エラーを回避するには、適用プロセスが環境に最適な方法で競合を処理するように競合解消を構成する必要があります。
Oracle Databaseには、行のUPDATE
が原因で競合が発生した場合に競合を解消する競合ハンドラが組み込まれています。これらのハンドラは、組込み更新競合ハンドラと呼ばれています。
適用プロセスで、デキューされた行LCRに対する更新競合が発生した場合、2つのデータベースのデータの一貫性を維持するために行LCRを適用するか破棄する必要があります。更新競合を解消する最も一般的な方法は、最新のタイムスタンプを持つ変更を保持し、古い変更を破棄することです。表に最新の時刻競合解消を構成する方法については、「チュートリアル: 表の最新時刻競合解消の構成」を参照してください。
次の各項で、特定のタイプのレプリケーション環境で競合解消を構成する方法を説明します。
参照:
変更循環は、発生元のデータベースに変更を再び送信することを意味します。通常は、変更循環によって各データベース変更の結果が発生元のデータベースに無限にループするため、変更循環を回避する必要があります。このようなループによって、データベース内に意図しないデータが生成され、ネットワーキングと環境のコンピュータ・リソースに負荷がかかります。デフォルトでは、Oracle Streamsは変更循環を回避するように設計されています。
タグは、変更レコード内の追加情報です。データベース変更を記録する各REDOエントリと、データベース変更をカプセル化する各論理変更レコード(LCR)には、タグが含まれます。タグのデータ型はRAW
です。
デフォルトでは、変更レコードには次のタグ値があります。
NULL
です。特定のデータベース・セッションに対してこのデフォルトを変更できます。
'00''
(ゼロが2つ)と等価の16進数になります。特定の適用プロセスのデフォルトは変更可能です。
LCRのタグ値は、LCRがどのように取得されたかによって決まります。
Oracle Streamsクライアントのルールには、タグ値の条件を含めることができます。たとえば、取得プロセスのルールは、REDOレコードのタグ値に基づいてREDOログ内の変更が取得されるかどうかを決定できます。Oracle Streamsレプリケーション環境では、Oracle Streamsクライアントはタグとルールを使用して変更循環を回避します。
次の各項で、特定のタイプのレプリケーション環境で変更循環が回避される方法を説明します。
注意:
DBMS_STREAMS.SET_TAG
プロシージャを使用します。例については、「データベース・オブジェクトでの適用エラーの修正」を参照してください。
Oracle Streamsにより、多くの異なるタイプのカスタム・レプリケーション環境を構成できます。ただし、最も一般的なのは、2データベース、ハブアンドスポークおよびn-wayの3つのタイプのレプリケーション環境です。
次の各項で、これらの一般的なレプリケーション環境タイプについて説明し、どのタイプを使用するのが最適かの決定を支援します。
2データベース・レプリケーション環境は、レプリケートされたデータベース・オブジェクトを2つのデータベースのみで共有するレプリケーション環境です。一方のデータベースでレプリケートされたデータベース・オブジェクトに対して行われた変更は、取得された後、もう一方のデータベースに直接送信されて適用されます。2データベース・レプリケーション環境では、一方のデータベースのみでデータベース・オブジェクトに対する変更が許可される場合も、両方のデータベースでデータベース・オブジェクトに対する変更が許可される場合もあります。
レプリケートされたデータベース・オブジェクトに対する変更が一方のデータベースのみで許可されている場合、もう一方のデータベースには、これらのデータベース・オブジェクトの読取り専用レプリカが含まれます。これを単方向レプリケーション環境と呼び、通常は次の基本コンポーネントが含まれます。
図4-6に、単方向レプリケーション用に構成された2データベース・レプリケーション環境を示します。
2データベース・レプリケーション環境では、両方のデータベースで、レプリケートされたデータベース・オブジェクトを変更できます。この場合、データベース・オブジェクトに対する変更は、両方のデータベースで取得され、他方のデータベースに送信されて取得されます。これを双方向レプリケーション環境と呼び、通常は次の基本コンポーネントが含まれます。
図4-7に、双方向レプリケーション用に構成された2データベース・レプリケーション環境を示します。
通常、双方向レプリケーション環境では、レプリケートされたデータベース・オブジェクトの同期化を維持するために競合解消を構成する必要があります。DBMS_STREAMS_ADM
パッケージの構成プロシージャを使用して、2データベース・レプリケーション環境を構成できます。「Oracle Streamsレプリケーションの構成プロシージャの概要」を参照してください。
ハブアンドスポーク・レプリケーション環境は、集中データベース(ハブ)がセカンダリ・データベース(スポーク)と通信する環境です。スポークは相互に直接通信しません。ハブアンドスポーク・レプリケーション環境では、スポークはレプリケートされたデータベース・オブジェクトに対する変更を許可する場合と許可しない場合があります。
スポークが変更を許可しない場合、スポークにはハブのデータベース・オブジェクトの読取り専用レプリカが含まれます。このタイプのハブアンドスポーク・レプリケーション環境には、通常は次の基本コンポーネントがあります。
図4-8に、読取り専用スポークのあるハブアンドスポーク・レプリケーション環境を示します。
スポークがデータベース・オブジェクトに対する変更を許可する場合、通常は変更が取得されてハブに送信され、ハブが他のスポークに変更をレプリケートします。このタイプのハブアンドスポーク・レプリケーション環境には、通常は次の基本コンポーネントがあります。
図4-9に、読取り/書込みスポークのあるハブアンドスポーク・レプリケーション環境を示します。
通常、スポーク・データベースでの変更が許可されるハブアンドスポーク・レプリケーション環境では、レプリケートされたデータベース・オブジェクトの同期化を維持するために競合解消を構成する必要があります。ハブアンドスポーク・レプリケーション環境では、レプリケートされたデータベース・オブジェクトに対する変更が一部のスポークでは許可されますが、残りのスポークでは許可されない場合があります。
DBMS_STREAMS_ADM
パッケージの構成プロシージャを使用して、ハブアンドスポーク・レプリケーション環境を構成できます。「Oracle Streamsレプリケーションの構成プロシージャの概要」を参照してください。
ハブアンドスポーク・レプリケーションが有効な場合については、「Oracle Streamsでのデータのレプリケート時期」を参照してください。
n-wayレプリケーション環境は、各データベースが環境内の他のデータベースと相互に直接通信する環境です。あるデータベースでのレプリケートされたデータベース・オブジェクトに対する変更は、取得されて環境内の他の各データベースに直接送信され、そこで適用されます。
n-wayレプリケーション環境には、通常は次の基本コンポーネントがあります。
図4-10に、n-wayレプリケーション環境を示します。
オラクル社が提供する次のパッケージを使用して、n-wayレプリケーション環境を構成できます。
DBMS_STREAMS_ADM
を使用して、キューの設定、取得プロセスまたは同期取得の作成、伝播の作成、適用プロセスおよびレプリケーション環境でのルールおよびルール・セットの構成などの、ほとんどの構成アクションが実行できます。
DBMS_CAPTURE_ADM
を使用して、レプリケーション環境で構成した取得プロセスを開始できます。
DBMS_APPLY_ADM
を使用して競合解消を構成し、その他の構成タスクと同様に適用プロセスを開始できます。
n-wayレプリケーションが有効な場合については、「Oracle Streamsでのデータのレプリケート時期」を参照してください。
通常、n-wayレプリケーション環境では、レプリケートされたデータベース・オブジェクトの同期化を維持するために競合解消を構成する必要があります。
n-wayレプリケーション環境の構成は、このマニュアルの対象外です。n-wayレプリケーション環境を構成する例の詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。
Oracle Streamsレプリケーション環境を構成する最も簡単な方法は、DBMS_STREAMS_ADM
パッケージにある次のいずれかの構成プロシージャを実行することです。
MAINTAIN_GLOBAL
プロシージャ: データベース・レベルでの変更を2つのデータベース間でレプリケートするOracle Streams環境を構成します。
MAINTAIN_SCHEMAS
プロシージャ: 指定したスキーマへの変更を2つのデータベース間でレプリケートするOracle Streams環境を構成します。
MAINTAIN_SIMPLE_TTS
プロシージャ: ソース・データベースからの単純な表領域のクローンを宛先データベースに作成し、Oracle Streamsを使用してこの表領域を両方のデータベースで維持します。
MAINTAIN_TABLES
プロシージャ: 指定した表への変更を2つのデータベース間でレプリケートするOracle Streams環境を構成します。
MAINTAIN_TTS
プロシージャ: ソース・データベースからの表領域セットのクローンを宛先データベースに作成し、Oracle Streamsを使用してこれらの表領域を両方のデータベースで維持します。
これらのプロシージャは、同時に2つのデータベースを構成します。一方のデータベースをソース・データベースに、もう一方のデータベースを宛先データベースに指定する必要があります。これらのプロシージャを複数回実行することによって、2つ以上のデータベースを使用するレプリケーション環境を構成できます。
表4-1に、これらのプロシージャに必要なパラメータを示します。
また、各プロシージャには、オプションのパラメータもあります。bi_directional
パラメータは、重要なオプションのパラメータです。レプリケートされたデータベース・オブジェクトに対する変更を各データベースで取得して、他のデータベースに送信するには、bi_directional
パラメータをTRUE
に設定する必要があります。このパラメータのデフォルトの設定はFALSE
です。bi_directional
パラメータがFALSE
に設定されていると、プロシージャは、宛先データベースでの変更が取得されない単方向レプリケーション環境を構成します。
これらのプロシージャは、Oracle Streamsレプリケーション環境を構成するために複数のタスクを実行します。次のタスクがあります。
bi_directional
パラメータがTRUE
に設定されている場合に、宛先データベースで、レプリケートされたデータベース・オブジェクトに対するサプリメンタル・ロギングを構成します。
source_database
パラメータで指定されたデータベースでプロシージャを実行すると、このデータベースでローカル取得プロセスが構成されます。source_database
パラメータで指定されたデータベース以外のデータベースでプロシージャを実行すると、プロシージャを実行するデータベースでダウンストリーム取得プロセスが構成されます。「取得プロセスでの変更の取得の概要」を参照してください。
bi_directional
パラメータがTRUE
に設定されている場合に、宛先データベースで、レプリケートされたデータベース・オブジェクトに対する変更を取得するための取得プロセスを構成します。この取得プロセスは、ローカル取得プロセスである必要があります。
bi_directional
パラメータがTRUE
に設定されている場合に、宛先データベースでデータベース・オブジェクトに対して行われた変更をソース・データベースに送信するための伝播を構成します。
bi_directional
パラメータがTRUE
に設定されている場合に、宛先データベースからの変更を適用する適用プロセスをソース・データベースで構成します。
bi_directional
パラメータがTRUE
に設定されている場合に、ソース・データベースで、レプリケートされたデータベース・オブジェクトのインスタンス化SCNを設定します。これらのプロシージャでは、常にハブアンドスポーク・レプリケーション環境用のタグが構成されます。これらのプロシージャおよびタグに関する重要な考慮事項を次に示します。
タグおよび様々なタイプのレプリケーション環境については、「変更の循環を回避するためのタグの概要」および「Oracle Streamsレプリケーション環境の一般的なタイプの概要」を参照してください。
参照:
|
Oracle Enterprise Manager以外にも、Oracle Streamsレプリケーション環境を構成および管理するためのPL/SQLパッケージが提供されています。また、Oracle Streamsレプリケーション環境を監視するためのデータ・ディクショナリ・ビューも提供されています。
次の各項で、Oracle Streamsが提供する主要なPL/SQLパッケージおよびデータ・ディクショナリ・ビューについて説明します。
表4-2に、Oracle Streamsレプリケーション環境の構成および管理に重要なPL/SQLパッケージを示します。
参照:
|
表4-3に、Oracle Streamsレプリケーション環境の監視に重要なデータ・ディクショナリ・ビューを示します。
参照:
|
Oracle Streamsレプリケーションを構成する前に、レプリケーション環境に参加するデータベースを準備します。
GLOBAL_NAMES
初期化パラメータをTRUE
に設定します。「GLOBAL_NAMES初期化パラメータをTRUEに設定」を参照してください。
COMPATIBLE
初期化パラメータをできるだけ高く設定することをお薦めします。可能な場合は、このパラメータを11.1.0
以上に設定します。
MEMORY_TARGET
初期化パラメータ(自動メモリー管理)、SGA_TARGET
初期化パラメータ(自動共有メモリー管理)またはSTREAMS_POOL_SIZE
初期化パラメータを設定することにより、Oracle Streamsを管理できます。Oracle Streamsプールの詳細は、『Oracle Streams概要および管理』を参照してください。Oracle Streamsコンポーネントのメモリー要件は次のとおりです。
parallelism
で制御されます。取得プロセスのパフォーマンスは、取得プロセスの並行性を調整すると改善される場合があります。
parallelism
で制御されます。適用プロセスのパフォーマンスは、適用プロセスの並行性を調整すると改善される場合があります。
PROCESSES
およびSESSIONS
初期化パラメータの値を増やすことが必要な場合があります。
ベスト・プラクティスに従えば、パフォーマンスの最適な環境を構成して問題を回避することができます。DBMS_STREAMS_ADM
パッケージの構成プロシージャを使用すれば自動的にベスト・プラクティスに従いますが、構成プロシージャを使用せずにOracle Streamsレプリケーション環境を構成する場合は、ベスト・プラクティスをよく確認し、できるだけそれに従ってください。
次に、Oracle Streamsの構成時に従う必要のある重要なベスト・プラクティスを示します。
Oracle Streams環境を構成した後は、Oracle Streams環境での操作時に次の重要なベスト・プラクティスに従う必要があります。
これらのベスト・プラクティスと、その他のOracle Streamsのベスト・プラクティスの詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。
参照:
|
この項では、Oracle Streamsレプリケーション環境の構成方法について、例を使用して説明します。例では、最も一般的なタイプのOracle Streamレプリケーション環境を構成します。
次に、例について説明します。
この例では、2つのデータベースでhr
スキーマにあるすべての表にデータ操作言語(DML)変更をレプリケートするOracle Streamsレプリケーション環境を構成します。構成では、レプリケートされたデータベース・オブジェクトに対する変更を取得する取得プロセスを使用します。
例は、単方向レプリケーションまたは双方向レプリケーション用に環境を構成する方法を示しています。単方向レプリケーションでは、1つのデータベースのみがデータベース・オブジェクトを変更できます。双方向レプリケーションでは、両方のデータベースがデータベース・オブジェクトを変更できます。
この構成は、2つのデータベースのみを含む比較的単純なレプリケーション環境を構成する際に有効です。2つ目のデータベースをレポートまたはデータ分析に使用する場合は、単方向レプリケーション環境を構成します。両方のデータベースでデータの読取り/書込みが必要な場合は、双方向レプリケーション環境を構成します。たとえば、スケーラビリティやデータの可用性を向上させるには、双方向レプリケーションを使用します。
2データベース・レプリケーション環境の詳細は、「2データベース・レプリケーション環境の概要」を参照してください。
この例では、2つのデータベースでhr
スキーマにあるすべての表にデータ操作言語(DML)の変更をレプリケートするOracle Streamsレプリケーション環境を構成します。例は、単方向レプリケーションの構成方法を示していて、レプリケートされたデータベース・オブジェクトに対する変更は、1つのソース・データベースでのみ許可されます。構成では、ソース・データベースでデータベース・オブジェクトに対して行った変更を取得するために、宛先データベースでダウンストリーム取得プロセスを使用しています。宛先データベースでは、データベース・オブジェクトは読取り専用です。
この構成は、プライマリ・データベースから別のデータベースにレポートまたはデータ分析をオフロードする際に使用します。この例では、2つ目のデータベースで取得プロセスを実行し、プライマリ・データベースの負荷を削減しています。
2データベース・レプリケーション環境の詳細は、「2データベース・レプリケーション環境の概要」を参照してください。
この例では、3つのデータベースでhr
スキーマにあるすべての表にデータ操作言語(DML)をレプリケートするOracle Streamsレプリケーション環境を構成します。この例では、1つのハブと2つのスポークを持つハブアンドスポーク・レプリケーション環境を構成します。ハブアンドスポーク・レプリケーション環境は、1つの中央データベース(ハブ)がセカンダリ・データベース(スポーク)と通信する環境です。この例では、スポーク・データベースによって、レプリケートされたデータベース・オブジェクトに対する変更が可能になります。構成では、レプリケートされたデータベース・オブジェクトに対する変更を取得する取得プロセスを使用します。
この構成は、複数のセカンダリ・データベースにデータをレプリケートする必要のある中央データベースが存在する場合に使用します。たとえば、本社に中央データベースがあり、販売代理店に複数のセカンダリ・データベースがある企業にこの構成が有効です。
ハブアンドスポーク・レプリケーション環境の詳細は、「ハブアンドスポーク・レプリケーション環境の概要」を参照してください。
この例では、2つのデータベースでhr
スキーマにあるemployees
表およびdepartments
表にデータ操作言語(DML)変更をレプリケートするOracle Streamsレプリケーション環境を構成します。この例では、2つのデータベース間での双方向レプリケーションを構成しています。このため、データベース・オブジェクトに対する変更は両方のデータベースで許可されています。構成では、レプリケートされたデータベース・オブジェクトに対する変更を取得する同期取得を使用します。
この構成は、2つのデータベースと少数の表のみを使用する比較的単純なレプリケーション環境を構成する際に使用します。Oracle Database 11g Standard Editionをインストールしている場合は、同期取得を使用することもできます。取得プロセスを使用するには、Oracle Database 11g Enterprise Editionをインストールする必要があります。
2データベース・レプリケーション環境の詳細は、「2データベース・レプリケーション環境の概要」を参照してください。
この項では、表の競合解消を構成する例も示します。「チュートリアル: 表の最新時刻競合解消の構成」を参照してください。競合解消は、レプリケートされた表に対するDML変更の実行を2つ以上のデータベースに対して許可するレプリケーション環境で使用します。この例は、最新時刻の競合解消を構成しています。このため、表に対する行変更によって競合が発生すると、最新の変更は保持され、古い変更は破棄されます。競合解消の詳細は、「競合と競合解消の概要」を参照してください。
この例では、hr
スキーマにあるすべての表に、データ操作言語(DML)変更をレプリケートするOracle Streamsレプリケーション環境を構成します。この例では、変更を取得するローカル取得プロセスを使用して2データベース・レプリケーション環境を構成します。この例では、グローバル・データベース名db1.example.com
およびdb2.example.com
を使用します。ただし、例を完了するために、ご使用の環境のデータベースに置き換えることもできます。2データベース・レプリケーション環境の詳細は、「2データベース・レプリケーション環境の概要」を参照してください。
この例では、DBMS_STREAMS_ADM
パッケージのMAINTAIN_SCHEMAS
プロシージャを使用して2データベース・レプリケーション環境を構成します。このプロシージャは、1つ以上のスキーマをレプリケートするOracle Streams環境を構成する最速で最も単純な方法です。また、プロシージャはOracle Streamsレプリケーション環境に対して設定されたベスト・プラクティスに従います。
レプリケーション用に構成されているデータベース・オブジェクトは、MAINTAIN_SCHEMAS
プロシージャの実行時に、宛先データベースに存在する場合としない場合があります。宛先データベースにデータベース・オブジェクトが存在しない場合、MAINTAIN_SCHEMAS
プロシージャはデータ・ポンプ・エクスポート/インポートを使用して、宛先データベースでデータベース・オブジェクトをインスタンス化します。インスタンス化の際に、これらのデータベース・オブジェクトにインスタンス化SCNが設定されます。宛先データベースにデータベース・オブジェクトが存在する場合、MAINTAIN_SCHEMAS
プロシージャは既存のデータベース・オブジェクトを保持して、インスタンス化SCNを設定します。この例では、MAINTAIN_SCHEMAS
プロシージャを実行する前に、db1.example.com
データベースおよびdb2.example.com
データベースの両方にhr
スキーマが存在しています。
この例では、単方向レプリケーションまたは双方向レプリケーションの構成方法を示しています。双方向レプリケーションを構成するには、追加の手順を実行して、構成プロシージャの実行時にbi_directional
パラメータをTRUE
に設定する必要があります。
図4-11に、この例で作成した環境の概要を示します。双方向レプリケーションに必要な追加のコンポーネントはグレーで表示され、そのアクションは破線で示されています。
db1.example.com
データベースがdb2.example.com
データベースと通信できるように、ネットワーク接続を構成します。データベース間のネットワーク接続の構成の詳細は、『Oracle Database 2日でデータベース管理者』を参照してください。
strmadmin
であると想定します。
db1.example.com
データベースからdb2.example.com
データベースへのデータベース・リンクを作成します。データベース・リンクは、Oracle Streams管理者のスキーマに作成する必要があります。また、データベース・リンクは別のデータベースでOracle Streams管理者に接続する必要があります。データベース・リンクの名前およびサービス名は、どちらもdb2.example.com
である必要があります。詳細は、「チュートリアル: データベース・リンクの作成」を参照してください。
ARCHIVELOG
モードで実行するようにdb1.example.com
データベースを構成します。取得プロセスがソース・データベースで生成された変更を取得するには、ソース・データベースをARCHIVELOG
モードで実行する必要があります。ARCHIVELOG
モードで実行するためのデータベースの構成の詳細は、『Oracle Database管理者ガイド』を参照してください。
db2.example.com
データベースからdb1.example.com
データベースへのデータベース・リンクを作成します。データベース・リンクは、Oracle Streams管理者のスキーマに作成する必要があります。また、データベース・リンクは別のデータベースでOracle Streams管理者に接続する必要があります。データベース・リンクの名前およびサービス名は、どちらもdb1.example.com
である必要があります。詳細は、「チュートリアル: データベース・リンクの作成」を参照してください。
ARCHIVELOG
モードで実行するようにdb2.example.com
データベースを構成します。取得プロセスがソース・データベースで生成された変更を取得するには、ソース・データベースをARCHIVELOG
モードで実行する必要があります。ARCHIVELOG
モードで実行するためのデータベースの構成の詳細は、『Oracle Database管理者ガイド』を参照してください。
db2.example.com
データベースに接続します。SQL*Plusの起動の詳細は、『Oracle Database 2日でデータベース管理者』を参照してください。
MAINTAIN_SCHEMAS
プロシージャで生成されるファイル(インスタンス化に使用するデータ・ポンプ・エクスポート・ダンプ・ファイルを含む)を保持するディレクトリ・オブジェクトを作成します。ディレクトリ・オブジェクトは、コンピュータ・システム上の任意のアクセス可能ディレクトリを指すことができます。たとえば、次の文は、/usr/db2_log_filesディレクトリを指すdb2_dir
という名前のディレクトリ・オブジェクトを作成します。
CREATE DIRECTORY db2_dir AS '/usr/db2_log_files';
db1.example.com
データベースにOracle Streams管理者として接続します。SQL*Plusでのデータベースへの接続の詳細は、『Oracle Database管理者ガイド』を参照してください。
MAINTAIN_SCHEMAS
プロシージャで生成されるファイル(インスタンス化に使用するデータ・ポンプ・エクスポート・ダンプ・ファイルを含む)を保持するディレクトリ・オブジェクトを作成します。ディレクトリ・オブジェクトは、コンピュータ・システム上の任意のアクセス可能ディレクトリを指すことができます。たとえば、次の文は、/usr/db1_log_filesディレクトリを指すdb1_dir
という名前のディレクトリ・オブジェクトを作成します。
CREATE DIRECTORY db1_dir AS '/usr/db1_log_files';
MAINTAIN_SCHEMAS
プロシージャを実行して、db1.example.com
データベースとdb2.example.com
データベース間でhr
スキーマのレプリケーションを構成します。bi_directional
パラメータが、構成するレプリケーション環境用に適切に設定されていることを確認します。このパラメータは、単方向レプリケーションを構成する場合はFALSE
に、双方向レプリケーションを構成する場合はTRUE
に設定します。
BEGIN DBMS_STREAMS_ADM.MAINTAIN_SCHEMAS( schema_names => 'hr', source_directory_object => 'db1_dir', destination_directory_object => 'db2_dir', source_database => 'db1.example.com', destination_database => 'db2.example.com', bi_directional => FALSE); -- Set to TRUE for bi-directional END; /
MAINTAIN_SCHEMAS
プロシージャは、多くの構成タスクを実行するため時間がかかることがあります。プロシージャの実行中は、宛先データベースのレプリケートされたデータベース・オブジェクトにデータ操作言語(DML)またはデータ定義言語(DLL)変更が行われないようにしてください。「Oracle Streamsレプリケーションの構成プロシージャの概要」を参照してください。
構成プロシージャを実行すると、進捗情報がDBA_RECOVERABLE_SCRIPT
、DBA_RECOVERABLE_SCRIPT_PARAMS
、DBA_RECOVERABLE_SCRIPT_BLOCKS
およびDBA_RECOVERABLE_SCRIPT_ERRORS
データ・ディクショナリ・ビューに記録されます。プロシージャがエラーによって停止した場合は、DBMS_STREAMS_ADM
パッケージ内のRECOVER_OPERATION
プロシージャの使用方法について、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。
hr
スキーマ内のすべての表に対して最新時刻の競合解消を構成します。このスキーマには、countries
、departments
、employees
、jobs
、job_history
、locations
およびregions
表が含まれます。方法については、「チュートリアル: 表の最新時刻競合解消の構成」を参照してください。
例を完了すると、次の特性を持つ2データベース・レプリケーション環境が構成されます。
db1.example.com
では、サプリメンタル・ロギングがhr
スキーマの表に対して構成されています。
db1.example.com
データベースには次のコンポーネントがあります。
db2.example.com
データベースには次のコンポーネントがあります。
db2.example.com
では、hr
スキーマの表に対するサプリメンタル・ロギング。
db2.example.com
では、システムで生成された名前を持つ取得プロセス。取得プロセスはhr
スキーマへのDML変更を取得します。
db2.example.com
では、システムで生成された名前を持つキュー。このキューは、データベースの取得プロセスに対するものです。
db1.example.com
では、システムで生成された名前を持つ、db2.example.com
データベースから送信された変更を受信するキュー。このキューは、ローカル・データベースの適用プロセスに対するものです。
db1.example.com
では、システムで生成された名前を持つ適用プロセス。適用プロセスはキューから変更をデキューし、それをhr
スキーマに適用します。
レプリケーション環境における変更の循環の回避については、「変更の循環を回避するためのタグの概要」を参照してください。単方向レプリケーションを構成した場合は、変更は単一のロケーションでのみ取得されるため、変更の循環は発生しません。
db1.example.com
データベースで、取得プロセスが有効化され、取得タイプがローカルであることを確認します。確認には、「取得プロセスの情報の表示」の手順に従って、「取得」サブページで「ステータス」および「取得タイプ」フィールドを確認します。
db1.example.com
データベースで、伝播が有効化されていることを確認します。確認には、「伝播の情報の表示」の手順に従って、「伝播」サブページで「ステータス」フィールドを確認します。
db2.example.com
データベースで、適用プロセスが有効化されていることを確認します。確認には、「適用プロセスの情報の表示」の手順に従って、「適用」サブページで「ステータス」フィールドを確認します。
hr
スキーマに対する変更を取得するデータベースで、DML変更をhr
スキーマのすべての表に対して行います。この例では、db1.example.com
データベースがhr
スキーマに対する変更を取得しています。双方向レプリケーションを構成した場合は、db2.example.com
もhr
スキーマに対する変更を取得します。
参照:
MAINTAIN_SCHEMAS
プロシージャの使用方法の詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。
MAINTAIN_SCHEMAS
プロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。
この項の例では、hr
スキーマにあるすべての表に、データ操作言語(DML)変更をレプリケートするOracle Streamsレプリケーション環境を構成します。この例では、宛先データベースでダウンストリーム取得プロセスを使用して2データベース・レプリケーション環境を構成します。この例では、グローバル・データベース名src.example.com
およびdest.example.com
を使用します。ただし、例を完了するために、ご使用の環境のデータベースに置き換えることもできます。2データベース・レプリケーション環境の詳細は、「2データベース・レプリケーション環境の概要」を参照してください。
この例では、ダウンストリーム取得プロセスは宛先データベースdest.example.com
で実行されます。したがって、変更の取得に必要なリソースはソース・データベースsrc.example.com
で解放されます。この例では、アーカイブ・ログ・ダウンストリーム取得プロセスではなく、リアルタイム・ダウンストリーム取得プロセスを構成します。リアルタイム・ダウンストリーム取得は、ソース・データベースでの変更の取得に必要な時間を短縮できるという利点があります。時間を短縮できるのは、データを取得する前にREDOログ・ファイルがアーカイブされるまで待つ必要がないためです。
この例では、レプリケートされたデータベース・オブジェクトが宛先データベースでレポートおよび分析に使用されると想定しています。このため、これらのデータベース・オブジェクトは、dest.example.com
データベースでは読取り専用であると想定しています。
この例では、DBMS_STREAMS_ADM
パッケージのMAINTAIN_SCHEMAS
プロシージャを使用して2データベース・レプリケーション環境を構成します。このプロシージャは、1つ以上のスキーマをレプリケートするOracle Streams環境を構成する最速で最も単純な方法です。また、プロシージャはOracle Streamsレプリケーション環境に対して設定されたベスト・プラクティスに従います。
レプリケーション用に構成されているデータベース・オブジェクトは、MAINTAIN_SCHEMAS
プロシージャの実行時に、宛先データベースに存在する場合としない場合があります。宛先データベースにデータベース・オブジェクトが存在しない場合、MAINTAIN_SCHEMAS
プロシージャはデータ・ポンプ・エクスポート/インポートを使用して、宛先データベースでデータベース・オブジェクトをインスタンス化します。インスタンス化の際に、これらのデータベース・オブジェクトにインスタンス化SCNが設定されます。宛先データベースにデータベース・オブジェクトが存在する場合、MAINTAIN_SCHEMAS
プロシージャは既存のデータベース・オブジェクトを保持して、インスタンス化SCNを設定します。この例では、MAINTAIN_SCHEMAS
プロシージャを実行する前に、src.example.com
データベースおよびdest.example.com
データベースの両方にhr
スキーマが存在しています。
図4-12に、この例で作成する環境の概要を示します。
src.example.com
データベースとdest.example.com
データベースが相互に通信できるように、ネットワーク接続を構成します。データベース間のネットワーク接続の構成の詳細は、『Oracle Database 2日でデータベース管理者』を参照してください。
strmadmin
であると想定します。
src.example.com
データベースからdest.example.com
データベースへ。データベース・リンクの名前とサービス名は、どちらもdest.example.com
である必要があります。
dest.example.com
データベースからsrc.example.com
データベースへ。データベース・リンクの名前とサービス名は、どちらもsrc.example.com
である必要があります。
src.example.com
は、dest.example.com
データベースにおけるダウンストリーム取得プロセスのソース・データベースなので、dest.example.com
データベースからsrc.example.com
データベースへのデータベース・リンクが必要となります。このデータベース・リンクは取得プロセスの作成および構成を簡略化します。
各データベース・リンクは、Oracle Streams管理者のスキーマに作成する必要があります。また、各データベース・リンクは、他のデータベースでOracle Streams管理者に接続する必要があります。方法については、「チュートリアル: データベース・リンクの作成」を参照してください。
ARCHIVELOG
モードで実行するように両方のデータベースを構成します。ダウンストリーム取得プロセスがソース・データベースで生成された変更を取得するには、ソース・データベースとダウンストリーム取得データベースをARCHIVELOG
モードで実行する必要があります。この例では、src.example.com
およびdest.example.com
データベースをARCHIVELOG
モードで実行する必要があります。ARCHIVELOG
モードで実行するためのデータベースの構成の詳細は、『Oracle Database管理者ガイド』を参照してください。
REDO転送セッションは、Secure Sockets Layer(SSL)プロトコルまたはリモート・ログイン・パスワード・ファイルのいずれかを使用して認証されます。ソース・データベースにリモート・ログイン・パスワード・ファイルがある場合は、それをダウンストリーム取得データベース・システムの適切なディレクトリにコピーします。パスワード・ファイルは、ソース・データベースおよびダウンストリーム取得データベースで同じである必要があります。
この例で、ソース・データベースはsrc.example.com
で、ダウンストリーム取得データベースはdest.example.com
です。REDO転送の認証要件の詳細は、『Oracle Data Guard概要および管理』を参照してください。
src.example.com
で次の初期化パラメータを設定し、REDOデータがソース・データベースのオンラインREDOログからダウンストリーム・データベースdest.example.com
のスタンバイREDOログに転送されるようにREDO転送サービスを構成します。
LOG_ARCHIVE_DEST_
n
初期化パラメータを1つ以上構成します。これを行うには、このパラメータに次の属性を設定します。
SERVICE
: ダウンストリーム・データベースのネットワーク・サービス名を指定します。
ASYNC
またはSYNC
: REDO転送モードを指定します。ASYNC
を指定するメリットは、ソース・データベースのパフォーマンスにほとんど影響を与えないことです。ソース・データベースでOracle Database 10gリリース1以上が実行されていて、ダウンストリーム・データベースまたはネットワークのパフォーマンスが低いときは、ASYNC
を使用してソース・データベースのパフォーマンスへの影響を回避することをお薦めします。
SYNC
を指定するメリットは、ASYNC
を指定する場合と比べて、ダウンストリーム・データベースにREDOデータが速く送信されることです。また、SYNC
AFFIRM
を指定すると、MAXIMUM
AVAILABILITY
スタンバイ保護モードの場合と同様に動作するようになります。SQL文ALTER
DATABASE
STANDBY
DATABASE
TO
MAXIMIZE
AVAILABILITY
を指定しても、Oracle Streams取得プロセスには影響しないことに注意してください。
NOREGISTER
: この属性は、アーカイブREDOログ・ファイルの場所がダウンストリーム・データベース制御ファイルに記録されないように指定します。
VALID_FOR
: (ONLINE_LOGFILE,PRIMARY_ROLE)
または(ONLINE_LOGFILE,ALL_ROLES)
を指定します。
DB_UNIQUE_NAME
: ダウンストリーム・データベースの一意の名前です。ダウンストリーム・データベースでDB_UNIQUE_NAME
初期化パラメータに指定した名前を使用します。
次に、ダウンストリーム・データベースを指定するLOG_ARCHIVE_DEST_
n
設定の例を示します。
LOG_ARCHIVE_DEST_2='SERVICE=DEST.EXAMPLE.COM ASYNC NOREGISTER VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=dest'
LOG_ARCHIVE_DEST_STATE_
n
: ソース・データベースで、ダウンストリーム・データベースのLOG_ARCHIVE_DEST_
n
パラメータに対応する初期化パラメータをENABLE
に設定します。たとえば、ダウンストリーム・データベースにLOG_ARCHIVE_DEST_2
初期化パラメータが設定されている場合、LOG_ARCHIVE_DEST_STATE_2
パラメータを次のように設定します。
LOG_ARCHIVE_DEST_STATE_2=ENABLE
LOG_ARCHIVE_CONFIG
: この初期化パラメータのDB_CONFIG
属性を設定して、ソース・データベースおよびダウンストリーム・データベースのDB_UNIQUE_NAME
を含めます。たとえば、ソース・データベースのDB_UNIQUE_NAME
がsrc
で、ダウンストリーム・データベースのDB_UNIQUE_NAME
がdest
の場合、次のパラメータを指定します。
LOG_ARCHIVE_CONFIG='DG_CONFIG=(src,dest)'
デフォルトでは、LOG_ARCHIVE_CONFIG
パラメータによって、データベースでのREDOの送受信が可能になります。
dest.example.com
で、次の初期化パラメータを設定し、ローカルに生成されるREDOデータのアーカイブを構成します。
LOG_ARCHIVE_DEST_
n
初期化パラメータで、少なくとも1つのアーカイブ・ログの保存先を、ダウンストリーム・データベースを実行しているコンピュータ・システム上のディレクトリまたはフラッシュ・リカバリ領域に設定します。これを設定するには、このパラメータの次の属性を設定します。
LOCATION
: ディスク・ディレクトリへの有効なパス名またはUSE_DB_RECOVERY_FILE_DEST
を指定します。LOCATION
属性に指定する各宛先に、一意のディレクトリ・パス名またはUSE_DB_RECOVERY_FILE_DEST
を指定する必要があります。これは、ローカル・データベースで生成されるアーカイブREDOログ・ファイルのローカルの宛先です。
VALID_FOR
: (ONLINE_LOGFILE,PRIMARY_ROLE)
または(ONLINE_LOGFILE,ALL_ROLES)
を指定します。
次の例は、リアルタイム・ダウンストリーム取得データベースでローカルに生成されるREDOデータに対するLOG_ARCHIVE_DEST_
n
設定です。
LOG_ARCHIVE_DEST_1='LOCATION=/home/arc_dest/local_rl VALID_FOR=(ONLINE_LOGFILE,PRIMARY_ROLE)'
リアルタイム・ダウンストリーム取得構成では、アーカイブ・スタンバイREDOログ・ファイルをダウンストリーム・データベースからのアーカイブ・オンラインREDOログ・ファイルとは別に保持する必要があります。これを実現するには、VALID_FOR
属性のREDOログ・タイプにALL_LOGFILES
ではなくてONLINE_LOGFILE
を指定します。
必要に応じて、LOG_ARCHIVE_DEST_
n
初期化パラメータの他の属性も指定できます。
LOG_ARCHIVE_DEST_
n
パラメータに対応するLOG_ARCHIVE_DEST_STATE_
n
初期化パラメータをENABLE
に設定します。たとえば、LOG_ARCHIVE_DEST_1
初期化パラメータが設定されている場合、LOG_ARCHIVE_DEST_STATE_1
パラメータを次のように設定します。
LOG_ARCHIVE_DEST_STATE_1=ENABLE
dest.example.com
で、ダウンストリーム・データベースがソース・データベースからREDOデータを受信し、ダウンストリーム・データベースのスタンバイREDOログにそのREDOデータを書き込むように、次の初期化パラメータを設定します。
LOG_ARCHIVE_DEST_
n
初期化パラメータで、少なくとも1つのアーカイブ・ログの保存先を、ダウンストリーム・データベースを実行しているコンピュータ・システム上のディレクトリまたはフラッシュ・リカバリ領域に設定します。これを設定するには、このパラメータの次の属性を設定します。
LOCATION
: ディスク・ディレクトリへの有効なパス名またはUSE_DB_RECOVERY_FILE_DEST
を指定します。LOCATION
属性に指定する各宛先に、一意のディレクトリ・パス名またはUSE_DB_RECOVERY_FILE_DEST
を指定する必要があります。これは、スタンバイREDOログから書き込まれたアーカイブREDOログ・ファイルのローカルの宛先です。リモート・ソース・データベースからのログ・ファイルは、ローカル・データベースのログ・ファイルとは別に保持する必要があります。
VALID_FOR
: (STANDBY_LOGFILE,PRIMARY_ROLE)
または(STANDBY_LOGFILE,ALL_ROLES)
を指定します。
次の例は、リアルタイム・ダウンストリーム取得データベースでのLOG_ARCHIVE_DEST_
n
設定です。
LOG_ARCHIVE_DEST_2='LOCATION=/home/arc_dest/srl_src1 VALID_FOR=(STANDBY_LOGFILE,PRIMARY_ROLE)'
必要に応じて、LOG_ARCHIVE_DEST_
n
初期化パラメータの他の属性も指定できます。
LOG_ARCHIVE_DEST_
n
パラメータに対応するLOG_ARCHIVE_DEST_STATE_
n
初期化パラメータをENABLE
に設定します。たとえば、ダウンストリーム・データベースにLOG_ARCHIVE_DEST_2
初期化パラメータが設定されている場合、LOG_ARCHIVE_DEST_STATE_2
パラメータを次のように設定します。
LOG_ARCHIVE_DEST_STATE_2=ENABLE
LOG_ARCHIVE_CONFIG
: この初期化パラメータのDB_CONFIG
属性を設定して、ソース・データベースおよびダウンストリーム・データベースのDB_UNIQUE_NAME
を含めます。たとえば、ソース・データベースのDB_UNIQUE_NAME
がsrc
で、ダウンストリーム・データベースのDB_UNIQUE_NAME
がdest
の場合、次のパラメータを指定します。
LOG_ARCHIVE_CONFIG='DG_CONFIG=(src,dest)'
デフォルトでは、LOG_ARCHIVE_CONFIG
パラメータによって、データベースでのREDOの送受信が可能になります。
手順2、3または4で、インスタンスの実行中には初期化パラメータをリセットしなかったが、初期化パラメータ・ファイルでリセットした場合は、データベースを再起動します。ソース・データベースのグローバル名は、ソース・データベースがオープンな場合にのみダウンストリーム・データベースに送信されるため、ダウンストリーム・データベースにREDOデータを送信するときには、ソース・データベースがオープンである必要があります。
dest.example.com
で、管理ユーザーとして接続してスタンバイREDOログ・ファイルを作成します。src.example.com
に接続します。たとえば、管理ユーザーとしてsrc.example.com
データベースに接続するには、次のようにします。
sqlplus system@src.example.com Enter password: password
SQL*Plusの起動の詳細は、『Oracle Database 2日でデータベース管理者』を参照してください。
src.example.com
で使用するログ・ファイルのサイズを決定します。スタンバイ・ログ・ファイルのサイズは、ソース・データベースのログ・ファイル・サイズと正確に同じかそれより大きくなるようにします。たとえば、ソース・データベースのログ・ファイル・サイズが500MBの場合、スタンバイ・ログ・ファイルのサイズも500MB以上にします。ソース・データベースにおけるREDOログ・ファイルのサイズ(バイト単位)は、ソース・データベースでV$LOG
ビューを問い合せて確認することができます。たとえば、次のようにV$LOG
ビューを問い合せます。
SELECT BYTES FROM V$LOG;
dest.example.com
で必要なスタンバイ・ログ・ファイル・グループの数を決定します。スタンバイ・ログ・ファイル・グループの数は、ソース・データベースでのオンライン・ログ・ファイル・グループの数より1以上大きくする必要があります。たとえば、ソース・データベースに2つのオンライン・ログ・ファイル・グループがある場合、ダウンストリーム・データベースには少なくとも3つのスタンバイ・ログ・ファイル・グループが必要です。ソース・データベースのオンライン・ログ・ファイル・グループの数は、ソース・データベースでV$LOG
ビューを問い合せて確認することができます。たとえば、SQL*Plusで管理ユーザーとしてまだsrc.example.com
に接続している状態で、次のようにV$LOG
ビューを問い合せます。
SELECT COUNT(GROUP#) FROM V$LOG;
dest.example.com
に接続します。
CONNECT system@dest.example.com Enter password: password
ALTER
DATABASE
ADD
STANDBY
LOGFILE
を使用して、ダウンストリーム・データベースdest.example.com
にスタンバイ・ログ・ファイル・グループを追加します。たとえば、ソース・データベースに2つのオンラインREDOログ・ファイル・グループがあり、ログ・ファイルのサイズが500MBであるとします。この場合、次の文を使用して適切なスタンバイ・ログ・ファイル・グループを作成します。
ALTER DATABASE ADD STANDBY LOGFILE GROUP 3 ('/oracle/dbs/slog3a.rdo', '/oracle/dbs/slog3b.rdo') SIZE 500M; ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 ('/oracle/dbs/slog4a.rdo', '/oracle/dbs/slog4b.rdo') SIZE 500M; ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 ('/oracle/dbs/slog5a.rdo', '/oracle/dbs/slog5b.rdo') SIZE 500M;
dest.example.com
で次の問合せを実行し、スタンバイ・ログ・ファイル・グループが正常に追加されたことを確認します。
SELECT GROUP#, THREAD#, SEQUENCE#, ARCHIVED, STATUS FROM V$STANDBY_LOG;
出力は次のようになります。
GROUP# THREAD# SEQUENCE# ARC STATUS ---------- ---------- ---------- --- ---------- 3 0 0 YES UNASSIGNED 4 0 0 YES UNASSIGNED 5 0 0 YES UNASSIGNED
LOCATION
属性に指定したディレクトリに表示されることを確認します。ディレクトリ内のファイルを表示するために、ソース・データベースにあるログ・ファイルを切り替える必要がある場合があります。
src.example.com
データベースにOracle Streams管理者として接続します。SQL*Plusでのデータベースへの接続の詳細は、『Oracle Database管理者ガイド』を参照してください。
MAINTAIN_SCHEMAS
プロシージャで生成されるファイル(インスタンス化に使用するデータ・ポンプ・エクスポート・ダンプ・ファイルを含む)を保持するディレクトリ・オブジェクトを作成します。ディレクトリ・オブジェクトは、コンピュータ・システム上の任意のアクセス可能ディレクトリを指すことができます。たとえば、次の文は、/usr/src_log_filesディレクトリを指すsrc_dir
という名前のディレクトリ・オブジェクトを作成します。
CREATE DIRECTORY src_dir AS '/usr/src_log_files';
dest.example.com
データベースにOracle Streams管理者として接続します。
MAINTAIN_SCHEMAS
プロシージャで生成されるファイル(インスタンス化に使用するデータ・ポンプ・エクスポート・ダンプ・ファイルを含む)を保持するディレクトリ・オブジェクトを作成します。ディレクトリ・オブジェクトは、コンピュータ・システム上の任意のアクセス可能ディレクトリを指すことができます。たとえば、次の文は、/usr/dest_log_filesディレクトリを指すdest_dir
という名前のディレクトリ・オブジェクトを作成します。
CREATE DIRECTORY dest_dir AS '/usr/dest_log_files';
dest.example.com
データベースにまだOracle Streams管理者として接続しているときに、MAINTAIN_SCHEMAS
プロシージャを実行してsrc.example.com
データベースとdest.example.com
データベース間のレプリケーションを構成します。
BEGIN DBMS_STREAMS_ADM.MAINTAIN_SCHEMAS( schema_names => 'hr', source_directory_object => 'src_dir', destination_directory_object => 'dest_dir', source_database => 'src.example.com', destination_database => 'dest.example.com', capture_name => 'capture', capture_queue_table => 'streams_queue_qt', capture_queue_name => 'streams_queue', apply_name => 'apply', apply_queue_table => 'streams_queue_qt', apply_queue_name => 'streams_queue'); END; /
MAINTAIN_SCHEMAS
プロシージャは、多くの構成タスクを実行するため時間がかかることがあります。プロシージャの実行中は、宛先データベースのレプリケートされたデータベース・オブジェクトにデータ操作言語(DML)またはデータ定義言語(DLL)変更が行われないようにしてください。
MAINTAIN_SCHEMAS
プロシージャで必要なパラメータは、schema_names
、source_directory_object
、destination_directory_object
、source_database
およびdestination_database
です。「Oracle Streamsレプリケーションの構成プロシージャの概要」を参照してください。
この例では、取得プロセス、取得プロセスのキュー表、取得プロセスのキュー、適用プロセス、適用プロセスのキュー表および適用プロセスのキューの名前を選択できることを示すために他のパラメータを指定しています。これらのパラメータを指定しないと、システムで生成された名前が使用されます。
構成プロシージャを使用してダウンストリーム取得を構成する際は、キューおよびキュー表の名前を指定するパラメータは重要です。このような構成では、キュー間で変更が伝播されないようにするために、取得プロセスおよび適用プロセスがダウンストリーム取得プロセスで同じキューを使用するとより効率的です。このサンプル構成の効率を向上させるために、capture_queue_name
およびapply_queue_name
パラメータの両方にstreams_queue
が指定されていることに注意してください。また、capture_queue_table
およびapply_queue_table
パラメータの両方にstreams_queue_qt
が指定されています。
構成プロシージャを実行すると、進捗情報がDBA_RECOVERABLE_SCRIPT
、DBA_RECOVERABLE_SCRIPT_PARAMS
、DBA_RECOVERABLE_SCRIPT_BLOCKS
およびDBA_RECOVERABLE_SCRIPT_ERRORS
データ・ディクショナリ・ビューに記録されます。プロシージャがエラーによって停止した場合は、DBMS_STREAMS_ADM
パッケージ内のRECOVER_OPERATION
プロシージャの使用方法について、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。
プロシージャが正常に完了してから、次の手順を実行します。
dest.example.com
データベースにまだOracle Streams管理者として接続しているときに、downstream_real_time_mine
取得プロセスのパラメータをY
に設定します。
BEGIN DBMS_CAPTURE_ADM.SET_PARAMETER( capture_name => 'capture', parameter => 'downstream_real_time_mine', value => 'Y'); END; /
取得プロセスのパラメータの設定にEnterprise Managerを使用する方法については、「取得プロセスのパラメータの設定」を参照してください。
src.example.com
に接続します。
ALTER SYSTEM ARCHIVE LOG CURRENT;
ソース・データベースで現行のログ・ファイルをアーカイブすると、ソース・データベースのREDOログのリアルタイム・マイニングが開始されます。
例を完了すると、次の特性を持つ2データベース・レプリケーション環境が構成されます。
dest.example.com
データベースで、取得プロセスが有効化され、取得タイプがダウンストリームであることを確認します。確認には、「取得プロセスの情報の表示」の手順に従って、「取得」サブページで「ステータス」および「取得タイプ」フィールドを確認します。
dest.example.com
データベースで、適用プロセスが有効化されていることを確認します。確認には、「適用プロセスの情報の表示」の手順に従って、「適用」サブページで「ステータス」フィールドを確認します。
src.example.com
データベースで、hr
スキーマの任意の表に対してDML変更を行った後、変更をコミットします。
dest.example.com
データベースで変更された表を問い合せてDML変更を表示します。
参照:
MAINTAIN_SCHEMAS
プロシージャの使用方法の詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。
MAINTAIN_SCHEMAS
プロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。
この項の例では、hr
スキーマにあるすべての表に、データ操作言語(DML)変更をレプリケートするOracle Streamsハブアンドスポーク・レプリケーション環境を構成します。この例では、各データベースで取得プロセスを使用してこれらの変更を取得します。ハブアンドスポーク・レプリケーションとは、中央のハブ・データベースが1つ以上のスポーク・データベースでの変更をレプリケートすることを意味します。スポーク・データベースは、相互に直接通信しません。このサンプル構成では、ハブ・データベースが、1つのスポーク・データベースで生成された変更を他のスポーク・データベースに送信します。ハブアンドスポーク・レプリケーション環境の詳細は、「ハブアンドスポーク・レプリケーション環境の概要」を参照してください。
この例では、DBMS_STREAMS_ADM
パッケージのMAINTAIN_SCHEMAS
プロシージャを使用してハブアンドスポーク・レプリケーション環境を構成します。このプロシージャは、1つ以上のスキーマをレプリケートするOracle Streams環境を構成する最速で最も単純な方法です。また、プロシージャはOracle Streamsレプリケーション環境に対して設定されたベスト・プラクティスに従います。
この例では、ハブ・データベースのグローバル名はhub.example.com
、スポーク・データベースのグローバル名はspoke1.example.com
およびspoke2.example.com
です。ただし、使用している環境のデータベースをかわりに使用して例を完了することができます。
レプリケーション用に構成されているデータベース・オブジェクトは、MAINTAIN_SCHEMAS
プロシージャの実行時に、宛先データベースに存在する場合としない場合があります。宛先データベースにデータベース・オブジェクトが存在しない場合、MAINTAIN_SCHEMAS
プロシージャはデータ・ポンプ・エクスポート/インポートを使用して、宛先データベースでデータベース・オブジェクトをインスタンス化します。インスタンス化の際に、これらのデータベース・オブジェクトにインスタンス化SCNが設定されます。宛先データベースにデータベース・オブジェクトが存在する場合、MAINTAIN_SCHEMAS
プロシージャは既存のデータベース・オブジェクトを保持して、インスタンス化SCNを設定します。この例では、MAINTAIN_SCHEMAS
プロシージャを実行する前に、各データベースにhr
スキーマが存在しています。
図4-13に、この例で作成する環境の概要を示します。
データベース間のネットワーク接続の構成の詳細は、『Oracle Database 2日でデータベース管理者』を参照してください。
strmadmin
であると想定します。
hub.example.com
データベースからspoke1.example.com
データベースへ。データベース・リンクの名前とサービス名は、どちらもspoke1.example.com
である必要があります。
hub.example.com
データベースからspoke2.example.com
データベースへ。データベース・リンクの名前とサービス名は、どちらもspoke2.example.com
である必要があります。
spoke1.example.com
データベースからhub.example.com
データベースへ。データベース・リンクの名前とサービス名は、どちらもhub.example.com
である必要があります。
spoke2.example.com
データベースからhub.example.com
データベースへ。データベース・リンクの名前とサービス名は、どちらもhub.example.com
である必要があります。
各データベース・リンクは、Oracle Streams管理者のスキーマに作成する必要があります。また、各データベース・リンクは宛先データベースでOracle Streams管理者に接続する必要があります。方法については、「チュートリアル: データベース・リンクの作成」を参照してください。
ARCHIVELOG
モードで実行するように各ソース・データベースを構成します。取得プロセスがソース・データベースで生成された変更を取得するためには、ソース・データベースをARCHIVELOG
モードで実行する必要があります。この例では、すべてのデータベースをARCHIVELOG
モードで実行する必要があります。ARCHIVELOG
モードで実行するためのデータベースの構成の詳細は、『Oracle Database管理者ガイド』を参照してください。
spoke1.example.com
データベースに接続します。SQL*Plusの起動の詳細は、『Oracle Database 2日でデータベース管理者』を参照してください。
MAINTAIN_SCHEMAS
プロシージャで生成されるファイル(インスタンス化に使用するデータ・ポンプ・エクスポート・ダンプ・ファイルを含む)を保持するディレクトリ・オブジェクトを作成します。ディレクトリ・オブジェクトは、コンピュータ・システム上の任意のアクセス可能ディレクトリを指すことができます。たとえば、次の文は、/usr/spoke1_log_filesディレクトリを指すspoke1_dir
という名前のディレクトリ・オブジェクトを作成します。
CREATE DIRECTORY spoke1_dir AS '/usr/spoke1_log_files';
spoke2.example.com
データベースにOracle Streams管理者として接続します。SQL*Plusでのデータベースへの接続の詳細は、『Oracle Database管理者ガイド』を参照してください。
MAINTAIN_SCHEMAS
プロシージャで生成されるファイル(インスタンス化に使用するデータ・ポンプ・エクスポート・ダンプ・ファイルを含む)を保持するディレクトリ・オブジェクトを作成します。ディレクトリ・オブジェクトは、コンピュータ・システム上の任意のアクセス可能ディレクトリを指すことができます。たとえば、次の文は、/usr/spoke2_log_filesディレクトリを指すspoke2_dir
という名前のディレクトリ・オブジェクトを作成します。
CREATE DIRECTORY spoke2_dir AS '/usr/spoke2_log_files';
hub.example.com
データベースにOracle Streams管理者として接続します。
MAINTAIN_SCHEMAS
プロシージャで生成されるファイル(インスタンス化に使用するデータ・ポンプ・エクスポート・ダンプ・ファイルを含む)を保持するディレクトリ・オブジェクトを作成します。ディレクトリ・オブジェクトは、コンピュータ・システム上の任意のアクセス可能ディレクトリを指すことができます。たとえば、次の文は、/usr/hub_log_filesディレクトリを指すhub_dir
という名前のディレクトリ・オブジェクトを作成します。
CREATE DIRECTORY hub_dir AS '/usr/hub_log_files';
hub.example.com
データベースにまだStreams管理者として接続しているときに、MAINTAIN_SCHEMAS
プロシージャを実行してhub.example.com
データベースとspoke1.example.com
データベース間のレプリケーションを構成します。
BEGIN DBMS_STREAMS_ADM.MAINTAIN_SCHEMAS( schema_names => 'hr', source_directory_object => 'hub_dir', destination_directory_object => 'spoke1_dir', source_database => 'hub.example.com', destination_database => 'spoke1.example.com', capture_name => 'capture_hns', capture_queue_table => 'source_hns_qt', capture_queue_name => 'source_hns', propagation_name => 'propagation_spoke1', apply_name => 'apply_spoke1', apply_queue_table => 'destination_spoke1_qt', apply_queue_name => 'destination_spoke1', bi_directional => TRUE); END; /
MAINTAIN_SCHEMAS
プロシージャは、多くの構成タスクを実行するため時間がかかることがあります。プロシージャの実行中は、宛先データベースのレプリケートされたデータベース・オブジェクトにデータ操作言語(DML)またはデータ定義言語(DLL)変更が行われないようにしてください。
MAINTAIN_SCHEMAS
プロシージャで必要なパラメータは、schema_names
、source_directory_object
、destination_directory_object
、source_database
およびdestination_database
です。また、構成プロシージャを使用して双方向レプリケーションを構成する際は、bi_directional
パラメータをTRUE
に設定する必要があります。「Oracle Streamsレプリケーションの構成プロシージャの概要」を参照してください。
この例では、取得プロセス、取得プロセスのキュー表、取得プロセスのキュー、伝播、適用プロセス、適用プロセスのキュー表および適用プロセスのキューの名前を選択できることを示すために他のパラメータを指定しています。これらのパラメータを指定しないと、システムで生成された名前が使用されます。
構成プロシージャを実行すると、進捗情報がDBA_RECOVERABLE_SCRIPT
、DBA_RECOVERABLE_SCRIPT_PARAMS
、DBA_RECOVERABLE_SCRIPT_BLOCKS
およびDBA_RECOVERABLE_SCRIPT_ERRORS
データ・ディクショナリ・ビューに記録されます。プロシージャがエラーによって停止した場合は、DBMS_STREAMS_ADM
パッケージ内のRECOVER_OPERATION
プロシージャの使用方法について、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。
hub.example.com
データベースにまだStreams管理者として接続しているときに、MAINTAIN_SCHEMAS
プロシージャを実行してhub.example.com
データベースとspoke2.example.com
データベース間のレプリケーションを構成します。
BEGIN DBMS_STREAMS_ADM.MAINTAIN_SCHEMAS( schema_names => 'hr', source_directory_object => 'hub_dir', destination_directory_object => 'spoke2_dir', source_database => 'hub.example.com', destination_database => 'spoke2.example.com', capture_name => 'capture_hns', capture_queue_table => 'source_hns_qt', capture_queue_name => 'source_hns', propagation_name => 'propagation_spoke2', apply_name => 'apply_spoke2', apply_queue_table => 'destination_spoke2_qt', apply_queue_name => 'destination_spoke2', bi_directional => TRUE); END; /
hub.example.com
、spoke1.example.com
、spoke2.example.com
の各データベースでhr
スキーマ内のすべての表に対して最新時刻競合解消を構成します。このスキーマには、countries
、departments
、employees
、jobs
、job_history
、locations
およびregions
の各表が含まれます。方法については、「チュートリアル: 表の最新時刻競合解消の構成」を参照してください。
例を完了すると、次の特性を持つハブアンドスポーク・レプリケーション環境が構成されます。
hr
スキーマの表に対して構成されています。
capture_hns
という名前の取得プロセスがあります。取得プロセスは、データベースのhr
スキーマに対する変更を取得します。
source_hns_qt
という名前のキュー表を使用するsource_hns
という名前のキューがあります。このキューは、データベースの取得プロセスに対するものです。
hub.example.com
には、次の追加コンポーネントがあります。
apply_spoke1
という名前の適用プロセス。この適用プロセスは、spoke1.example.com
データベースから送信されたhr
スキーマに対する変更を適用します。
destination_spoke1_qt
という名前のキュー表を使用するdestination_spoke1
という名前のキュー。このキューは、データベースのapply_spoke1
適用プロセスに対するものです。
apply_spoke2
という名前の適用プロセス。この適用プロセスは、spoke2.example.com
データベースから送信されたhr
スキーマに対する変更を適用します。
destination_spoke2_qt
という名前のキュー表を使用するdestination_spoke2
という名前のキュー。このキューは、データベースのapply_spoke2
適用プロセスに対するものです。
propagation_spoke1
という名前の伝播。この伝播は、hr
スキーマに対する変更をsource_hns
キューからspoke1.example.com
データベースのdestination_spoke1
キューに送信します。
propagation_spoke2
という名前の伝播。この伝播は、hr
スキーマに対する変更をsource_hns
キューからspoke2.example.com
データベースのdestination_spoke2
キューに送信します。
spoke1.example.com
には、次の追加コンポーネントがあります。
apply_spoke1
という名前の適用プロセス。この適用プロセスは、hub.example.com
データベースから送信されたhr
スキーマに対する変更を適用します。
destination_spoke1_qt
という名前のキュー表を使用するdestination_spoke1
という名前のキュー。このキューは、データベースのapply_spoke1
適用プロセスに対するものです。
propagation_spoke1
という名前の伝播。この伝播は、hr
スキーマに対する変更をsource_hns
キューからhub.example.com
データベースのdestination_spoke1
キューに送信します。
spoke2.example.com
には、次の追加コンポーネントがあります。
apply_spoke2
という名前の適用プロセス。この適用プロセスは、hub.example.com
データベースから送信されたhr
スキーマに対する変更を適用します。
destination_spoke2_qt
という名前のキュー表を使用するdestination_spoke2
という名前のキュー。このキューは、データベースのapply_spoke2
適用プロセスに対するものです。
propagation_spoke2
という名前の伝播。この伝播は、hr
スキーマに対する変更をsource_hns
キューからhub.example.com
データベースのdestination_spoke2
キューに送信します。
レプリケーション環境で変更の循環を回避する方法の詳細は、「変更の循環を回避するためのタグの概要」および『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。
hr
スキーマの任意の表に対して行います。
参照:
MAINTAIN_SCHEMAS
プロシージャの使用方法の詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。
MAINTAIN_SCHEMAS
プロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。
この項の例では、hr
スキーマにある2つの表に、データ操作言語(DML)変更をレプリケートするOracle Streamsレプリケーション環境を構成します。この例では、各データベースで同期取得を使用して変更を取得します。この例では、Oracle Streamsレプリケーション環境で、データベースのグローバル名にsync1.example.com
およびsync2.example.com
を使用します。ただし、例を完了するために、ご使用の環境の2つのデータベースに置き換えることもできます。2データベース・レプリケーション環境の詳細は、「2データベース・レプリケーション環境の概要」を参照してください。
具体的に、この例では、sync1.example.com
およびsync2.example.com
データベースでhr.employees
およびhr.departments
表を共有するOracle Streamsの2データベース・レプリケーション環境を構成します。2つのデータベースは、すべてのDML変更をこれらの表にレプリケートします。hr
サンプル・スキーマは、Oracle Databaseに付属してデフォルトでインストールされます。
図4-14に、この例で作成する環境の概要を示します。
strmadmin
であると想定します。
hr.employees
およびhr.departments
表が2つのデータベースに存在し、これらのデータベースで一貫していることを確認します。データベース・オブジェクトが1つのデータベースにのみ存在する場合は、エクスポート/インポートを使用してこれらを他のデータベースで作成および移入できます。エクスポート/インポートの詳細は、『Oracle Databaseユーティリティ』を参照してください。
ANYDATA
キューを作成します。この例では、各データベースに次の2つのキューを作成します。
strmadmin
が所有する、capture_queue
という名前のキュー。このキューはデータベースでの同期取得によって使用されます。
strmadmin
が所有する、apply_queue
という名前のキュー。このキューはデータベースでの適用プロセスによって使用されます。
方法については、「ANYDATAキューの作成」を参照してください。
sync1.example.com
データベースからsync2.example.com
データベースに、データベース・リンクを作成します。データベース・リンクは、Oracle Streams管理者のスキーマに作成する必要があります。また、データベース・リンクはsync2.example.com
データベースでOracle Streams管理者に接続する必要があります。データベース・リンクの名前およびサービス名は、どちらもsync2.example.com
である必要があります。
sync2.example.com
データベースからsync1.example.com
データベースに、データベース・リンクを作成します。データベース・リンクは、Oracle Streams管理者のスキーマに作成する必要があります。また、データベース・リンクはsync1.example.com
データベースでOracle Streams管理者に接続する必要があります。データベース・リンクの名前およびサービス名は、どちらもsync1.example.com
である必要があります。
方法については、「チュートリアル: データベース・リンクの作成」を参照してください。
sync1.example.com
データベースで適用プロセスを構成します。この適用プロセスは、sync2.example.com
データベースで取得され、sync1.example.com
データベースに伝播された共有表への変更を適用します。
sync1.example.com
データベースにOracle Streams管理者として接続します。SQL*Plusの起動の詳細は、『Oracle Database 2日でデータベース管理者』を参照してください。
BEGIN DBMS_APPLY_ADM.CREATE_APPLY( queue_name => 'strmadmin.apply_queue', apply_name => 'apply_emp_dep', apply_captured => FALSE); END; /
適用プロセスは永続キュー内の変更を適用するため、apply_captured
パラメータがFALSE
に設定されます。これらは、同期取得によって取得された変更です。apply_captured
パラメータは、適用プロセスが取得プロセスによって取得された変更を適用する場合にのみTRUE
に設定する必要があります。
適用プロセスは起動しないでください。
BEGIN DBMS_STREAMS_ADM.ADD_TABLE_RULES( table_name => 'hr.employees', streams_type => 'apply', streams_name => 'apply_emp_dep', queue_name => 'strmadmin.apply_queue', source_database => 'sync2.example.com'); END; /
このルールは、apply_queue
キューに出現するhr.employees
表に対するすべてのDML変更を適用するよう適用プロセスapply_emp_dep
に指示します。ルールは、適用プロセスがsync2.example.com
ソース・データベースで取得された変更のみ適用することも指定します。
BEGIN DBMS_STREAMS_ADM.ADD_TABLE_RULES( table_name => 'hr.departments', streams_type => 'apply', streams_name => 'apply_emp_dep', queue_name => 'strmadmin.apply_queue', source_database => 'sync2.example.com'); END; /
このルールは、apply_queue
キューに出現するhr.departments
表に対するすべてのDML変更を適用するよう適用プロセスapply_emp_dep
に指示します。ルールは、適用プロセスがsync2.example.com
ソース・データベースで取得された変更のみ適用することも指定します。
sync2.example.com
データベースで適用プロセスを構成します。この適用プロセスは、sync1.example.com
データベースで取得され、sync2.example.com
データベースに伝播された変更を適用します。
sync2.example.com
データベースにOracle Streams管理者として接続します。SQL*Plusでのデータベースへの接続の詳細は、『Oracle Database管理者ガイド』を参照してください。
BEGIN DBMS_APPLY_ADM.CREATE_APPLY( queue_name => 'strmadmin.apply_queue', apply_name => 'apply_emp_dep', apply_captured => FALSE); END; /
適用プロセスは永続キュー内の変更を適用するため、apply_captured
パラメータがFALSE
に設定されます。これらの変更は、同期取得によって取得されました。apply_captured
パラメータは、適用プロセスが取得プロセスによって取得された変更を適用する場合にのみTRUE
に設定する必要があります。
適用プロセスは起動しないでください。
BEGIN DBMS_STREAMS_ADM.ADD_TABLE_RULES( table_name => 'hr.employees', streams_type => 'apply', streams_name => 'apply_emp_dep', queue_name => 'strmadmin.apply_queue', source_database => 'sync1.example.com'); END; /
このルールは、apply_queue
キューに出現するすべてのDML変更をhr.employees
表に適用するよう適用プロセスapply_emp_dep
に指示します。ルールは、適用プロセスがsync1.example.com
ソース・データベースで取得された変更のみ適用することも指定します。
BEGIN DBMS_STREAMS_ADM.ADD_TABLE_RULES( table_name => 'hr.departments', streams_type => 'apply', streams_name => 'apply_emp_dep', queue_name => 'strmadmin.apply_queue', source_database => 'sync1.example.com'); END; /
このルールは、apply_queue
キューに出現するすべてのDML変更をhr.departments
表に適用するよう適用プロセスapply_emp_dep
に指示します。ルールは、適用プロセスがsync1.example.com
ソース・データベースで取得された変更のみ適用することも指定します。
sync1.example.com
データベースのキューからsync2.example.com
データベースのキューに変更を送信する伝播を作成します。
sync1.example.com
データベースにOracle Streams管理者として接続します。
sync2.example.com
データベースに対する変更を送信する伝播の作成を作成します。
BEGIN DBMS_STREAMS_ADM.ADD_TABLE_PROPAGATION_RULES( table_name => 'hr.employees', streams_name => 'send_emp_dep', source_queue_name => 'strmadmin.capture_queue', destination_queue_name => 'strmadmin.apply_queue@sync2.example.com', source_database => 'sync1.example.com', queue_to_queue => TRUE); END; /
ADD_TABLE_PROPAGATION_RULES
プロシージャは、伝播およびポジティブ・ルール・セットを作成します。このプロシージャは、sync2.example.com
データベース内のapply_queue
キューのhr.employees
表にDML変更を送信するよう指示する伝播ルール・セットにルールの追加もします。
BEGIN DBMS_STREAMS_ADM.ADD_TABLE_PROPAGATION_RULES( table_name => 'hr.departments', streams_name => 'send_emp_dep', source_queue_name => 'strmadmin.capture_queue', destination_queue_name => 'strmadmin.apply_queue@sync2.example.com', source_database => 'sync1.example.com', queue_to_queue => TRUE); END; /
ADD_TABLE_PROPAGATION_RULES
プロシージャは、sync2.example.com
データベース内のapply_queue
キューのhr.departments
表にDML変更を送信するよう指示する伝播ルール・セットにルールを追加します。
sync2.example.com
データベースのキューからsync1.example.com
データベースのキューに変更を送信する伝播を作成します。
sync2.example.com
データベースにOracle Streams管理者として接続します。
sync1.example.com
データベースに対する変更を送信する伝播の作成を作成します。
BEGIN DBMS_STREAMS_ADM.ADD_TABLE_PROPAGATION_RULES( table_name => 'hr.employees', streams_name => 'send_emp_dep', source_queue_name => 'strmadmin.capture_queue', destination_queue_name => 'strmadmin.apply_queue@sync1.example.com', source_database => 'sync2.example.com', queue_to_queue => TRUE); END; /
ADD_TABLE_PROPAGATION_RULES
プロシージャは、伝播およびポジティブ・ルール・セットを作成します。このプロシージャでは、sync1.example.com
データベース内のapply_queue
キューのhr.employees
表にDML変更を送信するよう指示する伝播ルール・セットにルールを追加します。
BEGIN DBMS_STREAMS_ADM.ADD_TABLE_PROPAGATION_RULES( table_name => 'hr.departments', streams_name => 'send_emp_dep', source_queue_name => 'strmadmin.capture_queue', destination_queue_name => 'strmadmin.apply_queue@sync1.example.com', source_database => 'sync2.example.com', queue_to_queue => TRUE); END; /
ADD_TABLE_PROPAGATION_RULES
プロシージャは、sync1.example.com
データベース内のapply_queue
キューのhr.departments
表にDML変更を送信するよう指示する伝播ルール・セットにルールを追加します。
sync1.example.com
データベースで同期取得を構成します。
sync1.example.com
データベースにOracle Streams管理者として接続します。
ADD_TABLE_RULES
プロシージャを実行して、同期取得を作成し、hr.employees
表に対する変更を取得するよう指示するルールを追加します。
BEGIN DBMS_STREAMS_ADM.ADD_TABLE_RULES( table_name => 'hr.employees', streams_type => 'sync_capture', streams_name => 'sync_capture', queue_name => 'strmadmin.capture_queue'); END; /
BEGIN DBMS_STREAMS_ADM.ADD_TABLE_RULES( table_name => 'hr.departments', streams_type => 'sync_capture', streams_name => 'sync_capture', queue_name => 'strmadmin.capture_queue'); END; /
これらのプロシージャを実行して次のアクションを実行します。
sync_capture
という名前の同期取得を作成します。同じ名前の同期取得は存在できません。
strmadmin
が所有するcapture_queue
という名前の既存のキューで同期取得を関連付けます。
sync_capture
のポジティブ・ルール・セットを作成します。ルール・セットにはシステムで作成された名前があります。
hr.employees
表に対するDML変更を取得するルールを作成し、同期取得のポジティブ・ルール・セットにルールを追加します。ルールにはシステムで生成された名前があります。
DBMS_CAPTURE_ADM.PREPARE_SYNC_INSTANTIATION
ファンクションを自動的に実行することで、インスタンス化用にhr.employees
表を準備します。
hr.departments
表に対するDML変更を取得するルールを取得するルールを作成し、同期取得のポジティブ・ルール・セットにルールを追加します。ルールにはシステムで生成された名前があります。
DBMS_CAPTURE_ADM.PREPARE_SYNC_INSTANTIATION
ファンクションを自動的に実行することで、インスタンス化用にhr.departments
表を準備します。
sync2.example.com
データベースで同期取得を構成します。
sync2.example.com
データベースにOracle Streams管理者として接続します。
ADD_TABLE_RULES
プロシージャを実行して、同期取得を作成し、hr.employees
表に対する変更を取得するよう指示するルールを追加します。
BEGIN DBMS_STREAMS_ADM.ADD_TABLE_RULES( table_name => 'hr.employees', streams_type => 'sync_capture', streams_name => 'sync_capture', queue_name => 'strmadmin.capture_queue'); END; /
BEGIN DBMS_STREAMS_ADM.ADD_TABLE_RULES( table_name => 'hr.departments', streams_type => 'sync_capture', streams_name => 'sync_capture', queue_name => 'strmadmin.capture_queue'); END; /
手順8では、これらのプロシージャによって現在のデータベースで実行されるアクションについて説明します。
sync2.example.com
データベースで表のインスタンス化SCNを設定します。
sync1.example.com
データベースにOracle Streams管理者として接続します。
sync2.example.com
データベースでhr.employees
表のインスタンス化SCNを設定します。
DECLARE iscn NUMBER; -- Variable to hold instantiation SCN value BEGIN iscn := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER(); DBMS_APPLY_ADM.SET_TABLE_INSTANTIATION_SCN@sync2.example.com( source_object_name => 'hr.employees', source_database_name => 'sync1.example.com', instantiation_scn => iscn); END; /
sync2.example.com
データベースでhr.departments
表のインスタンス化SCNを設定します。
DECLARE iscn NUMBER; -- Variable to hold instantiation SCN value BEGIN iscn := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER(); DBMS_APPLY_ADM.SET_TABLE_INSTANTIATION_SCN@sync2.example.com( source_object_name => 'hr.departments', source_database_name => 'sync1.example.com', instantiation_scn => iscn); END; /
インスタンス化SCNは、適用プロセスが表に変更を適用できる最小のSCNです。適用プロセスがsync2.example.com
データベースの共有表への変更を適用する前に、インスタンス化SCNを各表に対して設定する必要があります。
sync1.example.com
データベースで表のインスタンス化SCNを設定します。
sync2.example.com
データベースにOracle Streams管理者として接続します。
sync1.example.com
データベースでhr.employees
表のインスタンス化SCNを設定します。
DECLARE iscn NUMBER; -- Variable to hold instantiation SCN value BEGIN iscn := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER(); DBMS_APPLY_ADM.SET_TABLE_INSTANTIATION_SCN@sync1.example.com( source_object_name => 'hr.employees', source_database_name => 'sync2.example.com', instantiation_scn => iscn); END; /
sync2.example.com
データベースでhr.departments
表のインスタンス化SCNを設定します。
DECLARE iscn NUMBER; -- Variable to hold instantiation SCN value BEGIN iscn := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER(); DBMS_APPLY_ADM.SET_TABLE_INSTANTIATION_SCN@sync1.example.com( source_object_name => 'hr.departments', source_database_name => 'sync2.example.com', instantiation_scn => iscn); END; /
sync1.example.com
データベースにOracle Streams管理者として接続します。
BEGIN DBMS_APPLY_ADM.START_APPLY( apply_name => 'apply_emp_dep'); END; /
sync2.example.com
データベースにOracle Streams管理者として接続します。
BEGIN DBMS_APPLY_ADM.START_APPLY( apply_name => 'apply_emp_dep'); END; /
適用プロセスの開始にEnterprise Managerを使用する方法については、「適用プロセスの起動と停止」を参照してください。
sync1.example.com
およびsync2.example.com
の各データベースのhr.departments
およびhr.employees
の各表に対して、最新時刻競合解消を構成します。方法については、「チュートリアル: 表の最新時刻競合解消の構成」を参照してください。
次のような特性を持つ2データベース・レプリケーション環境が構成されます。
sync_capture
という名前の同期取得があります。この同期取得は、hr.employees
表およびhr.departments
表に対するすべてのDML変更を取得します。
capture_queue
という名前のキューがあります。このキューは、データベースでの同期取得用です。
apply_emp_dep
という名前の適用プロセスがあります。この適用プロセスは、hr.employees
表およびhr.departments
表に対するすべてのDML変更を適用します。
apply_queue
という名前のキューがあります。このキューは、データベースでの適用プロセス用です。
send_emp_dep
という名前の伝播があります。この伝播は、ローカル・データベース内のcapture_queue
から、他のデータベース内のapply_queue
に変更を送信します。この伝播では、hr.employees
表およびhr.departments
表に対するすべてのDML変更が送信されます。
'00'
(ゼロが2つ)と等価の16進数になります。
NULL
タグを含むセッションの変更のみを取得します。したがって、同期取得は、ローカル適用プロセスによって適用される変更は取得しません。同期取得のルールは、これらの変更を取得しないよう同期取得に指示します。
レプリケーション環境で変更の循環を回避する方法の詳細は、「変更の循環を回避するためのタグの概要」を参照してください。
hr.employees
表またはhr.departments
表に対してDML変更を行います。
hr.employees
表またはhr.departments
表を問い合せて変更を表示します。レプリケーション環境では、競合解消によって競合が自動的に解消されます。競合解消の詳細は、「競合と競合解消の概要」を参照してください。
更新競合を解消する最も一般的な方法は、最新のタイムスタンプを持つ変更を保持し、古い変更を破棄することです。この方法では、適用中に競合が検出された場合、適用プロセスは、変更のタイムスタンプ列が表の対応する行よりも新しい場合に変更を適用します。表のタイムスタンプ列が最新の場合、適用プロセスは変更を破棄します。
この項の例では、次のアクションを完了することにより、hr.departments
表の最新時刻競合解消を構成します。
TIMESTAMP
WITH
TIME
ZONE
データ型のtime
列を表に追加する
DBMS_APPLY_ADM
パッケージのSET_UPDATE_CONFLICT_HANDLER
プロシージャを実行して、表の競合解消を構成する
この項の手順を使用して、任意の表の競合解消を構成できます。これを構成するには、hr
をスキーマ名で置換し、departments
を表名で置換します。また、SET_UPDATE_CONFLICT_HANDLER
プロシージャを実行するときに、hr.departments
表の列を、使用する表の列で置換します。
time
列を追加します。
SYSTEM
などの管理ユーザーとしてデータベースに接続します。別の方法として、時間列が追加される表を所有しているユーザーとして接続することもできます。SQL*Plusの起動の詳細は、『Oracle Database 2日でデータベース管理者』を参照してください。
ALTER
TABLE
を使用して、表にtime
列を追加します。この例では、次の文を実行してtime
列をhr.departments
表に追加します。
ALTER TABLE hr.departments ADD (time TIMESTAMP WITH TIME ZONE);
time
列を更新します。SYSTEM
またはOracle Streams管理者などの管理者ユーザーとしてデータベースにログインします。
「トリガーの作成」ページが表示され、「一般」サブページが表示されます。
insert_departments_time
を入力します。
hr
と入力します。
BEGIN -- Consider time synchronization problems. The previous update to this -- row might have originated from a site with a clock time ahead of -- the local clock time. IF :OLD.TIME IS NULL OR :OLD.TIME < SYSTIMESTAMP THEN :NEW.TIME := SYSTIMESTAMP; ELSE :NEW.TIME := :OLD.TIME + 1 / 86400; END IF; END;
schema.table
の形式で表名を入力するか、懐中電灯アイコンを使用してデータベース・オブジェクトを検索します。この例では、hr.departments
を入力します。
表内の列が表示されます。
time
列を除く表のすべての列を選択します。
SQL*Plusの起動の詳細は、『Oracle Database 2日でデータベース管理者』を参照してください。
ALTER TABLE hr.departments ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
サプリメンタル・ロギングは、適用中の競合解消に必要です。
SET_UPDATE_CONFLICT_HANDLER
プロシージャを実行して、表の最新時刻競合解消を構成します。たとえば、次のプロシージャを実行して、hr.departments
表の最新時刻競合解消を構成します。
DECLARE cols DBMS_UTILITY.NAME_ARRAY; BEGIN cols(1) := 'department_id'; cols(2) := 'department_name'; cols(3) := 'manager_id'; cols(4) := 'location_id'; cols(5) := 'time'; DBMS_APPLY_ADM.SET_UPDATE_CONFLICT_HANDLER( object_name => 'hr.departments', method_name => 'MAXIMUM', resolution_column => 'time', column_list => cols); END; /
cols
列リストの表内のすべての列を含みます。
レプリケーション環境を構成または拡張する例を実行している場合は、適切な表に対して最新時刻競合解消を構成します。
db1.example.com
およびdb2.example.com
データベースでhr
スキーマのすべての表に対して競合解消を構成します。このスキーマには、countries
、departments
、employees
、jobs
、 job_history
、locations
およびregions
表が含まれます。
hub1.example.com
、spoke1.example.com
、spoke2.example.com
の各データベースでhr
スキーマ内のすべての表に対して競合解消を構成します。このスキーマには、countries
、departments
、employees
、jobs
、job_history
、locations
およびregions
表が含まれます。
sync1.example.com
およびsync2.example.com
データベースでhr.departments
およびhr.employees
表に対して競合解消を構成します。
hub.example.com
、spoke1.example.com
およびspoke2.example.com
データベースでoe.orders
およびoe.order_items
表に対して競合解消を構成します。
spoke3.example.com
データベースでhr
スキーマのすべての表に対して競合解消を構成します。このスキーマには、countries
、departments
、employees
、jobs
、 job_history
、locations
およびregions
表が含まれます。
例からこの項に移動した場合は、ここでその例に戻ります。
|
![]() Copyright © 2007, 2008 Oracle Corporation. All Rights Reserved. |
|