|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Пытаюсь по шагам воспроизвести пример из 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) Сервера - в одном домене (физически две разные виртуалки на одном хосте). Подскажите, как вообще искать неисправности в этом случае? Где у этого "розетка", в которую нужно заглянуть в первую очередь? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2018, 11:10 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
uaggster, если получили такую ошибку, то у вас оператор receive вернул null ссылку на диалог. там пример написан без проверки: что есть плохо Код: sql 1. 2. 3. 4. 5. 6.
вы ждете секунду получение сообщения из очереди и потом пытаетесь закрыть диалог, но может получиться так что сообщений в очереди не будет, receive вернет null в @RecvReplyDlgHandle и получите данную ошибку пишите так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
в первую очередь смотрите статусы в sys.conversation_endpoints, если там ничего подозрительного смотрите наличие сообщений в очередях получателя/отправителя, если и там нет признаков происков макаронного монстра идите в sys.transmission_queue ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2018, 12:49 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
felix_ffв первую очередь смотрите статусы в sys.conversation_endpoints, если там ничего подозрительного смотрите наличие сообщений в очередях получателя/отправителя, если и там нет признаков происков макаронного монстра идите в sys.transmission_queue Подозрительное, думаю, есть (см). Вот только что с этим делать? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2018, 11:39 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Вот так, думаю, будет нагляднее: ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2018, 11:45 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2018, 11:45 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
uaggster, uaggster, если честно от ваших развернутых столбцов глаза режет, сделали бы просто скрин запроса в ssms с результатом. судя по вашим данным у вас два открытых исходящих диалога, но если оно с состоянии conversing, то это значит что у вас отработало открытие диалога со стороны инициатора и отправка сообщения в принимающую сторону, но до сих пор целевая служба ничего не ответила в ответ. вот оно у вас и висит в ожидании. это если "беглым" вгзлядом. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2018, 12:20 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
в sys.transmission_queue у вас что сейчас? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2018, 12:22 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
felix_ffв sys.transmission_queue у вас что сейчас? А вот то, что на втором скрине. Я транспонировал потому что иначе картинка очень мелкая. На целевом сервере - в очередях пусто. Т.е., сообщение туда, видимо, не доставлено. Но по какой причине? Где затык то? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2018, 12:54 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
uaggster, а так второй скрин это содержимое transmission_queue? ну так прочитайте что там в message_body Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2018, 14:22 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
felix_ffuaggster, а так второй скрин это содержимое transmission_queue? ну так прочитайте что там в message_body Код: sql 1.
Ээээ... там <test>test</test> <test>test</test> Ровно то, что я пытаюсь передать на второй сервер. Но на второй сервер - оно не передается! ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2018, 14:31 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
uaggster, проверяйте включен ли брокер в базе msdb на сервере источнике, включен ли брокер на базе сервера получателя, не отключена ли очередь целевой службы ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2018, 14:38 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
а еще вам необходимо проверить маршруты, и привязки удаленных служб ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2018, 14:40 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
а и самое главное: а конечная точка то включена вообще? :D покажите результат Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2018, 14:44 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
felix_ffuaggster, проверяйте включен ли брокер в базе msdb на сервере источнике Да, включен felix_ff, включен ли брокер на базе сервера получателя, Да, включен felix_ff не отключена ли очередь целевой службы А как это проверить? Я пытаюсь воспроизвести пример: На первом сервере: Код: 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. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126.
На втором сервере: Код: 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. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127.
Это уже второй пример. Отсюда: http://www.sqlservercentral.com/articles/Service Broker/2797/ Аналогичный из учебника MSDN - тоже не работает. Пример с пересылкой сообщений между базами на одном сервере - воспроизводится без проблем. Как обнаружить проблему? Где у него логгируется сообщения об ошибках? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2018, 14:49 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
На сервере А, databaseA: ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2018, 14:53 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
На сервере B, databaseB: ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2018, 14:54 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
не понятно , есть результат: Код: sql 1. 2.
Там будет статус в поле transmission_status Второе логи sql смотрели, есть ли там ошибки , права на коннект к endpoint-ам дали? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2018, 15:13 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Вот что в статусе: An error occurred while receiving data: '10054(An existing connection was forcibly closed by the remote host.)'. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2018, 15:32 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Из ошибок в логе только: Implied authentication manager initialization failed. Implied authentication will be disabled. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2018, 15:39 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Slava_NikВторое логи sql смотрели, есть ли там ошибки , права на коннект к endpoint-ам дали? Вроде бы да, в скрипте (см. выше) есть вот что, например: GRANT CONNECT ON ENDPOINT::ServiceBrokerEndPoint To sbLogin GO ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2018, 15:41 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
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.02.2018, 15:42 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
uaggster, безопасность транспорта значит кривая, почему у вас в одном случае шифрование RC4 а для другой точки AES? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2018, 15:44 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
felix_ffuaggster, безопасность транспорта значит кривая, почему у вас в одном случае шифрование 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.02.2018, 15:53 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Slava_Nikuaggster, у вас ошибка из-за прав. на второй вопрос не ответили, права к endpoint-у дали? Да говорю ж, вроде как дал: Код: sql 1. 2.
И на том, и не другом серверах. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2018, 15:55 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
uaggster, ну для начала сделайте на сервере целевой службы Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2018, 16:13 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
felix_ff, Сделал, только AES, на обоих серверах. Пока результат 0 ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2018, 16:27 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
И в transmission_status - пусто ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2018, 16:29 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
uaggster, у меня нет сейчас под рукой инстансов на которых можно СБ поднять, вечером скину вам алгоритм если сами не разберетесь. у вас явно какие то проблемы с настройками безопасности. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2018, 16:35 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Хорошо, спасибо! Буду ждать. Сам не разберусь. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2018, 16:40 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Можно даже пример пошаговой настройки компонентов, чтобы понять, где ломается. Проблема в том, что я пошагово воспроизвожу MSDN-овский учебник, и тем не менее не могу получить результат. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2018, 16:44 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
uaggster, сервер может принудительно закрывать соединение с той стороны если, например, нет каких-то разрешений на подключение или он получает сообщение, не воспринимаемое как handshake. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2018, 17:55 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
uaggster, Посмотрел свой старый скрипт инициализации брокера, еще для 2005 версии (но вроде особо ничего не поменялось в транспорте с тех пор). Отличия: Grant connect on endpoint надо давать не только соотв. логину, но и public, зачем-то. Хз, может сейчас уже не надо, но проверьте; Помимо grant send on service, удаленному логину надо давать также и control на этот сервис. Все это - на обеих сторонах, естественно. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2018, 18:15 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Ennor Tiegaeluaggster, Посмотрел свой старый скрипт инициализации брокера, еще для 2005 версии (но вроде особо ничего не поменялось в транспорте с тех пор). Отличия: Grant connect on endpoint надо давать не только соотв. логину, но и public, зачем-то. Хз, может сейчас уже не надо, но проверьте; Помимо grant send on service, удаленному логину надо давать также и control на этот сервис. Все это - на обеих сторонах, естественно. Хорошо, проверю в понедельник, но звучит несколько странно. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2018, 16:50 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
uaggster, ох, получается много :) но скоро будет готово ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2018, 19:57 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Добрый вечер, Чтож как и обещал делюсь знаниями по настройке SB. Я решил представить эти сведения в виде мини статьи по потому что тема довольно интересная, я уже не первый раз сталкиваюсь с людьми у которых возникают проблемы при настройке Service Broker, да и мне самому не помешает поднять в памяти некоторые нюансы на которые наталкивался когда разбирался с реализацией компонента. При этом стоит отметить что настройка коммуникации служб в пределах одной базы и даже одно экземпляра не представляет ничего сложного. Самое непотребство возникает когда дело касается обмена сообщениями между службами нескольких инстансов Sql Server. Замечу только что даже при отправке сообщений в одном экземпляре между различными базами необходимо установить флаг TRUSTWORTHY для обеих баз (так было во времена 2008 сиквела возможно данное требование осталось и сейчас, чесно - не тестил). Компонент обеспечивает безопасность на двух уровнях - транспортном и на уровне диалога. Транспортная безопасность дает защиту самого соединения на уровне стека TCP/IP между серверами, при этом транспортную безопасность следует тоже делить на два шага: аутентификацию и шифрование.(причем шифрование опционально - может быть а может не быть, а вот аутентификация обязательна) Безопасность на уровне диалога обеспечивает соотвественно защиту самого диалога между конечными точками. Пока поговорим о транспортной аутентификации : Service Broker имеет опять таки же два типа аутентификации - Windows-аутентификация и аутентификация с использованием сертификатов, собственно с последними мы сегодня и будем играться. Отмечу касательно windows-аутентификации, для ее настройки необходимо что бы служба Sql Server запускалась под определенными доменными учетными данными (или в сети поддерживался протокол аутентификации Kerberos), каждая доменная учетка будет отмаплена логином в зеркальный инстанс и ей будет дано право на CONNECT к конечной точке. То есть к примеру имеея два инстанса и домен я создаю две учетки: mydomain\sql1 и mydomain\sql2 Делаю так что бы один экземпляр Sql Server запускался под учеткой mydomain\sql1, а второй экземляр запускался под учеткой mydomain\sql2 Создаю логин mydomain\sql1 во втором экземпляре, а логин mydomain\sql1 создаю в первом экземляре; Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Еще один хитрый нюанс: может случиться так что служба Sql Server запущена под служебной учетной записью LocalSystem, в таком случае логин создается для сервера а не для доменной учетки и будет представлять из себя вид [mydomain\sqlserver1$] т.е. вместо пользовательской учетки мы создаем логин для сервера: Код: sql 1. 2. 3. 4.
И эта фишка будет работать ТОЛЬКО в том случае если в сети используется протокол Kerberos для аутентификации, если его нет, то можно сразу рассматривать аутентификацию с использованием сертификатов. Собственно я вкратце описал сейчас алгоритм windows аутентификации, он сильно проще чем предстоящий геморрой с сертификатами но требует наличие домена (коего у меня сейчас под рукой нет :-) и протокола Kerberos если службы запущены не под доменными учетками а от системных учетных записей, кстати да учетка NETWORK SERVICE так же как и LocalSystem должна обеспечивать аутентификацию по сети, в то время как LOCAL SERVICE ничего подобного не допустит. Наконец перейдем к моим нелюбимым сертификатам и вооружившись всеми необходимыми средствами можно приступать. Входной набор или "что имеем": Инстанс Sql Server 2014 LocalDb развернутый на моей основной домашней машине: Microsoft SQL Server 2014 (SP2) (KB3171021) - 12.0.5000.0 (X64) Jun 17 2016 19:14:09 Copyright (c) Microsoft Corporation Express Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) и полноценный инстанс Sql Server 2016 Developer Edition на моем ноутбуке: Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64) Oct 28 2016 18:17:30 Copyright (c) Microsoft Corporation Developer Edition (64-bit) on Windows 10 Enterprise 6.3 <X64> (Build 15063: ) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2018, 21:31 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2018, 21:31 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Удостоверимся что обе машины видят друг друга по сети. По ICMP компы друг друга видят и это хорошо, бывает что ping не проходит так как ICMP-протокол блокирован брандмауэром с какой то стороны и.т.д нас это не сильно сейчас волнует поскольку далее мы все равно убедимся что между конечными точками связь должна быть. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2018, 21:32 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Переходим непосредственно к настройке сначала работаем на основной машине (когда я буду выполнять какие то действия на ноуте буду отдельно писать) Поскольку у нас предполагается обмен данными между экземплярами нам необходимо обеспечить безопасность транспорта, что бы сообщения шифровались на выходе и Sql Server делает это всегда если какие то данные выходят за пределы экземпляра. Предварительно я перегенерирую основной ключ службы поскольку раньше не бэкапил его, а по хорошему эту процедуру следует сделать сразу же после установки инстанса и уверенности что потом не будет "фиаско" Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Далее нам необходимо защитить основной ключ базы данных master ключом службы, создать сертификат для нашего сервера и забэкапить его в файл. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Теперь создаем конечную точку на нашем основном компе: Код: sql 1.
И собственно запустив netstat -anb можем убедиться что наш инстанс теперь прослушивает порт 4022 протокола TCP :) Теперь проделываем аналогичные настройки на ноутбуке: Код: 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.
Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2018, 21:39 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Далее давайте убедимся что оба инстанса могут видеть конечные точки друг друга: ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2018, 21:42 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Отлично, нами были созданы сертификаты на обоих серверах и проверено что с каждого сервера прослушиваемый TCP-порт конечной точки другого сервера виден. Теперь необходимо обменяться сертификатами между серверами что бы они могли узнавать друг друга, перекидываем файлик C:\Users\felix_ff\main_cert.cer с основной машины на ноут, а с ноута файлик C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\note_cert.cer на основной комп Итого на основной машине выполняю: Код: sql 1. 2. 3. 4.
На ноуте выполняю: Код: sql 1. 2. 3. 4.
Тем самым я создаю в базе master логин, пользователя под которым удаленный сервер будет стучаться в гости и сертификат с помощью которого данный пользователь будет проходить проверку подлинности. На этом настройка аутентификации с помощью сертификатов подходит к концу и слава богу если я ничего не забыл. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2018, 21:43 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Далее затронем аспект шифрования: конфигурация конечной точки в каждом экземпляре требует задания параметра ENCRYPTION оно может быть как выключено, так и включено. Самое интересное что параметр ECNRYPTION может быть передан в трех различных вариациях (DISABLED, SUPPORTED, REQUIRED). Как я уже говорил ранее по умолчанию шифрование требуется для всех соединений в случае если мы имеем ситуацию с отправкой сообщений к другому экземпляру, но конечные точки можно настроить с различными параметрами шифрования и вот в таком случае от комбинации настроек зависит будут ли зашифрованны данные. Чесно признаюсь я забыл сетку в каких случаях оно шифруется а в каких нет, на момент написания этих строк полез в книжку издательства wrox.com Sql server 2008 руководство администратора авторства Брайна Найта и КО. Так вот сетка представляет из себя вид: ENDPOINT A ENDPOINT B ENCRYPTEDREQUIRED REQUIRED YESREQUIRED SUPPORTED YESSUPPORTED SUPPORTED YESDISABLED DISABLED NODISABLED SUPPORTED NO Когда у нас готовы конечные точки нам необходимо создать базы данных в которых будут объекты компонента Service Broker, поехали: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Базы называются аналогично можно назвать по разному, кому как нравится. Сразу создам две процедурки в каждой базе для удобства тестирования, одна показывает некоторые моменты что бы понять что происходит сейчас в компоненте, вторая скидывает все диалоги у которых состояние отличается от 'CLOSED' Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2018, 21:49 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Теперь необходимо настроить маршруты. Необходимо понимать КАК компонент определяет куда ему направить сообщение, а это определяется вот таким правилом: - при поступлении инструкции SEND ON CONVERSATION просматривается представление sys.routes в случае нахождения сообщения в данной таблице пересылка осуществляется правилами заданными маршрутом соотвествующим критериям отправки. - при поступлении сообщения в экземпляр просматривается sys.routes базы msdb что бы определить в какую базу отправить сообщение. - при отправлении подтверждения доставки сообщения также используется sys.routes, если маршрут возврата определен не будет это тоже может повлечь ошибки доставкиэ. может получиться так что если в sys.routes не будет обратного маршрута ответные сообщения будут складироваться в sys.transmission_queue - и опять такиже маршрут из базы msdb используется в случае получения подтверждения в экземпляр отправитель. Более подробно ошибки связанные с маршрутизацией я рассмотрю далее. Предварительно получив GUID экземпляров службы Service Broker для каждой базы каждого инcтанса, получаем инструкцией: Код: sql 1. 2. 3. 4.
Сейчас нам необходимо создать маршрут на основной машине в базе которую я буду использовать как инициатора сообщений: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
После настройки марштутов, подходим к теме обеспечения безопасности диалога, что пожалуй самый сложный вопрос во всем моем повествовании. Безопасность диалога обеспечивает безопасность между конечными точками, данные между конечными точками шифруются по умолчанию, отличительная черта безопасности диалога заключается в том что в процессе доставки сообщение может проходить несколько узлов в сети если к примеру настраивается MESSAGE FORWARDING. Я такой сценарий встречал один раз когда пересылка настраивалась не между двумя экземплярами Sql Server, а на пути следования был промежуточный экземпляр поскольку сервера находились в разных сегментах сети и технически было сложно организовать прямой доступ между двумя экземплярами. Так вот в случае если сообщение проходит несколько узлов, при достижении каждлой конечной точки оно шифруется/дешифруется в случае обеспечения транспортной безопасности, что накладывает дополнительные расходы. Если же будет использована безопасность диалога то сообщение будет зашифровано и расшифровано один раз у инициатора и получателя. Используется или не используется безопасность диалога настраивается опцией ENCRYPTION инструкции BEGIN DIALOG CONVERSATION; BEGIN DIALOG CONVERSATION @h FROM SERVICE [//svc_initiator] TO SERVICE '//svc_target' ON CONTRACT [contract] WITH ENCRYPTION = ON; --Используется BEGIN DIALOG CONVERSATION @h FROM SERVICE [//svc_initiator] TO SERVICE '//svc_target' ON CONTRACT [contract] WITH ENCRYPTION = OFF; --Не используется Следует отметить важный аспект: будет ли сообщение вообще не зашифронано в случае ENCRYPTION = OFF? Нет, параметр ENCRYPTION = OFF означает что шифрование не требуется, но в случае удаленной привязки диалог должен быть защищен даже с опцией в состоянии OFF. Это мы увидим далее. На основном компе и ноуте следует подготовить пользователя и его сертификат для дальнейшей настройки безопасности диалога но мы не будем его пока применять. Код: 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.
Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2018, 21:52 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Теперь сразу покажу типичную ошибку которая может быть допущена на этой стадии: В текущий момент инфраструктура для обеспечения безопасности диалога у нас почти готова, но давайте посмотрим что же будет если я в текущий момент попытаюсь отправить сообщение в принимающую очередь на ноутбук? Сначала проверим что будет если попытаться послать сообщение в принимающей службе на ноутбуке с опцией ENCRYPTION OFF инструкции BEGIN DIALOG CONVERSATION Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2018, 21:54 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Как видно у нас вернулось сообщение что произошла ошибка открытия диалога, Transmission_status представления sys.transmission_queue содержит не слишком подробное описание, он только указывает что при отправке сообщения случилось некоторое событие которое не позволило доставить сообщение получателю, поэтому сообщение не будет отправлено и сообщение будет находиться в системной очереди пока диалог не будет закрыт. Service Broker received an error message on this conversation. Service Broker will not transmit the message; it will be held until the application ends the conversation. Более подробную информацию о том что же конкретно произошло мы получим в нашей очереди которая связана с сервисом инициатора, в данном случае [dbo].[//SB_test/Queues/Outbound] Код: sql 1.
И получаем причину ошибки: Код: sql 1. 2. 3. 4.
Как отлавливать ошибки, компонента я расскажу в самом конце потому что это не самое приятное занятие, требующее довольно продолжительное время в зависимости от типа возникающих ошибок. Сейчас же важно понимать что пользователь под которым мы проходим аутентификацию на удаленном сервере не смог получить доступа к конечной службе. Что же я забыл сделать на данном этапе что привело к такой ошибке? Конечно все дело в правах. Как видно из результата хранимой процедуры sb_get соединение между двумя серверами установлено, о чем свидетельствует строка представления sys.dm_broker_connections со статусом "LOGGED IN", следовательно само соединение между двумя экземплярами было установлено и ошибка не на транспортном уровне. Значит проблема на уровне прав пользователя обеспечивающего безопасность диалога. Забегая вперед скажу что сервер опевещает нас о данном инциденте событием Broker: Message Undeliverable на строне получателя с тектом: Код: sql 1.
user ID 0 говорит нам о том что сервис инициатора диалога попытался авторизоваться в правами роли public, которая не имеет доступа к сервису очереди получателя. Текущую проблему бы решило разрешение прав SEND для роли public на сервис [//SB_test/Services/note_service_inbound] на ноутбуке инструкцией: Код: sql 1.
Но мы же не хотим давать лишние права роли в которую входят все пользователи? Поэтому надо понять почему же при открытии диалога мы ломимся с правами роли вместо пользователя. И вот тут мы подходим к оперделению "удаленных привязок" (REMOTE BINDINGS) Для любой службы отправляющей сообщения за пределы инстанса мы можем указать привязки с какими учетными данными безопасности мы должны проходить проверки удостоверения безопасности на удаленных службах. Все дело в том что когда пересылка сообщений затрагивает не один инстанс отправляющая служба определяет какой сертификат использовать для обеспечения безопасности по привязке REMOTE BINDING. Это же описано в BOL: Код: sql 1. 2. 3.
А так как я уже говорил что в случае пересылки сообщений между отдельными инстансами сообщение ДОЛЖНО быть защищено, нам необходимо определить сертификат которым мы будем подписывать наши отправляемые сообщения. Выполню инструкцию Код: sql 1.
на обоих серверах что бы очистить проблемные диалоги. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2018, 21:59 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Чуть ранее я уже озаботился этим моментом, создал главный ключ базы, защитил его главным ключем службы, создал пользователя у которого есть право CONTROL на нашу отправляющуу службу [//SB_test/Services/main_service_outbound] Для этого пользователя мы создали сертификат и забекапили его в файл. Перекидываем сертификат пользователя-владельца службы получателя на основной комп, а сертификат владельца службы отправителя на ноут. на основном компе создаем пользователя для аутентификации службы ноута: Код: sql 1. 2. 3. 4.
А на ноутбуке проделываю зеркальную операцию для пользователя владельца-службы отправителя: Код: sql 1. 2. 3. 4.
Теперь осталось создать привязку удаленной службы на основном компе инструкцией: Код: sql 1. 2. 3. 4.
Если раскоментить указание ANONYMOUS то действия осуществляемые на удаленном узле будет будут осуществленны из под контекста public роли (что в свою очередь обязывает нас раздавать дополнительные права, поэтому здесь мы это не используем) Удаленная привязка нужна только инициирующей службе, поэтому на ноутбуке нам не обязательно создавать ее, если мы не будем потом с ноутбука пытать первыми отправить сообщения на другую машину. Как только мы создали привязку давайте заново попробуем отправить сообщение и посмотреть что у нас получится, даже отправим парочку сообщений в различными параметрами опции ENCRYPTION USE [SB_test] DECLARE @conversation_handle UNIQUEIDENTIFIER; BEGIN DIALOG CONVERSATION @conversation_handle FROM SERVICE [//SB_test/Services/main_service_outbound] TO SERVICE '//SB_test/Services/note_service_inbound' ON CONTRACT [//SB_test/Contracts/test_contract] WITH ENCRYPTION = OFF; SEND ON CONVERSATION @conversation_handle MESSAGE TYPE [//SB_test/MessageTypes/test_msg] ('test message without message security'); BEGIN DIALOG CONVERSATION @conversation_handle FROM SERVICE [//SB_test/Services/main_service_outbound] TO SERVICE '//SB_test/Services/note_service_inbound' ON CONTRACT [//SB_test/Contracts/test_contract] WITH ENCRYPTION = ON; SEND ON CONVERSATION @conversation_handle MESSAGE TYPE [//SB_test/MessageTypes/test_msg] ('test message with message security'); GO WAITFOR DELAY '00:00:05.000'; --задержка сделана специально, потому что если сразу запросить статусы в sys.conversation_endpoints может сложиться мнимое ошущение что ошибка в чем то другом потому что диалог будет в статусе CONVERSING EXEC [dbo].[sb_get]; ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2018, 22:03 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
вот блин не тот скриншот в предыдущем посте приложил (жалко что посты изменять нельзя) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2018, 22:06 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
И как только у нас есть привязка сейчас как видно все отлично: сообщния доставлены на удаленный инстанс, наши диалоги находятся в состоянии CONVERSING. Мы можем получить сообщение на ноутбуке, и потом отправить ответ после чего закроем диалог со стороны получателя. Замечу важный момент как видно с моего скрина поля ok и ik для диалога на стороне получателя заполнены, следовательно диалог использует сертификат для подписи сообщений даже если мы открывали диалог с параметром ENCRYPTION OFF как я говорил ранее. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2018, 22:08 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2018, 22:09 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Выполнив данную инструкцию: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Я вычитал все входящие сообщения из очереди ноута и отправил ответные сообщения после чего закрыл диалоги. На стороне компа у нас теперь видно ответы: ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2018, 22:11 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Теперь что касается отлова возможных ошибок возникающих в компоненте, всегда необходимо понимать на какой стадии возникла ошибка, была ли она на транспортном уровне или на уровне комуникации между службами. Sql Server имеет массив классов событий привязанных к компоненту Service Broker, это касается как SqlTrace так и XEvents событий. Для этого можно запустить трассировку классов событий Broker, Errors and Warnings и Audit: Broker обычно при возникновении ошибок они дают исчерпывающую информацию что может быть причиной не доставки сообщения компоненту. Вся сложность в том что трассу надо отслеживать не на одном инстансе а на нескольких, потому что может получится ситуация что один инстанс отправляет сообщения а другой инстанс не может их расшифровать но события показывающие данную ошибку будут только на втором инстансе, на первый же будет приходить только отлуп в виде довольно скудного сообщения. Так же можно использовать сеансы событий XEvent для отлова ошибок, они обычно начинаются с названий Broker => Broker Conversation, Broker_corrupted_message и.т.д. Что касается системных представлений: Если доставка осуществляется между экземплярами необходимо: а) посмотреть в представление sys.conversation_endpoints поле state может сразу сказать открылся ли диалог нормально, если state = ER то обычна причина ошибки открытия лежит в нашей отправляющей очереди сообщением б) если диалог в статусе CONVERSING но мы не видим сообщений в принимающей очереди необходимо посмотреть представление sys.dm_broker_connections оно скажет нам поднялся ли физический канал между конечными точками и нет ли проблем с аутентификацией между серверами. в) смотрим наличие сообщений в sys.transmission_queue и поле transmission_status , если оно пустое значит сообщение еще не было отправлено, необходимо включать трассировку ошибок на принимающей стороне, да и на отправляющей тоже. г) смотрим наличие сообщений в отправляющей очереди и вообще проверяем статусы обоих очередей в представлении sys.service_queues у обоих очередей должен быть выставлен бит is_receive_enabled, is_enqueue_enabled ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2018, 22:22 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
На этом закругляюсь, сразу прощу прощения я чето не очень догнал как файлы картинок-вложений запихнуть в спойлеры. Сергей Гавриленко если можно Вас попросить подредактировать мои посты что бы картинки не убили у кого-нибудь траффик на телефоне. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2018, 22:26 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
felix_ff, огромное спасибо. Добавил в закладки, буду пытаться скурить. На первый взгляд - самое дельное и подробное руководство из всех, что я видел. Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2018, 07:47 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
felix_ff, супер! жаль что я это прошел на год раньше через собственные спотыкания. чуть позже дополню как у меня происходит обмен сертификатами между серверами без ручного перекладывания файлов, да и вообще без файлов. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2018, 11:41 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
felix_ff, спасибо за ответы в теме, на сегодня вы мой бог ) Сделал все как написано и настроил общение между удаленным сервером и сервером в офисе + настроил общение между БД внутри офиса. Начал по аналогии настраивать следующий удаленный сервер, а их около 10 и получаю ошибку "Connection attempt failed with error: '10060(Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера.)'." Первое, подумал, что некорректно настроил. Настроил следующий, и такая же ошибка. Где-то есть подвох, которого не понимаю. Как найти ошибку? Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2019, 09:40 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
и теперь вообще все поломалось, в профайлере пишет 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.10.2019, 10:17 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Андрей Попов, Вы можете инициализировать брокер через ALTER DATABASE SET NEW_BROKER, но надо понимать, что вы удалите все переговоры conversation и маршруты, если такие были определены. Смотрите справку по этой команде. Утилита ssbdiagnose также в помощь. Вы восстанавливали резервную копию базы на другом сервере? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2019, 12:45 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Владислав КолосовВы восстанавливали резервную копию базы на другом сервере? Нет, настраиваю общение с нуля. Настроил на одном сервере - все ОК. Перешел к следующему и все поломал. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2019, 06:59 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
"Главный" сервер base1. Есть сервер srvshop40 и есть srvshop2. Первым был настроен srvshop40 и обмен между ним и base1 работает. Далее настраиваю по аналогии srvshop2. Думаю, что нашел ошибку, но не понял, как ее исправить: выполняю код отправки (порезанный, см. суть): Код: sql 1. 2. 3. 4. 5. 6. 7.
и поймал момент соединения (см. картинку). Почему то используется пользователь srvshop40_user, а не srvshop2_user. Где я неправ? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2019, 03:33 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Андрей Попов, вы ID брокера жестко задаете, в этом проблема. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2019, 11:58 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Владислав Колосов, все правильно с брокером, так и надо если маршрутов много, а сервис на них один и тот же. здесь проблема в пользователях. у меня центральный лезет на периферию одним и тем же пользователем, а вот обратно они создают диалоги своим собственным. Андрей Попов, у вас безопасность на основе сертификатов? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2019, 13:16 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Владислав КолосовАндрей Попов, вы ID брокера жестко задаете, в этом проблема. Нет. В примере в этом трэде не было указания ID, и я изначально также сделал. Не работает. Потом добавил, безрезультатно. Я концептуально не понимаю связь между пользователем, которому разрешено подключение к endpoint и пользователем сервиса. На главном base1 сервере создана одна точка endpoint и два пользователя srvshop40_user и srvshop2_user с сертификатами из файлов соответствующих серверов. Юзерам дан доступ к точке. Отправка идет через сервисы и там уже два пользователя srvshop40_service_owner и srvshop2_service_owner. Есть маршруты и remote binding для xxx_service_owner. Как скуль должен понять, что при использовании сервиса для отправки для srvshop2 нужно использовать сертификат пользователя srvshop2_user? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2019, 13:21 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Андрей Попов, немного ушли в сторону. предположим, что у вас в центре уже есть 'сертификат центра' и endpoint с аутентификацией по 'сертификату центра' на периферийной точке создать 'сертификат точки' создать endpoint с аутентификацией по 'сертификату точки' создать логин (которым будет цеплятся центр, он един на всех точках) создать пользователя для логина создать сертификат для пользователя из 'сертификата центра' предоставить права на соединение с endpoint логину на центре создать 'логин точки' (для каждой точки свой) создать 'пользователя точки' для 'логина точки' создать 'сертификат для пользователя точки' из 'сертификата точки' предоставить права на соединение с endpoint 'логину точки' если все сделано так, то никаких сервис биндинг в этом случае не нужно. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2019, 13:47 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
я обещал выложить процедуру как я создаю транспорт на основе сертификатов и обмениваюсь ими без файлов. выкладываю как есть, без всяких комментов и правок. это рабочий код, которым пользуюсь уже 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2019, 14:14 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Андрей Попови теперь вообще все поломалось, в профайлере пишет 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.
скорее всего они будут разные, если так то выполните Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2019, 15:48 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Привет! Подскажите, какие у кого стратегии работы с нежелательными сообщениями, когда после 5 попыток очередь останавливается? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2020, 18:10 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Nemoxur, предусмотреть обработку кода в ситуации когда у вас происходит откат транзакции. адд: дополнительно лично у меня еще для подстраховки xEvent сессия настроена, для сбора событий отключения очереди в которую переодически ломится задание делающее рассылку уведомлений какая очередь вдруг каким то чудом отключилась. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2020, 19:37 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Nemoxur, найти ошибку, исправить, принять превентивные меры. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2020, 20:24 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
felix_ff, Согласен) если не сложно, можно пример такого xEvent? Владислав Колосов, Согласен) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2020, 13:15 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Nemoxur, дополнительно можно настроить уведомление event notification об отключении очереди, существует такое событие. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2020, 13:16 |
|
Как обнаружить ошибку при работе service broker?
|
|||
---|---|---|---|
#18+
Nemoxur felix_ff, Согласен) если не сложно, можно пример такого xEvent? Владислав Колосов, Согласен) Код: sql 1. 2. 3. 4.
я вам полный код процедуры приводить не буду, там достаточно много завязано на бизнес логику процедуры которая работает под шедулером. по сути Вам правильно подсказали - можно обойтись настройкой 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.
процедура подписки мониторинга Код: 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.
подписка очередей на мониторинг Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2020, 19:55 |
|
|
start [/forum/topic.php?all=1&fid=46&tid=1685681]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
104ms |
get tp. blocked users: |
1ms |
others: | 253ms |
total: | 439ms |
0 / 0 |