Share via


管理 Service Broker 識別

適用於:SQL ServerAzure SQL 受控執行個體

每個資料庫都包含唯一識別碼,用以將 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 會將交談的所有訊息路由至指定的資料庫。

您可以在 BEGIN DIALOG CONVERSATION 陳述式的 TO SERVICE 子句中指定 Service Broker 識別碼,以便控制即將執行的路由類型:

  • 若要將交談路由至特定服務複本,請指定 service_broker_guid。 例如,在網路上的三個資料庫中,您可能會有三個服務副本:開發資料庫、測試資料庫和實際執行的資料庫。 每個系統中的 BEGIN DIALOG CONVERSATION 陳述式都應該指定 service_broker_guid,以便確保所有訊息都會前往正確的資料庫。

  • 若要讓 Service Broker 平衡多個服務複本之間的交談負載,請勿指定 service_broker_guid。 Service Broker 將以其他方式在具有 BEGIN DIALOG CONVERSATION 之 TO SERVICE 子句中指定的相同服務名稱的路由中挑選。

根據預設,如果網路中只有一個服務複本,Service Broker 就會正確路由交談。 您不需要在 CREATE ROUTE 或 BEGIN DIALOG CONVERSATION 陳述式中指定 Service Broker 識別碼。

如需 Service Broker 路由比對的詳細資訊,請參閱 Service Broker 路由

為了正確支援訊息傳遞,在相同網路上的所有資料庫引擎執行個體之間,每個 Service Broker 識別碼都應該是唯一的。 否則,可能會錯誤導向訊息。 建立新的資料庫時,其會被指派在網路中應是唯一的全新 Service Broker 識別碼。 當資料庫還原或附加時,此識別碼就會一併還原。 當您要還原並附加資料庫時,請特別小心。 您不應該設有多個目前正執行 Service Broker 作業而且使用相同識別碼的資料庫。

Service Broker 訊息傳遞

SQL Server 會提供一項機制,可在某個資料庫與相同網路中的其他資料庫具有相同的 Service Broker 識別碼時,停用該資料庫中的 Service Broker 訊息傳遞。 當停用資料庫中的訊息傳遞時,從該資料庫中傳送的所有訊息都會保留在資料庫的傳輸佇列中。 此外,Service Broker 不會將該資料庫中的服務視為可用於接收訊息。 當 Service Broker 路由在執行個體中尋找目的地服務時,就不會考慮這些服務。

停用 Service Broker 訊息傳遞可讓您安全地附加資料庫備份,以便進行疑難排解或資料復原,而不用冒著將訊息錯誤導向的風險。 sys.databasesis_broker_enabled 資料行會顯示每個資料庫之 Service Broker 訊息傳遞的目前狀態。

當您附加或還原資料庫時,請小心確保只有一個具有給定 Service Broker 識別碼的資料庫啟用訊息傳遞。 否則,可能會錯誤導向訊息,而且交談處理可能會出現在資料庫的錯誤副本中。

管理識別碼和訊息傳遞

CREATE DATABASE 命令、ALTER DATABASE 命令和 RESTORE DATABASE 命令都包含可啟動 Service Broker 訊息傳遞的選項。 此外,其也包含可變更資料庫之 Service Broker 識別碼的選項。

根據預設,當您附加或還原資料庫時,Service Broker 識別碼和訊息傳遞的狀態維持不變。 一般而言,在下列情況中,您不會變更 Service Broker 識別碼:

  • 當您還原備份以便進行復原目的時。

  • 當您設定鏡像組時。

  • 當您設定待命伺服器的記錄傳送時。 在建立資料庫的副本時,會變更執行個體識別碼。

有四個選項可管理識別碼和訊息傳遞:

  • ENABLE_BROKER。 此選項會啟用 Service Broker 訊息傳遞,保留資料庫的現有 Service Broker 識別碼。

    注意

    在任何資料庫中啟用 SQL Server Service Broker 都需要資料庫鎖定。 若要在 msdb 資料庫中啟用 Service Broker,請先停止 SQL Server Agent。 接著,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 識別碼的兩個資料庫在相同的 SQL Server 執行個體中同時啟用訊息傳遞。 如果您所附加的資料庫與現有資料庫具有相同的 Service Broker 識別碼,SQL Server 就會停用正在附加之資料庫中的 Service Broker 訊息傳遞。

如需附加資料庫之選項的詳細資訊,請參閱 CREATE DATABASEALTER DATABASE (Transact-SQL)。 如需在資料庫中如何啟動 Service Broker 訊息傳遞的詳細資訊,請參閱操作說明:在資料庫中啟動 Service Broker 訊息傳遞 (Transact-SQL)

另請參閱