レプリケーション環境では、Oracle Streams適用プロセスが特定のキューから論理変更レコード(LCR)をデキューして、それぞれを直接適用するか、適用ハンドラと呼ばれるユーザー定義プロシージャにパラメータとして渡します。
次のトピックでは、暗黙的適用の構成について説明します。
この章で説明する各タスクは、特に指定がないかぎり、適切な権限を付与されたOracle Streams管理者が実行する必要があります。
次の任意のプロシージャを使用して、適用プロセスを構成できます。
DBMS_STREAMS_ADM.ADD_TABLE_RULES
DBMS_STREAMS_ADM.ADD_SUBSET_RULES
DBMS_STREAMS_ADM.ADD_SCHEMA_RULES
DBMS_STREAMS_ADM.ADD_GLOBAL_RULES
DBMS_STREAMS_ADM.ADD_MESSAGE_RULE
DBMS_APPLY_ADM.CREATE_APPLY
DBMS_STREAMS_ADMパッケージの各プロシージャでは、名前を指定して適用プロセスを作成したり(存在しない場合)、適用プロセスにポジティブ・ルール・セットまたはネガティブ・ルール・セットを作成します(適用プロセスにこれらのルール・セットがない場合)。また、ルール・セットに表ルール、スキーマ・ルール、グローバル・ルールまたはメッセージ・ルールを追加することもできます。
DBMS_APPLY_ADMパッケージのCREATE_APPLYプロシージャでは、適用プロセスは作成しますが、その適用プロセスのルール・セットやルールは作成しません。ただし、CREATE_APPLYプロシージャを使用すると、適用プロセスにポジティブ・ルール・セットまたはネガティブ・ルール・セットとして関連付ける既存のルール・セットを指定したり、適用ハンドラ、適用ユーザー、適用タグなどの他の多数のオプションを指定でき、さらに、バッファ・キューまたは永続キューのいずれからメッセージをデキューするかを指定することもできます。
1つの適用プロセスでは、バッファ・キューまたは永続キューのいずれかからメッセージをデキューする必要があります。取得プロセスによって取得された論理変更レコードは取得LCRと呼ばれ、通常、バッファ・キューに格納されています。したがって、取得プロセスによって取得されたLCRを1つの適用プロセスで適用する場合は、永続LCRまたは永続ユーザー・メッセージは適用できません。
また、同期取得によって取得されたLCRは永続LCRであり、通常、永続キューに格納されています。したがって、同期取得によって取得されたLCRを1つの適用プロセスで適用する場合は、取得プロセスによって取得されたLCRは適用できません。ただし、永続LCRおよび永続ユーザー・メッセージについては、両方のタイプのメッセージが永続キューにステージングされるため、1つの適用プロセスで両方を適用できます。
この章の例では、取得LCR、永続LCRおよび永続ユーザー・メッセージを適用する適用プロセスを作成します。適用プロセスに関連付けるANYDATAキューが存在しない場合は、先にそのキューを作成してから、適用プロセスを作成します。
|
注意:
|
適用プロセスを作成する前に、次のタスクを完了する必要があります。
「Oracle Streamsレプリケーションを構成する前に実行するタスク」で説明されている次のタスクを完了します。
適用プロセスに関連付けるANYDATAキューを作成します(存在しない場合)。手順については、「ANYDATAキューの作成」を参照してください。この章の例では、適用プロセスで使用されるキューはstrmadmin.streams_queueであると想定しています。適用プロセスを実行するデータベースと同じデータベースでキューを作成します。
次の例では、DBMS_STREAMS_ADMパッケージのADD_SCHEMA_RULESプロシージャを実行して、取得論理変更レコード(LCR)を適用する適用プロセスを作成します。この適用プロセスでは、取得プロセスで取得されたLCRを適用できます。
手順は次のとおりです。
「適用プロセスの作成の準備」で説明されているタスクを完了します。
SQL*Plusで、適用プロセスを実行するデータベースにOracle Streams管理者として接続します。
SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。
次のように、適用プロセスを作成します。
BEGIN
DBMS_STREAMS_ADM.ADD_SCHEMA_RULES(
schema_name => 'hr',
streams_type => 'apply',
streams_name => 'strm01_apply',
queue_name => 'strmadmin.streams_queue',
include_dml => TRUE,
include_ddl => FALSE,
include_tagged_lcr => FALSE,
source_database => 'dbs1.example.com',
inclusion_rule => TRUE);
END;
/
このプロシージャを実行すると、次のアクションが実行されます。
取得LCRをローカル・データベースに適用する適用プロセスstrm01_applyが作成されます。この適用プロセスが作成されるのは、それが存在しない場合のみです。
適用プロセスが、既存のキューstrmadmin.streams_queueに関連付けられます。このキューは必ず存在している必要があります。
inclusion_ruleパラメータがTRUEに設定されているため、適用プロセスにポジティブ・ルール・セットがない場合は、ポジティブ・ルール・セットが作成され、適用プロセスに関連付けられます。このルール・セットでは、SYS.STREAMS$_EVALUATION_CONTEXT評価コンテキストが使用されます。ルール・セット名は、システムによって生成されます。
hrスキーマ内のデータベース・オブジェクトに対するデータ操作言語(DML)変更の結果を含む行LCRに対して、TRUEと評価されるルールが1つ作成されます。ルール名は、システムによって生成されます。
inclusion_ruleパラメータがTRUEに設定されているため、このルールが、適用プロセスに関連付けられたポジティブ・ルール・セットに追加されます。
適用プロセスのapply_tagが、'00'(2つのゼロ)と等価の16進値に設定されます。この値がデフォルトの適用タグ値です。適用プロセスで生成されるREDOエントリのタグは、この値になります。
include_tagged_lcrパラメータがFALSEに設定されているため、NULLタグがある場合にのみ適用プロセスで行LCRを適用するように設定されます。この動作は、適用プロセスのシステム作成ルールを介して実行されます。
適用プロセスでdbs1.example.comソース・データベースからのLCRを適用するように指定されます。適用プロセスでデキューされるLCRは、適用プロセスのルール・セット内のルールによって決定されます。適用プロセスでdbs1.example.com以外のソース・データベースからのLCRがデキューされた場合、エラーが発生します。
この項では、DBMS_APPLY_ADMパッケージを使用して適用プロセスを作成する次の例を取り上げます。
|
関連項目:
|
次の例では、DBMS_APPLY_ADMパッケージのCREATE_APPLYプロシージャを実行して、取得論理変更レコード(LCR)を適用する適用プロセスを作成します。この適用プロセスでは、取得プロセスで取得されたLCRを適用できます。
手順は次のとおりです。
「適用プロセスの作成の準備」で説明されているタスクを完了します。
SQL*Plusで、適用プロセスを実行するデータベースにOracle Streams管理者として接続します。
Oracle Streams管理者にDBAロールが付与されていることを確認します。この例では、適用ユーザーをOracle Streams管理者以外のユーザーに設定するため、DBAロールが必要です。
SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。
適用プロセスで使用されるルール・セットを作成します(存在しない場合)。この例では、ルール・セットがstrmadmin.strm02_rule_setであると想定します。オプションで、ルール・セットにルールを追加することもできます。手順については、『Oracle Streams概要および管理』を参照してください。
適用プロセスで使用される適用ハンドラを作成します(存在しない場合)。この例では、DDLハンドラがstrmadmin.history_ddlプロシージャであると想定します。『Oracle Streams概要および管理』の例でこのプロシージャを作成しています。
次のように、適用プロセスを作成します。
BEGIN
DBMS_APPLY_ADM.CREATE_APPLY(
queue_name => 'strmadmin.streams_queue',
apply_name => 'strm02_apply',
rule_set_name => 'strmadmin.strm02_rule_set',
message_handler => NULL,
ddl_handler => 'strmadmin.history_ddl',
apply_user => 'hr',
apply_database_link => NULL,
apply_tag => HEXTORAW('5'),
apply_captured => TRUE,
precommit_handler => NULL,
negative_rule_set_name => NULL,
source_database => 'dbs1.example.com');
END;
/
このプロシージャを実行すると、次のアクションが実行されます。
適用プロセスstrm02_applyが作成されます。同じ名前の適用プロセスは存在できません。
適用プロセスが、キューstrmadmin.streams_queueに関連付けられます。このキューは必ず存在している必要があります。
適用プロセスが、ルール・セットstrmadmin.strm02_rule_setに関連付けられます。このルール・セットは必ず存在している必要があります。このルール・セットは、適用プロセスのポジティブ・ルール・セットです。
メッセージ・ハンドラが適用プロセスで使用されないように指定されます。
DDLハンドラがstrmadminスキーマ内のhistory_ddl PL/SQLプロシージャとなるように指定されます。このプロシージャが存在し、CREATE_APPLYプロシージャを実行するユーザーにhistory_ddl PL/SQLプロシージャに対するEXECUTE権限が付与されている必要があります。
変更を適用するユーザーがhrであり、CREATE_APPLYプロシージャを実行するユーザー(Oracle Streams管理者)とならないように指定されます。
apply_database_linkパラメータがNULLに設定されているため、適用プロセスによってローカル・データベースに変更が適用されるように指定されます。
適用プロセスによって生成される各REDOエントリのタグが'5'と等価の16進値になるように指定されます。タグの詳細は、第10章「Oracle Streamsタグ」を参照してください。
適用プロセスで永続LCRや永続ユーザー・メッセージではなく取得LCRを適用するように指定されます。したがって、取得プロセスではなく同期取得やユーザー・アプリケーションによってLCRが構成され、そのLCRが適用プロセスのキューにステージングされている場合、この適用プロセスではLCRはデキューされません。
プリコミット・ハンドラが適用プロセスで使用されないように指定されます。
ネガティブ・ルール・セットが適用プロセスで使用されないように指定されます。
適用プロセスでdbs1.example.comソース・データベースからのLCRを適用するように指定されます。適用プロセスでデキューされるLCRは、適用プロセスのルール・セット内のルールによって決定されます。適用プロセスでdbs1.example.com以外のソース・データベースからのLCRがデキューされた場合、エラーが発生します。
適用プロセスを作成した後、ADD_TABLE_RULESまたはADD_SUBSET_RULESプロシージャを実行して、適用プロセスのルール・セットにルールを追加します。これらのルールによって、適用プロセスは、指定された表のLCRを適用するように指示されます。
|
関連項目: ルールの詳細は、『Oracle Streams概要および管理』を参照してください。 |
次の例では、DBMS_APPLY_ADMパッケージのCREATE_APPLYプロシージャを実行して、永続論理変更レコード(LCR)を適用する適用プロセスを作成します。この適用プロセスでは、同期取得によって取得されたLCRやアプリケーションによって構成されたLCRを適用できます。
手順は次のとおりです。
「適用プロセスの作成の準備」で説明されているタスクを完了します。
SQL*Plusで、適用プロセスを実行するデータベースにOracle Streams管理者として接続します。
SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。
適用プロセスで使用されるルール・セットを作成します(存在しない場合)。この例では、ルール・セットがstrmadmin.strm03_rule_setであると想定します。オプションで、ルール・セットにルールを追加することもできます。手順については、『Oracle Streams概要および管理』を参照してください。
適用プロセスで使用される適用ハンドラを作成します(存在しない場合)。この例で作成される適用プロセスでは、適用ハンドラは使用されません。
次のように、適用プロセスを作成します。
BEGIN
DBMS_APPLY_ADM.CREATE_APPLY(
queue_name => 'strmadmin.streams_queue',
apply_name => 'strm03_apply',
rule_set_name => 'strmadmin.strm03_rule_set',
message_handler => NULL,
ddl_handler => NULL,
apply_user => NULL,
apply_database_link => NULL,
apply_tag => NULL,
apply_captured => FALSE,
precommit_handler => NULL,
negative_rule_set_name => NULL);
END;
/
このプロシージャを実行すると、次のアクションが実行されます。
適用プロセスstrm03_applyが作成されます。同じ名前の適用プロセスは存在できません。
適用プロセスが、キューstrmadmin.streams_queueに関連付けられます。このキューは必ず存在している必要があります。
適用プロセスが、ルール・セットstrmadmin.strm03_rule_setに関連付けられます。このルール・セットは必ず存在している必要があります。このルール・セットは、適用プロセスのポジティブ・ルール・セットです。
メッセージ・ハンドラが適用プロセスで使用されないように指定されます。
DDLハンドラが適用プロセスで使用されないように指定されます。
apply_userパラメータがNULLであるため、変更を適用するユーザーがCREATE_APPLYプロシージャを実行するユーザーになるように指定されます。
apply_database_linkパラメータがNULLに設定されているため、適用プロセスによってローカル・データベースに変更が適用されるように指定されます。
適用プロセスで生成される各REDOエントリのタグがNULLになるように指定されます。タグの詳細は、第10章「Oracle Streamsタグ」を参照してください。
取得LCRが適用プロセスで適用されないように指定されます。したがって、適用プロセスで、適用プロセス・キューの永続キュー部分に含まれている永続LCRまたは永続ユーザー・メッセージを適用できます。
プリコミット・ハンドラが適用プロセスで使用されないように指定されます。
ネガティブ・ルール・セットが適用プロセスで使用されないように指定されます。
適用プロセスを作成した後、ADD_TABLE_RULESまたはADD_SUBSET_RULESプロシージャを実行して、適用プロセスのルール・セットにルールを追加します。これらのルールによって、適用プロセスは、指定された表のLCRを適用するように指示されます。
|
関連項目: ルールの詳細は、『Oracle Streams概要および管理』を参照してください。 |