Управление идентификационными данными компонента Service Broker
Каждая база данных содержит уникальный идентификатор, используемый для направления сообщений компонента Service Broker в эту базу данных. В этом разделе описываются идентификаторы компонента Service Broker, как компонент Service Broker обеспечивает защиту от ошибочного направления сообщений, а также параметры, доступные для управления идентификаторами компонента Service Broker.
Идентификаторы компонента Service Broker
Каждая база данных содержит идентификатор компонента Service Broker, отличающий ее от всех остальных баз данных в сети. В столбце service_broker_guid представления каталога sys.databases содержатся идентификаторы компонента Service Broker для каждой базы данных в экземпляре. Системы компонента Service Broker могут быть настроены для работы нескольких копий службы одновременно. Каждая копия службы выполняется в отдельной базе данных. В системе, где работают несколько копий службы, используйте предложение BROKER_INSTANCE инструкции CREATE ROUTE, чтобы создать перенаправление в конкретную копию службы.
Механизм маршрутизации сообщений компонента Service Broker использует идентификатор Service Broker для того, чтобы гарантировать доставку всех сообщений диалога одной и той же базе данных. Инструкция BEGIN DIALOG CONVERSATION начинает диалог с целевой службой. Если диалог успешно начат, сообщение с подтверждением от целевой службы содержит идентификатор компонента Service Broker для целевой базы данных. Затем компонент Service Broker перенаправляет все сообщения для диалога в указанную базу данных.
Идентификаторы компонента Service Broker могут быть указаны в предложении TO SERVICE инструкции BEGIN DIALOG CONVERSATION, чтобы определить требуемый тип маршрутизации.
Для перенаправления диалогов конкретной копии службы укажите service_broker_guid. Например, три копии службы могут работать в трех базах данных в сети: базе данных разработки, тестовой базе данных и производственной базе данных. Инструкциями BEGIN DIALOG CONVERSATION в каждой системе должны быть указаны идентификаторы service_broker_guid, чтобы гарантировать доставку всех сообщений в соответствующую базу данных.
Для равномерного распределения нагрузки компонентом Service Broker при осуществлении диалогов в нескольких экземплярах службы не указывайте идентификатор service_broker_guid. При этом компонент Service Broker выбирает доступный маршрут из числа маршрутов с одним и тем же именем службы, как указано в предложении TO SERVICE инструкции BEGIN DIALOG CONVERSATION.
По умолчанию, если работает только одна копия службы в сети, компонент Service Broker правильно осуществляет маршрутизацию диалогов. Нет необходимости указывать идентификатор компонента Service Broker в инструкциях CREATE ROUTE или BEGIN DIALOG CONVERSATION.
Дополнительные сведения о совпадении маршрутов компонента Service Broker см. в разделе Маршрутизация компонента Service Broker.
Для обеспечения правильной доставки сообщений каждый идентификатор компонента Service Broker должен быть уникален во всех экземплярах компонента Database Engine в одной сети. В противном случае сообщения могут быть доставлены неверному адресату. При создании новой базы данных ей присваивается новый идентификатор компонента Service Broker, который должен быть уникальным в сети. Идентификатор восстанавливается при восстановлении или присоединении базы данных. Выполнять восстановление и присоединение баз данных следует с осторожностью. Нельзя допускать активного выполнения несколькими базами данных операций компонента Service Broker с использованием одних и тех же идентификаторов.
Доставка сообщений компонента Service Broker
SQL Server обеспечивает механизм для деактивации доставки сообщений компонента Service Broker в базе данных, если присвоенный ей идентификатор компонента Service Broker совпадает с идентификатором другой базы данных в той же сети. Если в базе данных отключена доставка сообщений, все сообщения, отправляемые этой базой данных, остаются в очереди передаваемых сообщений. Кроме того, компонент Service Broker не считает службы этой базы данных доступными для принятия сообщений. Эти службы не учитываются, если механизм маршрутизации сообщений компонента Service Broker определяет местонахождение целевой службы в экземпляре.
Деактивация доставки сообщений компонента Service Broker позволяет безопасно присоединить резервную копию базы данных с целью устранения неполадок или восстановления данных без риска доставки сообщений неверным адресатам. Сведения о текущем состоянии доставки сообщений компонентом Service Broker для каждой базы данных выводятся в столбце is_broker_enabled представления sys.databases.
Выполняя подключение или восстановление базы данных, убедитесь в том, что доставка сообщений включена только для одной базы данных с конкретным идентификатором компонента 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 необходима блокировка базы данных. Чтобы включить компонент Service Broker в базе данных msdb, необходимо сначала остановить агент 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 не позволяет включить доставку сообщений в одном экземпляре SQL Server для двух баз данных с одним и тем же идентификатором компонента Service Broker. При подключении базы данных с тем же идентификатором компонента Service Broker, что и у существующей базы данных, SQL Server деактивирует доставку сообщений компонента Service Broker в присоединяемой базе данных.
Дополнительные сведения о параметрах присоединения баз данных см. в разделах CREATE DATABASE (Transact-SQL) и ALTER DATABASE (Transact-SQL). Сведения об активации доставки сообщений компонента Service Broker в базе данных см. в разделе Как активировать доставку сообщений компонента Service Broker в базах данных (Transact-SQL).