Service Broker の ID の管理

各データベースには、Service Broker メッセージをそのデータベースにルーティングする際に使用する一意識別子が含まれています。このトピックでは、Service Broker 識別子、Service Broker でメッセージの宛先違いを防ぐ方法、および Service Broker 識別子の管理に使用できるオプションについて説明します。

Service Broker 識別子

各データベースには、そのデータベースをネットワーク内の他のすべてのデータベースから区別する Service Broker 識別子が含まれています。sys.databases カタログ ビューの service_broker_guid 列には、インスタンス内の各データベースの Service Broker 識別子が表示されます。Service Broker システムは、サービスの複数のコピーを実行するようにデザインできます。サービスの各コピーは、個別のデータベースで実行されます。サービスの複数のコピーを使用するシステムでは、CREATE ROUTE ステートメントの BROKER_INSTANCE 句を使用して、サービスの特定のコピーへのルートを作成します。

Service Broker のルーティングでは、Service Broker 識別子を使用して、あるメッセージ交換のすべてのメッセージが確実に同じデータベースに配信されるようにします。BEGIN DIALOG CONVERSATION ステートメントでは、転送先サービスを使用してメッセージ交換を開始します。メッセージ交換が正常に開始されると、転送先サービスからの受信確認メッセージには、転送先データベースの Service Broker 識別子が含まれます。その後、Service Broker は、指定されたデータベースに、そのメッセージ交換のすべてのメッセージをルーティングします。

Service Broker 識別子は、BEGIN DIALOG CONVERSATION ステートメントの TO SERVICE 句に指定すると、実行されるルーティングの種類を制御できます。

  • メッセージ交換をサービスの特定のコピーにルーティングするには、service_broker_guid を指定します。たとえば、ネットワーク上の 3 つのデータベース (開発用データベース、テスト用データベース、および運用データベース) に、サービスのコピーを 3 つ用意したとします。各システムでは、BEGIN DIALOG CONVERSATION ステートメントで service_broker_guid を指定して、すべてのメッセージが適切なデータベースに送信されるようにする必要があります。

  • Service Broker がサービスの複数のコピー間でメッセージ交換の負荷を分散できるようにするには、service_broker_guid を指定しないください。Service Broker は、BEGIN DIALOG CONVERSATION の TO SERVICE 句で指定されているのと同じサービス名を使用して複数のルートから選択します。

既定で、ネットワーク内にサービスのコピーが 1 つしか存在しない場合は、Service Broker はメッセージ交換を正しくルーティングします。CREATE ROUTE ステートメントまたは DIALOG CONVERSATION ステートメントで Service Broker 識別子を指定する必要はありません。

Service Broker のルートの照合の詳細については、「Service Broker のルーティング」を参照してください。

メッセージ配信を正しくサポートするため、同じネットワーク上のデータベース エンジンのすべてのインスタンスで Service Broker 識別子を一意にする必要があります。一意でないと、メッセージが間違った宛先に配信される可能性があります。新しいデータベースが作成されると、ネットワーク内で一意の新しい Service Broker 識別子が割り当てられます。この識別子はデータベースが復元またはアタッチされるときに復元されます。データベースを復元およびアタッチする場合は注意してください。複数のデータベースで、Service Broker 操作をアクティブに実行したり、同じ識別子を使用したりしないでください。

Service Broker のメッセージ配信

同じネットワーク内の別のデータベースと同じ Service Broker 識別子を使用している場合にデータベースで Service Broker のメッセージ配信を非アクティブ化するメカニズムが SQL Server に用意されています。データベースでメッセージ配信が非アクティブ化されると、そのデータベースから送信されたすべてのメッセージが、データベースの転送キューにそのまま残されます。さらに、Service Broker は、そのデータベース内のサービスがメッセージを受信できる状態にないと見なします。Service Broker のルーティングでインスタンス内の転送先サービスが検索される際に、これらのサービスは対象となりません。

Service Broker のメッセージ配信を非アクティブ化することで、トラブルシューティングやデータ復旧の際に、メッセージの宛先を間違えることなく、データベースのバックアップを安全にアタッチできます。sys.databasesis_broker_enabled 列には、Service Broker のメッセージ配信の現在の状態がデータベースごとに表示されます。

データベースをアタッチまたは復元するときは、指定の Service Broker 識別子を持つ 1 つのデータベースだけでメッセージ配信がアクティブになるように注意してください。それ以外の場合、メッセージが間違った宛先に送信され、メッセージ交換がデータベースの間違ったコピーで処理される可能性があります。

識別子とメッセージ配信の管理

CREATE DATABASE、ALTER DATABASE、および RESTORE DATABASE の各コマンドには、Service Broker のメッセージ配信をアクティブ化するオプションがあります。また、データベースの Service Broker 識別子を変更するオプションもあります。

既定では、データベースをアタッチまたは復元する際に、Service Broker 識別子とメッセージ配信の状態は変更されません。次のような場合は、通常、Service Broker 識別子を変更しません。

  • 復旧の目的でバックアップを復元する場合。

  • ミラー化を構成する場合。

  • スタンバイ サーバーのログ配布を設定する場合。データベースのコピーを作成するときは、インスタンス識別子を変更します。

識別子とメッセージ配信を管理するオプションには、次の 4 つがあります。

  • ENABLE_BROKER。このオプションは、Service Broker のメッセージ配信をアクティブ化して、データベースの既存の Service Broker 識別子を保持します。

    注意

    任意のデータベースで SQL Server Service Broker を有効にするには、データベース ロックが必要です。msdb データベースで Service Broker を有効にするには、最初に SQL Server エージェントを停止します。その後、Service Broker は必要なロックを取得できます。

  • DISABLE_BROKER。このオプションは、Service Broker のメッセージ配信を非アクティブ化して、データベースの既存の Service Broker 識別子を保持します。

  • NEW_BROKER。このオプションは、Service Broker のメッセージ配信をアクティブ化して、データベースに新しい Service Broker 識別子を作成します。このオプションを指定すると、データベース内の既存のメッセージ交換がすべて終了し、各メッセージ交換にエラーが返されます。これは、これらのメッセージ交換が新しい識別子を使用していないためです。古い Service Broker 識別子を参照するルートは、新しい識別子を使用して作成し直す必要があります。

  • ERROR_BROKER_CONVERSATIONS。このオプションは、Service Broker のメッセージ配信をアクティブ化して、データベースの既存の Service Broker 識別子を保持します。Service Broker により、データベース内のメッセージ交換がすべて終了し、各メッセージ交換にエラーが返されます。このオプションは、通常、あるデータベースを、メッセージ交換の対象である他のデータベースとは異なる時点に復元する必要がある場合に使用されます。復元されたデータベース内のすべてのメッセージ交換はエラーで終了します。これは、他のデータベースと同期されていないためです。Service Broker 識別子は、その識別子を参照するすべてのルートを有効にしておくために保持されます。

どのオプションを指定した場合でも、SQL Server では、同じ Service Broker 識別子を使用する 2 つのデータベースが、同じ SQL Server インスタンス内でメッセージ配信をアクティブ化することはできません。既存のデータベースと同じ Service Broker 識別子を持つデータベースをアタッチすると、SQL Server によって、アタッチされるデータベースで Service Broker のメッセージ配信が非アクティブ化されます。

データベースのアタッチに関するオプションの詳細については、「CREATE DATABASE (Transact-SQL)」および「ALTER DATABASE (Transact-SQL)」を参照してください。データベースで Service Broker のメッセージ配信をアクティブ化する方法については、「データベースで Service Broker のメッセージ配信をアクティブ化する方法 (Transact-SQL)」を参照してください。