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

Откуда:
Сообщений: 809
Пытаюсь по шагам воспроизвести пример из MSDN по взаимодействию компонентов service broker на разных серверах:
https://technet.microsoft.com/ru-ru/library/bb839483(v=sql.105).aspx

База [InstTargetDB] расположена на экземпляре с установленным 2014SP2CU8, [InstInitiatorDB] - на экземпляре 2016SP1CU7 (обе версии - стандарт)

После воспроизведения всех примеров без ошибок, на шаге Занятие 6. Получение ответа и завершение диалога https://technet.microsoft.com/ru-ru/library/bb839494(v=sql.105).aspx - получаю:
(0 rows affected)
Msg 8418, Level 16, State 1, Line 16
The conversation handle is missing. Specify a conversation handle.

(1 row affected)

Сервера - в одном домене (физически две разные виртуалки на одном хосте).

Подскажите, как вообще искать неисправности в этом случае? Где у этого "розетка", в которую нужно заглянуть в первую очередь?
5 фев 18, 11:10    [21166041]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1341
uaggster,

если получили такую ошибку, то у вас оператор receive вернул null ссылку на диалог.

там пример написан без проверки: что есть плохо
WAITFOR
( RECEIVE TOP(1)
    @RecvReplyDlgHandle = conversation_handle,
    @RecvReplyMsg = message_body
  FROM InstInitiatorQueue
), TIMEOUT 1000;


вы ждете секунду получение сообщения из очереди и потом пытаетесь закрыть диалог, но может получиться так что сообщений в очереди не будет, receive вернет null в @RecvReplyDlgHandle и получите данную ошибку


пишите так:
WAITFOR
( RECEIVE TOP(1)
    @RecvReplyDlgHandle = conversation_handle,
    @RecvReplyMsg = message_body
  FROM InstInitiatorQueue
), TIMEOUT 1000;
if @@ROWCOUNT = 1
    end conversation @RecvReplyDlgHandle
else begin
     throw 50000, 'Ошибка! в очереди нет сообщений для обработки', 1
     --какие то действия при данной ситуации
end


в первую очередь смотрите статусы в sys.conversation_endpoints, если там ничего подозрительного смотрите наличие сообщений в очередях получателя/отправителя, если и там нет признаков происков макаронного монстра идите в sys.transmission_queue
5 фев 18, 12:49    [21166528]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
uaggster
Member

Откуда:
Сообщений: 809
felix_ff
в первую очередь смотрите статусы в sys.conversation_endpoints, если там ничего подозрительного смотрите наличие сообщений в очередях получателя/отправителя, если и там нет признаков происков макаронного монстра идите в sys.transmission_queue

Подозрительное, думаю, есть (см).
Вот только что с этим делать?

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

Откуда:
Сообщений: 809
Вот так, думаю, будет нагляднее:

К сообщению приложен файл. Размер - 124Kb
16 фев 18, 11:45    [21196318]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
uaggster
Member

Откуда:
Сообщений: 809


К сообщению приложен файл. Размер - 83Kb
16 фев 18, 11:45    [21196319]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1341
uaggster,

uaggster,

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

судя по вашим данным у вас два открытых исходящих диалога, но если оно с состоянии conversing, то это значит что у вас отработало открытие диалога со стороны инициатора и отправка сообщения в принимающую сторону, но до сих пор целевая служба ничего не ответила в ответ. вот оно у вас и висит в ожидании.

это если "беглым" вгзлядом.
16 фев 18, 12:20    [21196435]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1341
в sys.transmission_queue у вас что сейчас?
16 фев 18, 12:22    [21196440]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
uaggster
Member

Откуда:
Сообщений: 809
felix_ff
в sys.transmission_queue у вас что сейчас?

А вот то, что на втором скрине.
Я транспонировал потому что иначе картинка очень мелкая.

На целевом сервере - в очередях пусто.

Т.е., сообщение туда, видимо, не доставлено.
Но по какой причине? Где затык то?
16 фев 18, 12:54    [21196563]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1341
uaggster,

а так второй скрин это содержимое transmission_queue? ну так прочитайте что там в message_body

select coalesce(try_convert(xml, [message_body]), try_convert(varchar(max), [message_body]), '') from sys.transmission_queue
16 фев 18, 14:22    [21196943]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
uaggster
Member

Откуда:
Сообщений: 809
felix_ff
uaggster,

а так второй скрин это содержимое transmission_queue? ну так прочитайте что там в message_body

select coalesce(try_convert(xml, [message_body]), try_convert(varchar(max), [message_body]), '') from sys.transmission_queue

Ээээ... там
<test>test</test>
<test>test</test>
Ровно то, что я пытаюсь передать на второй сервер.
Но на второй сервер - оно не передается!
16 фев 18, 14:31    [21196978]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1341
uaggster,

проверяйте включен ли брокер в базе msdb на сервере источнике, включен ли брокер на базе сервера получателя, не отключена ли очередь целевой службы
16 фев 18, 14:38    [21197013]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1341
а еще вам необходимо проверить маршруты, и привязки удаленных служб
16 фев 18, 14:40    [21197021]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1341
а и самое главное: а конечная точка то включена вообще? :D

покажите результат
select * from sys.routes
select * from sys.remote_service_bindings
select * from sys.service_broker_endpoints
16 фев 18, 14:44    [21197048]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
uaggster
Member

Откуда:
Сообщений: 809
felix_ff
uaggster,

проверяйте включен ли брокер в базе msdb на сервере источнике

Да, включен

felix_ff
, включен ли брокер на базе сервера получателя,

Да, включен

felix_ff
не отключена ли очередь целевой службы

А как это проверить?


Я пытаюсь воспроизвести пример:
+

На первом сервере:
Create database databaseA
Go
Alter database databaseA set Enable_Broker
Go

Use databaseA
GO
Create Message Type SenderMessageType validation=NONE 
GO
Create Message Type ReceiverMessageType validation=NONE
GO

Create Contract SampleContract
(
  SenderMessageType  SENT BY INITIATOR,
  ReceiverMessageType   SENT BY TARGET
)

Create Queue InitiatorQueue
 WITH status = ON
 
 Create Service SenderService ON QUEUE InitiatorQueue  (SampleContract) 

 Create Route RouteA
WITH
  SERVICE_NAME = 'ReceiverService',
  BROKER_INSTANCE = '7CCCCBB4-3F03-44F6-B94D-AC6282B4DFAD',
  ADDRESS = 'TCP://10.30.10.53:4022'
GO

select service_broker_guid
 from sys.databases
 where name = 'DatabaseA'

Use master
Go
--1. Create a master key for master database.
Create Master Key Encryption BY Password = '1234qwer@'
--Go
/*2.Create certificate and End Point that support 
     certificate based authentication 
*/
Create Certificate EndPointCertificateA
WITH Subject = 'A.Server.Local',
    START_DATE = '01/01/2017',
    EXPIRY_DATE = '01/01/2020'
ACTIVE FOR BEGIN_DIALOG = ON;
GO

CREATE ENDPOINT ServiceBrokerEndPoint
   STATE=STARTED
   AS TCP (LISTENER_PORT = 4022)
   FOR SERVICE_BROKER 
   (
     AUTHENTICATION = CERTIFICATE EndPointCertificateA,
     ENCRYPTION = SUPPORTED
   );

BACKUP CERTIFICATE EndPointCertificateA 
 TO FILE = 
   'C:\backup\EndPointCertificateA.cer';
GO

Create Certificate EndPointCertificateB
 From FILE = 
 'C:\Backup\EndPointCertificateB.cer';
GO


CREATE LOGIN sbLogin
 FROM CERTIFICATE EndPointCertificateB;
GO

GRANT CONNECT ON ENDPOINT::ServiceBrokerEndPoint To sbLogin
GO

Use DatabaseA
GO
Create Master Key Encryption BY
Password = '1234qwer@'
Go

Create Certificate UserCertificateA
 WITH Subject = 'A.Server.Local',
    START_DATE = '01/01/2018',
    EXPIRY_DATE = '01/01/2020'
ACTIVE FOR BEGIN_DIALOG = ON;
GO

BACKUP CERTIFICATE UserCertificateA TO FILE=
'C:\backup\UserCertificateA.cer';
GO

Create User UserB WITHOUT LOGIN
GO


CREATE CERTIFICATE UserCertificateB
 AUTHORIZATION UserB
 FROM FILE = 'C:\backup\UserCertificateB.cer';
GO

GRANT CONNECT TO UserB;

GRANT SEND ON SERVICE::SenderService To UserB;
GO

CREATE REMOTE SERVICE BINDING ServiceBindingB
 TO SERVICE 'ReceiverService'
 WITH USER = UserB


 /**********Begin a Dialog and Send a Message******************/
Declare @ConversationHandle uniqueidentifier

Begin Transaction
Begin Dialog @ConversationHandle
 From Service SenderService
 To Service 'ReceiverService'
 On Contract SampleContract
 WITH Encryption=off;
SEND 
      ON CONVERSATION @ConversationHandle
      Message Type SenderMessageType
  ('<test>test</test>')
Commit


На втором сервере:
Create database databaseB
Go
Alter database databaseB set Enable_Broker
Go

Use databaseB
GO
Create Message Type SenderMessageType validation=NONE
Create Message Type ReceiverMessageType validation=NONE

Create Contract SampleContract
(
  SenderMessageType  SENT BY INITIATOR,
  ReceiverMessageType   SENT BY TARGET
)

Create Queue TargetQueue WITH status= ON

Create Service ReceiverService ON QUEUE TargetQueue (SampleContract)

Create Route RouteB
WITH
  SERVICE_NAME = 'SenderService',
  BROKER_INSTANCE='886B2333-B33F-4A07-A16C-82DD193CAD57',
 ADDRESS = 'TCP://10.30.10.205:4022'
GO

Use master
Go
 
--1. Create a master key for master database.
Create Master Key Encryption BY Password = '1234qwer@';
Go
--2.Create certificate and End Point that support certificate based authentication.
Create Certificate EndPointCertificateB
WITH Subject = 'B.Server.Local',
       START_DATE = '01/01/2018',
       EXPIRY_DATE = '01/01/2020'
ACTIVE FOR BEGIN_DIALOG = ON;
GO
CREATE ENDPOINT ServiceBrokerEndPoint
      STATE=STARTED
      AS TCP (LISTENER_PORT = 4022)
      FOR SERVICE_BROKER
      ( 
         AUTHENTICATION = CERTIFICATE EndPointCertificateB,
         ENCRYPTION = SUPPORTED
      );

BACKUP CERTIFICATE EndPointCertificateB TO FILE=
  'C:\Backup\EndPointCertificateB.cer';
GO

Create Certificate EndPointCertificateA
 From FILE = 
 'C:\backup\EndPointCertificateA.cer';
GO

CREATE LOGIN sbLogin
 FROM CERTIFICATE EndPointCertificateA;
GO

GRANT CONNECT ON ENDPOINT::ServiceBrokerEndPoint To sbLogin
GO


Use DatabaseB
GO
Create Master Key Encryption BY
Password = '1234qwer@';
Go

Create Certificate UserCertificateB
 WITH Subject = 'B.Server.Local',
    START_DATE = '01/01/2018',
    EXPIRY_DATE = '01/01/2020'
ACTIVE FOR BEGIN_DIALOG = ON;
GO

BACKUP CERTIFICATE UserCertificateB TO
FILE='C:\backup\UserCertificateB.cer';
GO

Create User UserA WITHOUT LOGIN
GO

CREATE CERTIFICATE UserCertificateA
 AUTHORIZATION UserA
FROM FILE = 'C:\backup\UserCertificateA.cer';
GO

GRANT CONNECT TO UserA;

GRANT SEND ON SERVICE::ReceiverService To UserA;
GO

CREATE REMOTE SERVICE BINDING ServiceBindingA
 TO SERVICE 'SenderService'
 WITH USER = UserA

 select cast(message_body as xml)  from TargetQueue

 /*****Receive the Message and send a message to the ender**********/

Declare @ConversationHandle as uniqueidentifier
Declare @MessageBody as nvarchar(max)
Declare @MessageType as sysname

Begin Transaction
Print 'Started Receiving ';

RECEIVE top (1)
      @MessageType = message_type_name,
      @ConversationHandle = conversation_handle,
    @MessageBody = message_body
FROM TargetQueue;

if @MessageType = 'SenderMessageType'
      Begin
            SEND 
                  ON CONVERSATION @ConversationHandle
                  Message Type ReceiverMessageType
                  ('Message is received')
            END Conversation @ConversationHandle
      END

Commit


Это уже второй пример.
Отсюда: http://www.sqlservercentral.com/articles/Service Broker/2797/
Аналогичный из учебника MSDN - тоже не работает.
Пример с пересылкой сообщений между базами на одном сервере - воспроизводится без проблем.

Как обнаружить проблему? Где у него логгируется сообщения об ошибках?
16 фев 18, 14:49    [21197075]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
uaggster
Member

Откуда:
Сообщений: 809
На сервере А, databaseA:

К сообщению приложен файл. Размер - 98Kb
16 фев 18, 14:53    [21197096]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
uaggster
Member

Откуда:
Сообщений: 809
На сервере B, databaseB:

К сообщению приложен файл. Размер - 89Kb
16 фев 18, 14:54    [21197100]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 887
не понятно , есть результат:
select *
from sys.transmission_queue (nolock)


Там будет статус в поле transmission_status

Второе логи sql смотрели, есть ли там ошибки , права на коннект к endpoint-ам дали?
16 фев 18, 15:13    [21197196]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
uaggster
Member

Откуда:
Сообщений: 809
Вот что в статусе:
An error occurred while receiving data: '10054(An existing connection was forcibly closed by the remote host.)'.
16 фев 18, 15:32    [21197269]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
uaggster
Member

Откуда:
Сообщений: 809
Из ошибок в логе только: Implied authentication manager initialization failed. Implied authentication will be disabled.
16 фев 18, 15:39    [21197302]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
uaggster
Member

Откуда:
Сообщений: 809
Slava_Nik
Второе логи sql смотрели, есть ли там ошибки , права на коннект к endpoint-ам дали?

Вроде бы да, в скрипте (см. выше) есть вот что, например:
GRANT CONNECT ON ENDPOINT::ServiceBrokerEndPoint To sbLogin
GO
16 фев 18, 15:41    [21197305]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 887
uaggster,
у вас ошибка из-за прав.
на второй вопрос не ответили, права к endpoint-у дали?

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/e8346a87-4225-4468-a143-66682f58973c/an-error-occurred-while-receiving-data-10054an-existing-connection-was-forcibly-closed-by-the?forum=sqlservicebroker
16 фев 18, 15:42    [21197307]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1341
uaggster,

безопасность транспорта значит кривая,

почему у вас в одном случае шифрование RC4 а для другой точки AES?
16 фев 18, 15:44    [21197322]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
uaggster
Member

Откуда:
Сообщений: 809
felix_ff
uaggster,

безопасность транспорта значит кривая,

почему у вас в одном случае шифрование RC4 а для другой точки AES?

Не знаю. Видимо, что-то где то по умолчанию.
Инициирующий сервер:
Microsoft SQL Server 2014 (SP2-CU8) (KB4037356) - 12.0.5557.0 (X64) Oct 3 2017 14:56:10 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)
Целевой сервер:
Microsoft SQL Server 2016 (SP1-CU6) (KB4037354) - 13.0.4457.0 (X64)
Nov 8 2017 17:32:23
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows Server 2012 R2 Standard 6.3 <X64> (Build 9600: ) (Hypervisor)

А как поправить различие в шифровании?

Кстати, интересно, а сейчас в статусе сообщений - ПУСТО!
16 фев 18, 15:53    [21197356]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
uaggster
Member

Откуда:
Сообщений: 809
Slava_Nik
uaggster,
у вас ошибка из-за прав.
на второй вопрос не ответили, права к endpoint-у дали?

Да говорю ж, вроде как дал:

GRANT CONNECT ON ENDPOINT::ServiceBrokerEndPoint To sbLogin
GO

И на том, и не другом серверах.
16 фев 18, 15:55    [21197366]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить ошибку при работе service broker?  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1341
uaggster,

ну для начала сделайте

на сервере целевой службы

alter endpoint [ServiceBrokerEndPoint]
state = STOPPED;

alter endpoint [ServiceBrokerEndPoint]
FOR SERVICE_BROKER (  
    AUTHENTICATION = CERTIFICATE EndPointCertificateA
   , ENCRYPTION = SUPPORTED, ALGIRITHM RC4;

alter endpoint [ServiceBrokerEndPoint]
state = STARTED;
16 фев 18, 16:13    [21197434]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить