ルーティングおよびメッセージ配信のトラブルシューティング
ここでは、ルーティングおよびメッセージ配信に関連する一般的な問題の修正方法を示します。
テクニック : メッセージ配信を診断する
2 つのサービス間のメッセージ配信に失敗した場合は、ssbdiagnose ユーティリティを使用して、メッセージ交換のランタイム レポートを生成します。ランタイム レポートには、メッセージ交換の操作によって発生したすべてのエラーが表示されます。エラーが発生した場合、ssbdiagnose によって、サービス間の構成も分析され、検出される構成上の問題が報告されます。詳細については、「ssbdiagnose ユーティリティ」を参照してください。
問題 : メッセージが転送キューに残る
Service Broker のメッセージ配信がデータベースでアクティブ化されていることを確認します。次のサンプルに示すように、sys.databases の is_broker_enabled 列には、Service Broker のメッセージ配信がアクティブ化されているかどうかが示されます。
SELECT is_broker_enabled FROM sys.databases
WHERE database_id = DB_ID() ;
メッセージが間違ったデータベースに配信されることを防ぐため、ブローカのメッセージ配信を非アクティブ化することができます。Service Broker のメッセージ配信の詳細については、「Service Broker の ID の管理」を参照してください。Service Broker のメッセージ配信をアクティブ化する方法の詳細については、「データベースで Service Broker のメッセージ配信をアクティブ化する方法 (Transact-SQL)」を参照してください。
Service Broker のメッセージ配信がアクティブな場合は、メッセージの sys.transmission_queue カタログ ビューの transmission_status 列を確認してください。一般的なエラー メッセージを次に示します。
メッセージ |
説明 |
---|---|
このメッセージ交換の対象となるサービス名に一致するルートがありません。このメッセージ交換でのメッセージの対象となるサービス名へのルートを作成してください。 |
Service Broker は、指定されたサービスへのルートを見つけることができませんでした。 |
対象の Service Broker にアクセスできません。 |
Service Broker は、メッセージを対象の Service Broker に配信できませんでした。 |
トランスポート層を使用できません。 |
インスタンス内に Service Broker エンドポイントが存在しないか、または Service Broker エンドポイントが正常に起動していません。 |
対象のキューが無効です。 |
転送先サービスが使用しているキューの STATUS オプションが OFF に設定されています。Service Broker は、STATUS が OFF のキューには新しいメッセージを追加しません。 |
データ '10054 (既存の接続はリモート ホストに強制的に切断されました。)' を受信中にエラーが発生しました。 |
メッセージ交換のリモート側が、TCP/IP 接続を受け入れましたが、メッセージが送信できるようになる前に接続を閉じました。 |
(なし) |
Service Broker は、まだメッセージの送信を試行していません。enqueue_time 列で、メッセージが長期間キューに残っていることが示されている場合は、Service Broker のメッセージ配信がデータベースでアクティブ化されていない可能性があります。 |
問題 : ルートが存在しているにもかかわらず、サービスのルートが存在しないという転送エラーが表示される
この問題の最も一般的な原因を次に示します。
正常にメッセージ配信を行うルートが存在しない場合に SEND ステートメントでメッセージを作成しました。
ルートが後から作成されたにもかかわらず、Service Broker がまだメッセージの再送信を試行していません。
再試行の詳細については、「Service Broker のルーティングとネットワーク」を参照してください。
メッセージで指定されているサービス名が、ルートで指定されているサービス名と正確に一致していることを確認します。Service Broker では、サービス名の照合に、バイト単位のバイナリ比較を使用します。そのサービス名を指定したルートが存在する場合、次のクエリを実行して名前を比較できます。
SELECT N'No Exact Match' = tq.to_service_name
FROM sys.transmission_queue AS tq
WHERE NOT EXISTS
(SELECT remote_service_name
FROM sys.routes AS routes
WHERE tq.to_service_name = routes.remote_service_name) ;
注意 |
---|
サービス名によっては、ルートと一致する場合でも、結果セットに表示されることがあります。サービス名を指定していないルート (remote_service_name = NULL) は、任意のメッセージで使用されているサービス名と一致します。 |
Service Broker ルートの詳細については、「Service Broker のルーティング」を参照してください。
メッセージでブローカ インスタンス識別子が指定されている場合は、ルートで同じブローカ インスタンス識別子が指定されていること、またはルートでブローカ インスタンス識別子が指定されていないことを確認してください。
ルートの有効期限が切れていないことを確認してください。sys.routes カタログ ビューの有効期間列に、ルートの有効期限の日時が含まれています。
問題 : 対象の Service Broker にアクセスできないという転送エラーが表示される
転送先がメッセージを受け入れませんでした。これは、指定されているサービス名が、転送先の SQL Server インスタンスがホストしているサービス名に一致しないことを示している可能性があります。また、転送先にサービスのルートが含まれていないことを示している可能性もあります。この問題をトラブルシューティングするには、転送先のルーティングおよびサービスの構成を確認してください。
問題 : トランスポート層を使用できないという転送エラーが表示される
Service Broker エンドポイントが存在することを確認します。エンドポイントが存在しない場合は作成します。エンドポイントが存在する場合は、エンドポイントの状態が STARTED であることを確認します。詳細については、「Service Broker エンドポイント」を参照してください。エンドポイントの作成方法の詳細については、「Service Broker ネットワークをアクティブ化する方法 (Transact-SQL)」を参照してください。
問題 : 転送エラー "既存の接続はリモート ホストに強制的に切断されました。" が表示される
トランスポート セキュリティが正しく構成されていないか、またはルートの TCP/IP アドレスで指定されているポートが Service Broker 以外のサービスによって使用されている可能性があります。
注意 |
---|
ルートで指定されているポートは、データベース エンジンのリモート インスタンスの Service Broker エンドポイントで使用されるポートと一致する必要があります。Service Broker では、メッセージの転送に Service Broker 通信プロトコルが使用され、Transact-SQL バッチおよび結果の転送に使用される表形式のデータ ストリーム プロトコルは使用されません。したがって、Service Broker エンドポイントで使用されるポートは、Transact-SQL の転送に使用されるポートとは異なります。 |
Service Broker エンドポイントの構成を調べて、2 つのインスタンスのネットワーク セキュリティ設定に互換性があることを確認してください。一方のインスタンスの Service Broker エンドポイントで REQUIRED または ENABLED が指定されている場合、もう一方のインスタンスの Service Broker エンドポイントに NONE を指定することはできません。
Service Broker トランスポート セキュリティの証明書、ユーザー、および権限を確認してください。詳細については、「Service Broker トランスポート セキュリティ」を参照してください。