Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3]      все
 Re: Как обнаружить ошибку при работе service broker?  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1364
На этом закругляюсь, сразу прощу прощения я чето не очень догнал как файлы картинок-вложений запихнуть в спойлеры.

Сергей Гавриленко
если можно Вас попросить подредактировать мои посты что бы картинки не убили у кого-нибудь траффик на телефоне.
18 фев 18, 22:26    [21200390]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
uaggster
Member

Откуда:
Сообщений: 826
felix_ff, огромное спасибо.
Добавил в закладки, буду пытаться скурить.

На первый взгляд - самое дельное и подробное руководство из всех, что я видел.
Спасибо!
19 фев 18, 07:47    [21200661]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
ShIgor
Member

Откуда: Нижний Новгород
Сообщений: 2333
felix_ff,

супер! жаль что я это прошел на год раньше через собственные спотыкания.
чуть позже дополню как у меня происходит обмен сертификатами между серверами без ручного перекладывания файлов, да и вообще без файлов.
13 дек 18, 11:41    [21762669]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
Андрей Попов
Member

Откуда:
Сообщений: 5
felix_ff, спасибо за ответы в теме, на сегодня вы мой бог )

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

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

Спасибо
14 окт 19, 09:40    [21993419]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
Андрей Попов
Member

Откуда:
Сообщений: 5
и теперь вообще все поломалось, в профайлере пишет

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 - БД для обмена сообщениями
14 окт 19, 10:17    [21993451]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7748
Андрей Попов,

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

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

Вы восстанавливали резервную копию базы на другом сервере?
14 окт 19, 12:45    [21993620]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
Андрей Попов
Member

Откуда:
Сообщений: 5
Владислав Колосов
Вы восстанавливали резервную копию базы на другом сервере?

Нет, настраиваю общение с нуля. Настроил на одном сервере - все ОК. Перешел к следующему и все поломал.
15 окт 19, 06:59    [21994239]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
Андрей Попов
Member

Откуда:
Сообщений: 5
"Главный" сервер base1.
Есть сервер srvshop40 и есть srvshop2.
Первым был настроен srvshop40 и обмен между ним и base1 работает.
Далее настраиваю по аналогии srvshop2.

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

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

    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.
Где я неправ?

К сообщению приложен файл. Размер - 23Kb
16 окт 19, 03:33    [21995059]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7748
Андрей Попов,

вы ID брокера жестко задаете, в этом проблема.
16 окт 19, 11:58    [21995322]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
ShIgor
Member

Откуда: Нижний Новгород
Сообщений: 2333
Владислав Колосов,

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

Андрей Попов,
у вас безопасность на основе сертификатов?
16 окт 19, 13:16    [21995401]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
Андрей Попов
Member

Откуда:
Сообщений: 5
Владислав Колосов
Андрей Попов,

вы ID брокера жестко задаете, в этом проблема.

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

Я концептуально не понимаю связь между пользователем, которому разрешено подключение к endpoint и пользователем сервиса.
На главном base1 сервере создана одна точка endpoint и два пользователя srvshop40_user и srvshop2_user с сертификатами из файлов соответствующих серверов. Юзерам дан доступ к точке.
Отправка идет через сервисы и там уже два пользователя srvshop40_service_owner и srvshop2_service_owner.
Есть маршруты и remote binding для xxx_service_owner.
Как скуль должен понять, что при использовании сервиса для отправки для srvshop2 нужно использовать сертификат пользователя srvshop2_user?
16 окт 19, 13:21    [21995405]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
ShIgor
Member

Откуда: Нижний Новгород
Сообщений: 2333
Андрей Попов,

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

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

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

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

если все сделано так, то никаких сервис биндинг в этом случае не нужно.
16 окт 19, 13:47    [21995439]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
ShIgor
Member

Откуда: Нижний Новгород
Сообщений: 2333
я обещал выложить процедуру как я создаю транспорт на основе сертификатов и обмениваюсь ими без файлов.
выкладываю как есть, без всяких комментов и правок. это рабочий код, которым пользуюсь уже 2 года раз 10 в месяц.
сбоев еще не было.

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
16 окт 19, 14:14    [21995476]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1364
Андрей Попов
и теперь вообще все поломалось, в профайлере пишет

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' была восстановлена из бэкапа, при этом владелец базы отличается от того который был на другом сервере, для начала Вам необходимо устранить данную проблему.
сравните
select owner_sid from sys.databases where name = 'ServiceBroker'
select sid from sys.server_principals where name = 'имя логина владельца БД'

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

alter authorization on database::[serivceBroker] to <some_new_owner_login>;
16 окт 19, 15:48    [21995662]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3]      все
Все форумы / Microsoft SQL Server Ответить