我从服务经纪人开始。已经设法根据这个答案为被阻止的进程设置事件通知,并且它工作得很好。然后我想设置另一个通知死锁,我看到一条CREATE ROUTE
声明:
-- create the route for the service
CREATE ROUTE DeadLockNotificationsRoute
WITH SERVICE_NAME = 'DeadLockNotificationsService',
ADDRESS = 'LOCAL';
GO
但是在上一个我没有运行这一步,它不包括在内并且有效。查看这里、这里、这里、这里和其他一些地方,我发现创建路线步骤并不总是包括在内。对于动态路由,当然似乎是强制性的。阅读MSDN-Create 路由对我来说并不清楚它是否是强制性的,以及何时应该包括在内。
如果您对服务器事件使用WMI 事件警报,则不需要Service Broker,因为它在 2005 年及更高版本中使用 Service Broker
SQL/Notifications/ProcessWMIEventProviderNotification/v1.0
,msdb
并且默认情况下为 msdb 启用 Service Broker。继续阅读 -了解服务器事件的 WMI 提供程序
回答你的问题:
您可以选择为服务器事件使用 Service Broker 或 WMI Provider。我发现服务器事件的 WMI 提供程序更容易实现。
基本上,使用事件通知允许您通过为事件创建服务和队列来使用 SQL Server Service Broker捕获信息。例如,如果您设置事件通知来捕获 DEADLOCK GRAPH,则会创建 3 个服务代理对象:
一个 QUEUE 来阻止 DEADLOCK_GRAPH 事件消息
将消息路由到队列的服务,以及
事件通知,用于捕获死锁图并将其打包在发送给服务的消息中。
对于服务器事件的 WMI Provider - 任何可以通过事件通知捕获的事件都有一个对应的 WMI 事件对象,任何 WMI 管理应用程序都可以订阅这些事件对象。SQL Server Agent 已更新以通过使用 WMI 查询语言 (WQL) 来管理 WMI 事件,WMI 查询语言是一种类似于 T-SQL 的查询语言,用于 WMI 和 WMI 事件的代理警报。
是的,但它绝不是 Service Broker 的替代品。事件通知使用 Service Broker。服务器事件的 WMI 提供程序使用 WMI 事件对象。
WMI 只能处理这些 DDL 事件组。Service Broker 的范围要广得多。
对于死锁的监控和警报,您可以使用我的脚本。
参考:Jonathan 关于在 SQL Server 中处理死锁的优秀文章