管理 Service Broker 識別
每個資料庫都包含唯一識別碼,用以將 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 路由>。
為了正確支援訊息傳遞,在相同網路上的所有 Database Engine 執行個體之間,每個 Service Broker 識別碼都應該是唯一的。否則,可能會錯誤導向訊息。建立新的資料庫時,它會被指派在網路中應該是唯一的全新 Service Broker 識別碼。當資料庫還原或附加時,此識別碼就會一併還原。當您要還原並附加資料庫時,請特別小心。您不應該設有多個目前正執行 Service Broker 作業而且使用相同識別碼的資料庫。
Service Broker 訊息傳遞
SQL Server 會提供一項機制,可在某個資料庫與相同網路中的其他資料庫具有相同的 Service Broker 識別碼時,停用該資料庫中的 Service Broker 訊息傳遞。當停用資料庫中的訊息傳遞時,從該資料庫中傳送的所有訊息都會保留在資料庫的傳輸佇列中。此外,Service Broker 不會將該資料庫中的服務視為可用於接收訊息。當 Service Broker 路由在執行個體中找出目的地服務時,就不會考慮這些服務。
停用 Service Broker 訊息傳遞可讓您安全地附加資料庫備份,以便進行疑難排解或資料復原目的,而不用冒著錯誤導向訊息的風險。sys.databases 的 is_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 ServerService 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 DATABASE (Transact-SQL)>和<ALTER DATABASE (Transact-SQL)>。如需有關如何在資料庫中啟動 Service Broker 訊息傳遞的詳細資訊,請參閱<如何:啟動資料庫中的 Service Broker 訊息傳遞 (Transact-SQL)>。