この章では、Oracle Database Advanced Queuing (AQ)のトラブルシューティング方法を説明します。
内容は次のとおりです。
次のヒントは、伝播に関する問題のデバッグに役立ちます。ここでは、ソースおよびターゲット・データベースにキュー表およびキューを作成し、接続先データベースに対するデータベース・リンクを定義していると想定します。表記法は、大カッコなしでエンティティの実際の名前が提供されるものと想定します。
デバッグを開始するには、次の手順を実行します。
伝播スケジュールが作成され、ジョブ・キュー・プロセスが割り当てられたことを確認します。
DBA_QUEUE_SCHEDULES
ビューのエントリを検索し、スケジュールのステータスが有効であることを確認します。SCHEDULE_DISABLED
がN
に設定されている必要があります。表AQ$_SCHEDULES
でJOBNO
について0(ゼロ)以外のエントリがあることと、表JOB$
にそのJOBNO
を含むエントリがあることを確認します。
伝播が発生していることを確認するには、伝播済のメッセージの数(TOTAL_NUMBER
)のDBA_QUEUE_SCHEDULES
ビューを監視します。
伝播が発生していない場合は、ビューでエラーをチェックします。また、DBA_QUEUE_SCHEDULES
のNEXT_RUN_DATE
とNEXT_RUN_TIME
をチェックし、エラーまたは設定方法に応じて後で伝播を実行するようにスケジュールされていないか確認します。
接続先データベースへのデータベース・リンクが正しく設定されていることを確認します。キュー所有者がデータベース・リンクを使用できることを確認します。この場合は、次のように入力します。
select count(*) from table_name@dblink_name;
2つ以上のジョブ・キュー・プロセスが実行中であることを確認します。
ソース・キューのメッセージを次のようにして確認します。
select count (*) from AQ$<source_queue_table> where q_name = 'source_queue_name';
宛先キューのメッセージを次のようにして確認します。
select count (*) from AQ$<destination_queue_table> where q_name = 'destination_queue_name';
誰がジョブ・キュー・プロセスを使用しているかを確認します。
dba_jobs_running
を問い合せて実行されているジョブを確認します。他のジョブが伝播ジョブに影響を及ぼしている可能性があります。
キュー表sys.aq$_prop_table_
instno
がDBA_QUEUE_TABLES
にあることを確認します。また、キューsys.aq$_prop_notify_queue_
instno
がDBA_QUEUES
にあり、エンキューおよびデキューに使用可能になっている必要があります。
Oracle Real Application Clusters(Oracle RAC)の場合は、このキュー表とキュー・ペアがシステム内の各Oracle RACノードにある必要があります。キュー表およびキュー・ペアはジョブ・キュー・プロセス間の通信に使用され、自動的に作成されます。
宛先キューからメッセージをデキューするコンシューマが、伝播されたメッセージの受信者であることを確認します。
8.1形式のキューでは、次のように入力します。
select consumer_name, deq_txn_id, deq_time, deq_user_id,
propagated_msgid from aq$<destination_queue_table>
where queue = 'queue_name';
8.0形式のキューでは、次のように入力してキュー表の履歴列から同じ情報を取得できます。
select h.consumer, h.transaction_id, h.deq_time, h.deq_user, h.propagated_msgid from aq$<destination_queue_table> t, table(t.history) h where t.q_name = 'queue_name';
注意: compatible が8.0 に設定されているキュー表で作成されたキュー(このマニュアルでは8.0形式のキューと呼びます)は、Oracle Database Advanced Queuing 10gリリース2 (10.2)では非推奨になっています。したがって、新しいキューの作成には8.1以降の形式を使用し、既存の8.0形式のキューをなるべく早く移行することをお薦めします。 |
イベント24040、レベル10を使用して、伝播トレースを最高レベルでONにします。
伝播の発生時に、デバッグ情報がジョブ・キュー・トレース・ファイルに記録されます。トレース・ファイルで、エラーがないか、またメッセージが送信されたことを示す文を確認できます。
ORA-1555
デキューにNEXT_MESSAGE
ナビゲーション・オプションを使用すると、このエラー・メッセージが表示される場合があります。NEXT_MESSAGEでは、最初のデキュー・コール中に作成されたスナップショットが使用されます。その後で、UNDO情報が削除される場合があります。
これを解決するには、FIRST_MESSAGE
オプションを使用してメッセージをデキューします。これによってカーソルが再実行され、新しいスナップショットが取得されます。FIRST_MESSAGEはNEXT_MESSAGEのように実行されないため、1つのメッセージにFIRST_MESSAGE
を使用し、次の1000のメッセージにNEXT_MESSAGE
を使用し、再びFIRST_MESSAGE
を使用するというように、メッセージをバッチでデキューすることをお薦めします。
ORA-24033
メッセージが受信者を指定しないでマルチ・コンシューマ・キューにエンキューされ、そのキューにサブスクライバが指定されていない(またはそのメッセージに一致するルールベースのサブスクライバが存在しない)場合、このエラーが発生します。これは、配信先の受信者またはサブスクライバが存在しないメッセージは廃棄されるという警告です。
ORA-25237
サービス間(xa_start
境界とxa_end
境界の間など)でデキュー処理を続ける場合に、Oracle Database Advanced Queuingナビゲーション・オプションを使用するときは、FIRST_MESSAGE
を使用してデキュー位置をリセットする必要があります。これは、xa_end
が終了すると、XAがカーソル・フェッチ状態を取り消すためです。リセットしないと、ナビゲーション・オプションの指定順序が正しくないというエラー・メッセージが表示されます。
ORA-25307
メッセージ送信者に対してフロー制御が有効になっています。これは、送信者のメッセージのうち最も高速のサブスクライバがメッセージのエンキュー速度に追いつけないことを意味します。バッファ済メッセージング・アプリケーションは、このエラーを処理し、少し待ってからメッセージを再度エンキューする必要があります。