34 ルールおよびルールベースの変換のトラブルシューティング
取得プロセス、同期取得、伝播、適用プロセスまたはメッセージ・クライアントが予期したとおりに動作しない場合、Oracle Streamsクライアントのルール・セット、ルールまたはルールベース変換が適切に構成されていないことが原因である可能性があります。次の項を参照して、ルール・セット、ルールおよびルールベース変換の問題を特定して解決します。
次の各項では、Oracle Streams環境でのルールおよびルールベース変換の一般的な問題の特定と解決について説明します。
34.1 Oracle Streamsクライアントのルールが適切に構成されているか
取得プロセス、同期取得、伝播、適用プロセスまたはメッセージ・クライアントが想定したとおりに動作しない場合は、Oracle Streamsクライアントの1つ以上のルール・セットのルールが適切に構成されていないことが問題である可能性があります。たとえば、取得プロセスが特定の表に対する変更を取得することを予期していたが、取得しないという場合は、取得プロセスで使用されるルール・セット内のルールが、表の変更を取得するように取得プロセスに指示していないことが原因である可能性があります。
DBA_STREAMS_RULES
データ・ディクショナリ・ビューを問い合せると、特定のOracle Streamsクライアントのルールをチェックできます。Oracle Streams環境でポジティブ・ルール・セットとネガティブ・ルール・セットの両方を使用する場合は、このビューで返されるルールが特定のOracle Streamsクライアントのポジティブ・ルール・セットかネガティブ・ルール・セットかを把握することが重要です。
Oracle Streamsクライアントは、ルール・セットを満たすメッセージに対して取得、伝播、適用、デキューなどのアクションを実行します。通常、メッセージがOracle Streamsクライアントのルールを満たすのは、メッセージについてネガティブ・ルール・セットのどのルールもTRUE
と評価されず、ポジティブ・ルール・セットの1つ以上のルールがTRUE
と評価された場合です。
「ルール・セットおよびメッセージのルール評価」では、メッセージがどのようにOracle Streamsクライアントのルール・セットを満たすかに関する詳細情報を示します。これには、1つ以上のルール・セットが指定されていない場合のOracle Streamsクライアントの動作に関する情報が含まれます。
関連項目:
この項では、次の内容について説明します。
34.1.1 スキーマ・ルールおよびグローバル・ルールのチェック
Oracle Streamsクライアントのポジティブ・ルール・セット内のスキーマ・ルールおよびグローバル・ルールでは、それぞれ特定のスキーマまたはデータベースに関連するすべてのメッセージに対してタスクを実行するようOracle Streamsクライアントに指示します。Oracle Streamsクライアントのネガティブ・ルール・セット内のスキーマ・ルールおよびグローバル・ルールでは、それぞれ特定のスキーマまたはデータベースに関連するすべてのメッセージを廃棄するようOracle Streamsクライアントに指示します。Oracle Streamsクライアントが予期したとおりに動作しない場合、Oracle Streamsに対してスキーマ・ルールまたはグローバル・ルールが正しく構成されていないことが原因の可能性があります。
たとえば、データベースでstrm01_apply
という適用プロセスが実行されていて、hr
スキーマの変更を含むLCRをこの適用プロセスで適用するとします。適用プロセスでネガティブ・ルール・セットが使用される場合は、このスキーマについてTRUE
と評価されるスキーマ・ルールがそのネガティブ・ルール・セットに存在しないことを確認します。そのようなルールがあると、スキーマの変更を含むLCRが適用プロセスによって廃棄されます。「Oracle Streamsクライアント用のネガティブ・ルール・セット内のルールの表示」に、このようなルールを表示する問合せの例を示しています。
問合せによってこのようなルールが返される場合、返されたルールが原因で、スキーマの変更が適用プロセスによって廃棄されている可能性があります。この問合せによって行が返されない場合は、このスキーマについてTRUE
と評価されるスキーマ・ルールが適用プロセスのポジティブ・ルール・セット内に存在することを確認してください。「Oracle Streamsクライアント用のネガティブ・ルール・セット内のルールの表示」に、このようなルールが表示される問合せの例を示しています。
34.1.2 表ルールのチェック
Oracle Streamsクライアントのポジティブ・ルール・セット内の表ルールでは、1つ以上の特定の表に関連するメッセージに対してタスクを実行するようOracle Streamsクライアントに指示します。Oracle Streamsクライアントのネガティブ・ルール・セット内の表ルールでは、1つ以上の特定の表に関連するメッセージを廃棄するようOracle Streamsクライアントに指示します。
Oracle Streamsクライアントが特定の表に対して予期したとおりに動作しない場合は、次のいずれかが原因の可能性があります。
-
その表が特定のデータベースに含まれるために、Oracle Streamsクライアントのルール・セット内の1つ以上のグローバル・ルールで、その表に関連するメッセージに対して特定の方法で動作するようOracle Streamsクライアントに指示している場合。つまり、Oracle Streamsクライアントのネガティブ・ルール・セット内のグローバル・ルールで、その表を含むソース・データベースからのすべてのメッセージを廃棄するようOracle Streamsクライアントに指示しているか、Oracle Streamsクライアントのポジティブ・ルール・セット内のグローバル・ルールで、その表を含むソース・データベースからのすべてのメッセージに対してタスクを実行するようOracle Streamsクライアントに指示している可能性があります。
-
その表が特定のスキーマに含まれるために、Oracle Streamsクライアントのルール・セット内の1つ以上のスキーマ・ルールで、その表に関連するメッセージに対して特定の方法で動作するようOracle Streamsクライアントに指示している場合。つまり、Oracle Streamsクライアントのネガティブ・ルール・セット内のスキーマ・ルールで、スキーマ内のデータベース・オブジェクトに関連するすべてのメッセージを廃棄するようOracle Streamsクライアントに指示しているか、Oracle Streamsクライアントのポジティブ・ルール・セット内のスキーマ・ルールで、スキーマ内のデータベース・オブジェクトに関連するすべてのメッセージに対してタスクを実行するようOracle Streamsクライアントに指示している可能性があります。
-
Oracle Streamsクライアントのルール・セット内の1つ以上の表ルールで、その表に関連するメッセージに対して特定の方法で動作するようOracle Streamsクライアントに指示している場合。
関連項目:
予期しない動作の原因がグローバル・ルールまたはスキーマ・ルールではないと思われる場合は、Oracle Streamsクライアントのルール・セット内の表ルールをチェックします。たとえば、取得プロセスが特定の表の変更を取得することを想定しているが、取得されない場合、取得プロセスのポジティブ・ルール・セットとネガティブ・ルール・セット内のルールで、その表の変更を取得するように指示していないことが原因であることがあります。
データベースでstrm01_capture
という取得プロセスが実行され、この取得プロセスでhr.departments
表に対する変更を取得するとします。取得プロセスでネガティブ・ルール・セットが使用される場合、この表に対してTRUE
と評価される表ルールがこのネガティブ・ルール・セットに存在しないことを確認します。そのようなルールがあると、この表に対する変更が取得プロセスによって廃棄されます。「Oracle Streamsクライアント用のネガティブ・ルール・セット内のルールの表示」に、ネガティブ・ルール・セット内のルールを表示する問合せの例を示しています。
問合せによってこのようなルールが返される場合、返されたルールが原因で、表の変更が取得プロセスによって廃棄されている可能性があります。この問合せによってルールが返されない場合は、この表についてTRUE
と評価される表ルールが取得プロセスのポジティブ・ルール・セットに1つ以上含まれていることを確認します。「Oracle Streamsクライアント用のポジティブ・ルール・セット内のルールの表示」に、ポジティブ・ルール・セット内のルールを表示する問合せの例を示しています。
ルール条件に特定のパターンが含まれるルールを特定することもできます。「条件に指定パターンが含まれる各ルールのリスト表示」を参照してください。たとえば、ルール条件にdepartmentsという文字列のあるすべてのルールを検索し、これらのルールが正しいルール・セットに含まれることを確認できます。
関連項目:
表ルールの指定の詳細は、「表ルールの例」を参照
34.1.3 サブセット・ルールのチェック
サブセット・ルールは、取得プロセス、同期取得、伝播、適用プロセスまたはメッセージ・クライアントで使用されるルール・セットに含めることができます。サブセット・ルールは、表内の特定の行サブセットに対する変更がDML操作に含まれる場合にのみTRUE
と評価されます。たとえば、hr.departments
表に対する変更があるときに、strm01_apply
という適用プロセスについてTRUE
と評価される表ルールをチェックするには、次の問合せを実行します。
COLUMN RULE_NAME HEADING 'Rule Name' FORMAT A20 COLUMN RULE_TYPE HEADING 'Rule Type' FORMAT A20 COLUMN DML_CONDITION HEADING 'Subset Condition' FORMAT A30 SELECT RULE_NAME, RULE_TYPE, DML_CONDITION FROM DBA_STREAMS_RULES WHERE STREAMS_NAME = 'STRM01_APPLY' AND STREAMS_TYPE = 'APPLY' AND SCHEMA_NAME = 'HR' AND OBJECT_NAME = 'DEPARTMENTS';
Rule Name Rule Type Subset Condition -------------------- -------------------- ------------------------------ DEPARTMENTS5 DML location_id=1700 DEPARTMENTS6 DML location_id=1700 DEPARTMENTS7 DML location_id=1700
この問合せでは、出力結果にSubset Conditionというラベルが付くDML_CONDITION
列に表のサブセット条件が返されることに注意してください。この例では、hr.departments
表に対してサブセット・ルールが指定されています。これらのサブセット・ルールは、location_id
が1700
である行が関与する変更がLCRに含まれている場合にのみTRUE
と評価されます。したがって、適用プロセスで表のすべての変更が適用されることを想定している場合でも、これらのサブセット・ルールにより、location_id
が1700
ではない行が関係する変更は廃棄されます。
注意:
サブセット・ルールは、ポジティブ・ルール・セット内にのみ存在する必要があります。
関連項目:
-
サブセット・ルールの指定の詳細は、「表ルールの例」を参照
34.1.4 メッセージ・ルールのチェック
メッセージ・ルールは、伝播、適用プロセスまたはメッセージ・クライアントで使用されるルール・セットに含めることができます。メッセージ・ルールは、取得LCRではなく、指定したメッセージ・タイプのユーザー・メッセージのみに関連します。メッセージ・ルールがTRUE
と評価されるのは、キュー内のユーザー・メッセージがメッセージ・ルールで指定されたメッセージ・タイプであり、メッセージ・ルールのルール条件を満たしている場合のみです。
伝播、適用プロセスまたはメッセージ・クライアントで特定のユーザー・メッセージに対してタスクが実行されることを想定していたが、Oracle Streamsクライアントではそれらのメッセージに対するタスクが実行されない場合は、Oracle Streamsクライアントのポジティブ・ルール・セットおよびネガティブ・ルール・セット内のルールで、それらのメッセージに対するタスクを実行するようにOracle Streamsクライアントに指示していないことが原因である可能性があります。同様に、伝播、適用プロセスまたはメッセージ・クライアントで、特定のユーザー・メッセージが廃棄されることを想定していたが、Oracle Streamsクライアントではそれらのメッセージが廃棄されない場合は、Oracle Streamsクライアントのポジティブ・ルール・セットおよびネガティブ・ルール・セット内のルールで、それらのメッセージを廃棄するように指示していないことが原因である可能性があります。
たとえば、oe
というメッセージ・クライアントで、次の条件を満たすoe.user_msg
タイプのメッセージをデキューするとします。
:"VAR$_2".OBJECT_OWNER = 'OE' AND :"VAR$_2".OBJECT_NAME = 'ORDERS'
メッセージ・クライアントでネガティブ・ルール・セットが使用される場合は、このメッセージ・タイプについてTRUE
と評価されるメッセージ・ルールがネガティブ・ルール・セット内に存在しないことを確認します。このようなルールがあると、メッセージ・クライアントでそれらのメッセージが廃棄されます。たとえば、メッセージ・クライアントのネガティブ・ルール・セットにそのようなルールが存在するかどうか判別するには、次の問合せを実行します。
COLUMN RULE_NAME HEADING 'Rule Name' FORMAT A30 COLUMN RULE_CONDITION HEADING 'Rule Condition' FORMAT A30 SELECT RULE_NAME, RULE_CONDITION FROM DBA_STREAMS_RULES WHERE STREAMS_NAME = 'OE' AND MESSAGE_TYPE_OWNER = 'OE' AND MESSAGE_TYPE_NAME = 'USER_MSG' AND RULE_SET_TYPE = 'NEGATIVE';
この問合せによってルールが返される場合は、それらのルールが原因となってメッセージ・クライアントでメッセージが廃棄されている可能性があります。返されたルールのルール条件を調べて、それらのルールが、メッセージ・クライアントでデキューする必要があるメッセージを廃棄する原因となっているかどうか判別します。この問合せでルールが返されない場合は、このメッセージ・タイプと条件についてTRUE
と評価されるメッセージ・ルールがメッセージ・クライアントのポジティブ・ルール・セットに存在することを確認します。
たとえば、このメッセージ・タイプについてTRUE
と評価されるメッセージ・ルールがメッセージ・クライアントのポジティブ・ルール・セットに存在するかどうか判別するには、次の問合せを実行します。
COLUMN RULE_NAME HEADING 'Rule Name' FORMAT A35 COLUMN RULE_CONDITION HEADING 'Rule Condition' FORMAT A35 SELECT RULE_NAME, RULE_CONDITION FROM DBA_STREAMS_RULES WHERE STREAMS_NAME = 'OE' AND MESSAGE_TYPE_OWNER = 'OE' AND MESSAGE_TYPE_NAME = 'USER_MSG' AND RULE_SET_TYPE = 'POSITIVE';
このメッセージ・タイプについてTRUE
と評価されるメッセージ・ルールがメッセージ・クライアントのポジティブ・ルール・セットに存在する場合は、それらのルールが返されます。この場合、出力は次のようになります。
Rule Name Rule Condition ----------------------------------- ----------------------------------- RULE$_3 :"VAR$_2".OBJECT_OWNER = 'OE' AND :"VAR$_2".OBJECT_NAME = 'ORDERS'
返されたルールのルール条件を調べて、適切なメッセージをデキューするようメッセージ・クライアントに指示しているかどうか判別します。これらの結果に基づき、oe
というメッセージ・クライアントは出力に表示された条件を満たすoe.user_msg
タイプのメッセージをデキューします。つまり、ルール条件を満たすoe.user_msg
タイプのメッセージがキュー内でメッセージ・クライアントによって検出されたときに、それらのメッセージを廃棄するルールが、メッセージ・クライアントのネガティブ・ルール・セットに存在せず、そのメッセージをTRUE
と評価するルールがメッセージ・クライアントのポジティブ・ルール・セットに存在しています。
関連項目:
-
メッセージ・ルールの指定の詳細は、「メッセージ・ルールの例」を参照
-
メッセージの詳細は、『Oracle Databaseアドバンスト・キューイング・ユーザーズ・ガイド』を参照
34.1.5 ルールに関する問題の解決
Oracle Streamsクライアントのルール・セットに、必要なルールが欠落していることにより、Oracle Streamsの取得プロセス、同期取得、伝播、適用プロセスまたはメッセージ・クライアントが予期したとおりに動作していないと思われる場合は、DBMS_STREAMS_ADM
パッケージの次のいずれかのプロシージャを使用して適切なルールを追加します。
-
ADD_GLOBAL_PROPAGATION_RULES
-
ADD_GLOBAL_RULES
-
ADD_SCHEMA_PROPAGATION_RULES
-
ADD_SCHEMA_RULES
-
ADD_SUBSET_PROPAGATION_RULES
-
ADD_SUBSET_RULES
-
ADD_TABLE_PROPAGATION_RULES
-
ADD_TABLE_RULES
-
ADD_MESSAGE_PROPAGATION_RULE
-
ADD_MESSAGE_RULE
必要に応じて、DBMS_RULE_ADM
パッケージを使用してカスタマイズ済ルールを追加できます。
また、Oracle Streamsの取得プロセス、同期取得、伝播、適用プロセスまたはメッセージ・クライアントが予期したとおりに動作しない原因は、ルールを変更する必要があるか、ルール・セットからルールを削除する必要があるためである場合もあります。
ルールが適切であっても、必要なメッセージがOracle Streamsの取得プロセス、伝播または適用プロセスで除外される場合は、トレース・ファイルとアラート・ログで、マルチバージョン・データ・ディクショナリ(Oracle Streamsデータ・ディクショナリ)の欠落に関する警告をチェックします。このような警告メッセージには、次の情報が含まれます。
-
gdbnm
: 欠落しているオブジェクトのソース・データベースのグローバル名 -
scn
: 欠落しているトランザクションのSCN
このようなメッセージがあるときに、カスタム取得プロセス・ルールを使用している場合、または新しい宛先データベースに既存の取得プロセス・ルールを再利用している場合は、次のようなプロシージャを適切に実行し、インスタンス化の準備をしてください。
-
PREPARE_TABLE_INSTANTIATION
-
PREPARE_SCHEMA_INSTANTIATION
-
PREPARE_GLOBAL_INSTANTIATION
また、ソース・データベースから宛先データベースへの伝播が機能していることを確認します。Oracle Streamsデータ・ディクショナリの情報は、宛先データベースに伝播された後、その宛先データベースのディクショナリにロードされます。
関連項目:
-
「ルールの変更」
-
データベース・オブジェクトをインスタンス化のために準備する方法の詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照
-
Oracle Streamsデータ・ディクショナリの詳細は、「Oracle Streamsデータ・ディクショナリ」を参照
34.2 宣言ルールベースの変換が適切に構成されているか
宣言ルールベースの変換は、行LCRの一般的な変換シナリオに対応するルールベースの変換です。宣言ルールベースの変換は、PL/SQLを使用せずに内部的に実行されます。Oracle Streamsの取得プロセス、同期取得、伝播、適用プロセスまたはメッセージ・クライアントが想定したとおりに動作しない場合は、そのOracle Streamsクライアントで使用されるルールに指定されている宣言ルールベースの変換をチェックし、誤りがあれば訂正します。
宣言ルールベースの変換で多く発生する問題には、次のものがあります。
-
宣言ルールベースの変換が表に指定されているか、または変換が表の列に関係している場合に、その変換が作成されたときに、そのスキーマが指定されなかった、または正しく指定されませんでした。宣言ルールベースの変換のスキーマが正しくないと、適切なLCRで変換されません。宣言ルールベースの変換を作成する際は、その表を所有しているスキーマを指定する必要があります。宣言ルールベースの変換を作成する際にスキーマを指定していないときは、デフォルトで、変換を作成するユーザーがスキーマに指定されます。
宣言ルールベースの変換のスキーマが正しくない場合、問題を解決するには、変換を削除して再作成し、各表の正しいスキーマを指定します。
-
特定のルールに対して複数の宣言ルールベースの変換が指定されている場合は、それらの変換の実行順序が正しいことを確認します。宣言ルールベースの変換の順序が正しくないと、エラーが発生するか、一貫性のないデータが生成される可能性があります。
単一のルールに対して指定された宣言ルールベースの変換の順序が正しくない場合、問題を解決するには、変換を削除し、正しい順序で再作成します。
関連項目:
34.3 カスタム・ルールベースの変換が適切に構成されているか
カスタム・ルールベースの変換は、ルールがTRUE
と評価されたときに実行される、ユーザー定義ファンクションによるメッセージの変更です。カスタム・ルールベースの変換は、ルールのアクション・コンテキスト内で指定されます。また、このようなアクション・コンテキストに含まれる名前/値ペアは、名前がSTREAMS$_TRANSFORM_FUNCTION
、値がユーザー作成ファンクション名です。このユーザー作成ファンクションによって変換が実行されます。ユーザー作成ファンクションに不備があると、予期しない動作が発生する可能性があります。
Oracle Streamsの取得プロセス、同期取得、伝播、適用プロセスまたはメッセージ・クライアントが想定したとおりに動作しない場合は、Oracle Streamsクライアントで使用されるルールで指定したカスタム・ルールベースの変換ファンクションをチェックして不備を修正します。DBA_STREAMS_TRANSFORM_FUNCTION
データ・ディクショナリ・ビューを問い合せると、これらのファンクションの名前を検索できます。問題を解決するには、変換ファンクションの変更やカスタム・ルールベースの変換の削除が必要になる場合があります。また、ルールに対して変換を指定するときにはファンクション名を正確に指定してください。
カスタム・ルールベースの変換が原因のエラーによって、取得プロセス、同期取得、伝播、適用プロセスおよびメッセージ・クライアントが中断されることがあります。この場合、変換を修正しないと、Oracle Streamsクライアントを再起動または起動できないことがあります。
ルールの評価は、カスタム・ルールベースの変換の前に行われます。たとえば、表名をemps
からemployees
に変更する変換がある場合は、その変換を使用する各ルールのルール条件で、表名employees
ではなくemps
が指定されていることを確認してください。
関連項目:
34.4 誤って変換されたLCRがエラー・キューにないか
場合によっては、誤って変換されたLCRが、適用プロセスによってエラー・キューに移動されていることがあります。このときは、エラー・キューのトランザクションを調べて、トランザクションを正常に再実行できる可能性を分析する必要があります。トランザクションに異常が見つかった場合は、問題を修正するためにプロシージャDMLハンドラを構成することができます。DMLハンドラは、エラー・トランザクションを再実行するときに実行されます。DMLハンドラを使用してエラー・トランザクションの問題を修正する場合は、そのDMLハンドラを使用する適用プロセスを停止して、エラー・トランザクションに関係ないLCRがDMLハンドラによって処理されないようにする必要があります。正常に再実行した後で、DMLハンドラが不要であれば削除します。また、ルールベースの変換を修正して、将来エラーが発生しないようにします。
関連項目:
-
「エラー・キュー」