日本語PDF

7 Oracle Database Advanced Queuingのトラブルシューティング

次のトピックでは、Oracle Database Advanced Queuing (AQ)のトラブルシューティング方法を説明します。

Oracle Database Advanced Queuingの伝播に関する問題のデバッグ

次のヒントは、伝播に関する問題のデバッグに役立ちます。ここでは、ソースおよびターゲット・データベースにキュー表およびキューを作成し、接続先データベースに対するデータベース・リンクを定義していると想定します。

表記法は、大カッコなしでエンティティの実際の名前が提供されるものと想定します。

関連項目:

伝播の最適化

デバッグを開始するには、次の手順を実行します。

  1. 伝播スケジュールが作成され、ジョブ・キュー・プロセスが割り当てられたことを確認します。

    DBA_QUEUE_SCHEDULESビューのエントリを検索し、スケジュールのステータスが有効であることを確認します。SCHEDULE_DISABLEDNに設定されている必要があります。表AQ$_SCHEDULESJOBNOについて0(ゼロ)以外のエントリがあることと、表JOB$にそのJOBNOを含むエントリがあることを確認します。

    伝播が発生していることを確認するには、伝播済のメッセージの数(TOTAL_NUMBER)のDBA_QUEUE_SCHEDULESビューを監視します。

    伝播が発生していない場合は、ビューでエラーをチェックします。また、DBA_QUEUE_SCHEDULESNEXT_RUN_DATENEXT_RUN_TIMEをチェックし、エラーまたは設定方法に応じて後で伝播を実行するようにスケジュールされていないか確認します。

  2. 接続先データベースへのデータベース・リンクが正しく設定されていることを確認します。キュー所有者がデータベース・リンクを使用できることを確認します。この場合は、次のように入力します。
    select count(*) from table_name@dblink_name;
    
  3. 2つ以上のジョブ・キュー・プロセスが実行中であることを確認します。
  4. ソース・キューのメッセージを次のようにして確認します。
    select count (*) from AQ$<source_queue_table> 
      where q_name = 'source_queue_name';
    
  5. 宛先キューのメッセージを次のようにして確認します。
    select count (*) from AQ$<destination_queue_table> 
      where q_name = 'destination_queue_name';
    
  6. 誰がジョブ・キュー・プロセスを使用しているかを確認します。

    dba_jobs_runningを問い合せて実行されているジョブを確認します。他のジョブが伝播ジョブに影響を及ぼしている可能性があります。

  7. キュー表sys.aq$_prop_table_instnoDBA_QUEUE_TABLESにあることを確認します。また、キューsys.aq$_prop_notify_queue_instnoDBA_QUEUESにあり、エンキューおよびデキューに使用可能になっている必要があります。

    Oracle Real Application Clusters(Oracle RAC)の場合は、このキュー表とキュー・ペアがシステム内の各Oracle RACノードにある必要があります。キュー表およびキュー・ペアはジョブ・キュー・プロセス間の通信に使用され、自動的に作成されます。

  8. 宛先キューからメッセージデキューするコンシューマが、伝播されたメッセージの受信者であることを確認します。

    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'; 
    

    注意:

    compatible8.0に設定されているキュー表で作成されたキュー(このマニュアルでは8.0形式のキューと呼びます)は、Oracle Database Advanced Queuing 10gリリース2 (10.2)では非推奨になっています。したがって、新しいキューの作成には8.1以降の形式を使用し、既存の8.0形式のキューをなるべく早く移行することをお薦めします。

  9. イベント24040、レベル10を使用して、伝播トレースを最高レベルでONにします。

    伝播の発生時に、デバッグ情報がジョブ・キュー・トレース・ファイルに記録されます。トレース・ファイルで、エラーがないか、またメッセージが送信されたことを示す文を確認できます。

Oracle Database Advanced Queuingのエラー・メッセージ

Oracle Database Advanced Queuingのエラー・メッセージを次に示します。

ORA-1555

デキューにNEXT_MESSAGEナビゲーション・オプションを使用すると、このエラー・メッセージが表示される場合があります。NEXT_MESSAGEでは、最初のデキュー・コール中に作成されたスナップショットが使用されます。その後で、UNDO情報が削除される場合があります。

これを解決するには、FIRST_MESSAGEオプションを使用してメッセージをデキューします。これによってカーソルが再実行され、新しいスナップショットが取得されます。FIRST_MESSAGENEXT_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

メッセージ送信者に対してフロー制御が有効になっています。これは、送信者のメッセージのうち最も高速のサブスクライバがメッセージのエンキュー速度に追いつけないことを意味します。バッファ済メッセージング・アプリケーションは、このエラーを処理し、少し待ってからメッセージを再度エンキューする必要があります。