powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как обнаружить ошибку при работе service broker?
21 сообщений из 71, страница 3 из 3
Как обнаружить ошибку при работе service broker?
    #39603824
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На этом закругляюсь, сразу прощу прощения я чето не очень догнал как файлы картинок-вложений запихнуть в спойлеры.

Сергей Гавриленко
если можно Вас попросить подредактировать мои посты что бы картинки не убили у кого-нибудь траффик на телефоне.
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39603904
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ff, огромное спасибо.
Добавил в закладки, буду пытаться скурить.

На первый взгляд - самое дельное и подробное руководство из всех, что я видел.
Спасибо!
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39747239
ShIgor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff,

супер! жаль что я это прошел на год раньше через собственные спотыкания.
чуть позже дополню как у меня происходит обмен сертификатами между серверами без ручного перекладывания файлов, да и вообще без файлов.
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39875795
felix_ff, спасибо за ответы в теме, на сегодня вы мой бог )

Сделал все как написано и настроил общение между удаленным сервером и сервером в офисе + настроил общение между БД внутри офиса. Начал по аналогии настраивать следующий удаленный сервер, а их около 10 и получаю ошибку "Connection attempt failed with error: '10060(Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера.)'."

Первое, подумал, что некорректно настроил. Настроил следующий, и такая же ошибка. Где-то есть подвох, которого не понимаю. Как найти ошибку?

Спасибо
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39875819
и теперь вообще все поломалось, в профайлере пишет

An exception occurred while enqueueing a message in the target queue. Error: 33009, State: 2. The database owner SID recorded in the master database differs from the database owner SID recorded in database 'ServiceBroker'. You should correct this situation by resetting the owner of database 'ServiceBroker' using the ALTER AUTHORIZATION statement.

Идентификатор безопасности владельца базы данных, записанный в базе данных master, отличается от идентификатора безопасности владельца базы данных, записанного в базе данных "ServiceBroker". Устраните это различие, сбросив владельца базы данных "ServiceBroker" с помощью инструкции ALTER AUTHORIZATION.


ServiceBroker - БД для обмена сообщениями
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39875922
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Попов,

Вы можете инициализировать брокер через ALTER DATABASE SET NEW_BROKER, но надо понимать, что вы удалите все переговоры conversation и маршруты, если такие были определены. Смотрите справку по этой команде.

Утилита ssbdiagnose также в помощь.

Вы восстанавливали резервную копию базы на другом сервере?
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39876309
Владислав КолосовВы восстанавливали резервную копию базы на другом сервере?
Нет, настраиваю общение с нуля. Настроил на одном сервере - все ОК. Перешел к следующему и все поломал.
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39876823
"Главный" сервер base1.
Есть сервер srvshop40 и есть srvshop2.
Первым был настроен srvshop40 и обмен между ним и base1 работает.
Далее настраиваю по аналогии srvshop2.

Думаю, что нашел ошибку, но не понял, как ее исправить:

выполняю код отправки (порезанный, см. суть):

Код: sql
1.
2.
3.
4.
5.
6.
7.
    BEGIN DIALOG CONVERSATION @conversation_handle
        FROM SERVICE [base1_ServiceOut]
        TO SERVICE 'srvshop2_ServiceIn','87F90E7A-EAED-4079-B5DD-E0711A8AB743'
        ON CONTRACT [ExtraCharge_contract]
        WITH ENCRYPTION = OFF;

    SEND ON CONVERSATION @conversation_handle MESSAGE TYPE [ExtraCharge_msg] (@XmlData);



и поймал момент соединения (см. картинку).
Почему то используется пользователь srvshop40_user, а не srvshop2_user.
Где я неправ?
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39876980
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Попов,

вы ID брокера жестко задаете, в этом проблема.
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39877026
ShIgor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов,

все правильно с брокером, так и надо если маршрутов много, а сервис на них один и тот же.
здесь проблема в пользователях. у меня центральный лезет на периферию одним и тем же пользователем, а вот обратно они создают диалоги своим собственным.

Андрей Попов,
у вас безопасность на основе сертификатов?
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39877028
Владислав КолосовАндрей Попов,

вы ID брокера жестко задаете, в этом проблема.
Нет. В примере в этом трэде не было указания ID, и я изначально также сделал. Не работает. Потом добавил, безрезультатно.

Я концептуально не понимаю связь между пользователем, которому разрешено подключение к endpoint и пользователем сервиса.
На главном base1 сервере создана одна точка endpoint и два пользователя srvshop40_user и srvshop2_user с сертификатами из файлов соответствующих серверов. Юзерам дан доступ к точке.
Отправка идет через сервисы и там уже два пользователя srvshop40_service_owner и srvshop2_service_owner.
Есть маршруты и remote binding для xxx_service_owner.
Как скуль должен понять, что при использовании сервиса для отправки для srvshop2 нужно использовать сертификат пользователя srvshop2_user?
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39877052
ShIgor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Попов,

немного ушли в сторону.

предположим, что у вас в центре уже есть 'сертификат центра' и endpoint с аутентификацией по 'сертификату центра'

на периферийной точке
создать 'сертификат точки'
создать endpoint с аутентификацией по 'сертификату точки'
создать логин (которым будет цеплятся центр, он един на всех точках)
создать пользователя для логина
создать сертификат для пользователя из 'сертификата центра'
предоставить права на соединение с endpoint логину

на центре
создать 'логин точки' (для каждой точки свой)
создать 'пользователя точки' для 'логина точки'
создать 'сертификат для пользователя точки' из 'сертификата точки'
предоставить права на соединение с endpoint 'логину точки'

если все сделано так, то никаких сервис биндинг в этом случае не нужно.
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39877070
ShIgor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я обещал выложить процедуру как я создаю транспорт на основе сертификатов и обмениваюсь ими без файлов.
выкладываю как есть, без всяких комментов и правок. это рабочий код, которым пользуюсь уже 2 года раз 10 в месяц.
сбоев еще не было.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
create procedure [sbm].[usp_create_transport](@host nvarchar(256) = null, @ref_tt_str nvarchar(32) = null)
as
set nocount on

  declare @instance nvarchar(256) = '\sqlexpress'
  declare @db_name nvarchar(256) = 'db_sup_kkm_stage'

  if @host is null and @ref_tt_str is null return

  if @ref_tt_str is null and @host is not null
    select @ref_tt_str = ref_tt_str, @instance = isnull([ИнстансSQL], @instance), @db_name = isnull([ИмяБД], @db_name) from sbm.uv_dimTT where [СерверХост] = @host
  else if @ref_tt_str is not null and @host is null
	select @host = [СерверХост], @instance = isnull([ИнстансSQL], @instance), @db_name = isnull([ИмяБД], @db_name) from sbm.uv_dimtt where ref_tt_str = @ref_tt_str

  declare @packedhostname nvarchar(256) 
  set @packedhostname = sbm.ufn_get_packedHostName(@host)
  
  declare @pLinkedServer nvarchar(256) = 'supkkm_' + @packedhostname;
  declare @pServerName nvarchar(256) = @host + @instance
  exec sbm.usp_createlinkedserver @pLinkedServer, @pServerName, N'master'

  declare @sql_str nvarchar(max)
  
  declare @target_cert varchar(max)
  set @sql_str = 'select @target_cert = tcert
    from openrowset(
      ''SQLOLEDB'', ''Server=SRV-MASTER-SBM;Database=master;Uid=xxxxxx;Pwd=xxxxxx;Timeout=10;Network Library=dbmssocn;'',
      ''select convert(varchar(max), certencoded(cert_id(''''cer_sup_kkm_target_30171001'''')), 1) tcert'')
  '
  exec sp_executesql @stmt = @sql_str, @params = N'@target_cert varchar(max) output', @target_cert = @target_cert output

  set @sql_str = 'exec (''' + 
    replace('use [master];
	if not exists (select * from sys.symmetric_keys where name = ''##ms_databasemasterkey##'')
	  create master key encryption by password = ''--<<Очень-Страшно-Сложный-Мастер-Пароль-Чтоб-Никто-Не-Догадался>>--'';
	create certificate cer_@@packedhostname@@ with subject = ''cer_@@packedhostname@@ certificate'', start_date = ''20171001'', expiry_date = ''30171001'';
	create endpoint ep_sup_kkm state = started as tcp ( listener_port = 4022 ) for service_broker (authentication = certificate cer_@@packedhostname@@, encryption = disabled);
	create login lg_sup_kkm with password = ''--<<Очень-Страшно-Сложный-Совсем-Не-Мастер-Пароль-Чтоб-Никто-Не-Догадался>>--'';
	create user usr_sup_kkm for login lg_sup_kkm;
	create certificate cer_sup_kkm_target_30171001 authorization usr_sup_kkm from binary = @@target_cert@@;
	grant connect on endpoint::ep_sup_kkm to lg_sup_kkm;'
	, '''', '''''') +
  ''') AT [@@pLinkedServer@@]'

  set @sql_str = replace(@sql_str, '@@ref_tt_str@@', @ref_tt_str)
  set @sql_str = replace(@sql_str, '@@packedhostname@@', @packedhostname)
  set @sql_str = replace(@sql_str, '@@target_cert@@', @target_cert)
  set @sql_str = replace(@sql_str, '@@pLinkedServer@@', @pLinkedServer)

  exec sp_executesql @sql_str  -- execute at remote
  
  declare @remote_cert varchar(max)
  set @sql_str = 'select @remote_cert = rcert
    from openrowset(
      ''SQLOLEDB'',  ''Server=' + @host + @instance + ';Database=master;Uid=xxxxxx;Pwd=xxxxxx;Timeout=10;Network Library=dbmssocn;'',
      ''select convert(varchar(max), certencoded(cert_id(''''cer_' + @packedhostname +''''')), 1) rcert'')
  '
  exec sp_executesql @stmt = @sql_str, @params = N'@remote_cert varchar(max) output', @remote_cert = @remote_cert output

  set @sql_str = 'exec (''' + 
    replace('use [master];
	create login lg_@@packedhostname@@ with password = ''--<<Очень-Страшно-Сложный-Совсем-Не-Мастер-Пароль-Чтоб-Никто-Не-Догадался>>--'';
	create user usr_@@packedhostname@@ for login lg_@@packedhostname@@;
	create certificate cer_@@packedhostname@@ authorization usr_@@packedhostname@@ from binary = @@remote_cert@@;
    grant connect on endpoint::ep_sup_kkm to lg_@@packedhostname@@;' 
	, '''', '''''') +
  ''')'
 
  set @sql_str = replace(@sql_str, '@@host@@', @host)
  set @sql_str = replace(@sql_str, '@@db_name@@', @db_name)
  set @sql_str = replace(@sql_str, '@@ref_tt_str@@', @ref_tt_str)
  set @sql_str = replace(@sql_str, '@@packedhostname@@', @packedhostname)
  set @sql_str = replace(@sql_str, '@@remote_cert@@', @remote_cert)
  set @sql_str = replace(@sql_str, '@@pLinkedServer@@', @pLinkedServer)

  exec sp_executesql @sql_str -- execute at local
  
  exec sbm.usp_droplinkedserver @pLinkedServer

go
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39877148
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Попови теперь вообще все поломалось, в профайлере пишет

An exception occurred while enqueueing a message in the target queue. Error: 33009, State: 2. The database owner SID recorded in the master database differs from the database owner SID recorded in database 'ServiceBroker'. You should correct this situation by resetting the owner of database 'ServiceBroker' using the ALTER AUTHORIZATION statement.

Идентификатор безопасности владельца базы данных, записанный в базе данных master, отличается от идентификатора безопасности владельца базы данных, записанного в базе данных "ServiceBroker". Устраните это различие, сбросив владельца базы данных "ServiceBroker" с помощью инструкции ALTER AUTHORIZATION.


ServiceBroker - БД для обмена сообщениями

Добрый день,

судя по ошибке у вас база с именем 'ServiceBroker' была восстановлена из бэкапа, при этом владелец базы отличается от того который был на другом сервере, для начала Вам необходимо устранить данную проблему.
сравните
Код: sql
1.
2.
select owner_sid from sys.databases where name = 'ServiceBroker'
select sid from sys.server_principals where name = 'имя логина владельца БД'


скорее всего они будут разные, если так то выполните

Код: sql
1.
alter authorization on database::[serivceBroker] to <some_new_owner_login>;
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39995754
Nemoxur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет!
Подскажите, какие у кого стратегии работы с нежелательными сообщениями, когда после 5 попыток очередь останавливается?
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39995776
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nemoxur,

предусмотреть обработку кода в ситуации когда у вас происходит откат транзакции.

адд: дополнительно лично у меня еще для подстраховки xEvent сессия настроена, для сбора событий отключения очереди в которую переодически ломится задание делающее рассылку уведомлений какая очередь вдруг каким то чудом отключилась.
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39995777
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nemoxur,

найти ошибку, исправить, принять превентивные меры.
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39995888
Nemoxur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff,
Согласен)
если не сложно, можно пример такого xEvent?

Владислав Колосов,
Согласен)
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39995889
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nemoxur,

дополнительно можно настроить уведомление event notification об отключении очереди, существует такое событие.
...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39996328
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nemoxur
felix_ff,
Согласен)
если не сложно, можно пример такого xEvent?

Владислав Колосов,
Согласен)


Код: sql
1.
2.
3.
4.
create event session [queue_disabled] on server
add event sqlserver.broker_queue_disabled
add target package0.ring_buffer
with (max_memory=4096 KB, EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENTLOSS, MAX_DISPATCH_LATENCY=30 SECONDS, MAX_EVENT_SIZE=0 KB, MEMORY_PARTITION_MODE=NONE, TRACK_CAUSALITY=OFF, STARTUP_STATE=ON);



я вам полный код процедуры приводить не буду, там достаточно много завязано на бизнес логику процедуры которая работает под шедулером.

по сути Вам правильно подсказали - можно обойтись настройкой event notification:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
use [msdb];
create table [queue_disable_log] (
               [id] int identity(1,1),
               [date] datetime default (getdate()),
               [data] xml
         )
create queue [dbo].[queue_disabled];
create service [queue_disabled] on queue [dbo].[queue_disabled] ([http://schemas.microsoft.com/SQL/Notifications/PostEventNotification]);
go

create or alter procedure [dbo].[asp_queue_disabled]
as
declare @ch uniqueidentifier, @mt int, @mb xml;
while 1 = 1 begin
     begin tran;

     waitfor (receive top(1) @ch = [conversation_handle], @mt = [message_type_id], @mb = try_cast([message_body] as xml) from [dbo].[queue_disabled]), timeout 1000;

     if @@rowcount = 0 begin
         rollback transaction;
         break;
     end;

     if @mt = 4
         --exec sp_send_dbmail ....
         insert into [dbo].[queue_disable_log] ([data]) values (@mb);
         
     commit tran;
end;
go
alter queue [dbo].[queue_disabled] with activation (status = on, procedure_name = [dbo].[asp_queue_disabled], execute as owner, max_queue_readers=1)



процедура подписки мониторинга
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
create or alter procedure [dbo].[monitor_queue]
      @queue_name sysname,
      @is_monitor bit
as
if @@options & 512 = 0 set nocount on;

declare
       @guid sysname,
       @db sysname,
       @sch sysname,
       @sql nvarchar(max) = N'';

set @db = parsename(@queue_name, 3);
set @sch = parsename(@queue_name, 2);
set @queue_name = parsename(@queue_name, 1);

select @guid = convert(sysname, [service_broker_guid], 1) from sys.databases where [database_id] = db_id();

if @db is null or @sch is null throw 50000, 'queue name is not valid. type name like third-party named object. exmaple: db.dbo.queue1', 16;

if object_id(concat(@db, '.', @sch, '.', @queue_name), 'SQ') is null throw 50000, 'object not found', 16;

if @is_monitor = 1
    set @sql = N'use {db}; create event notification [queue_disabled] on queue {queue} for BROKER_QUEUE_DISABLED to service N''queue_disabled'', ''{guid}'';';
else
    set @sql = N'use {db}; drop event notification [queue_disabled] on queue {queue};'

set @sql = replace(@sql, N'{db}', @db);
set @sql = replace(@sql, N'{guid}', @guid);
set @sql = replace(@sql, N'{queue}', concat(@sch, '.', @queue_name));

begin try
     if @sql is null throw 50000, 'missing sql statement', 16;
     exec (@sql);
     print @sql;
end try
begin catch
     select @db as [db], @sch as [schema], @queue_name AS [queue_name], ERROR_MESSAGE() AS [error_message], ERROR_NUMBER() AS [error_number];
end catch;
go




подписка очередей на мониторинг
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
declare @queue_name sysname;
declare cur cursor local fast_forward for
       select concat(db_name(), N'.', schema_name([schema_id]), N'.', [name]) from sys.objects where [type] = N'SQ' and [name] not in (N'QueryNotificationErrorsQueue', N'EventNotificationErrorsQueue', N'ServiceBrokerQueue');
open cur;
while 1 = 1 begin
     fetch next from cur into @queue_name;
     if @@FETCH_STATUS <> 0 break;
     exec [msdb].[dbo].[monitor_queue] @queue_name, 1;
end;
close cur;
deallocate cur;


...
Рейтинг: 0 / 0
Как обнаружить ошибку при работе service broker?
    #39996785
Nemoxur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff,
Спасибо!)
...
Рейтинг: 0 / 0
21 сообщений из 71, страница 3 из 3
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как обнаружить ошибку при работе service broker?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]