有没有好的开源或其他免费的 MS SQL Server 事务阻塞监控工具?一种可以检测到持续时间超过 X 的阻塞事务,然后在某处通过电子邮件发送警报的方法是理想的。
一台服务器很简单。特别适用于 MS SQL Express 2008,但应该适用于所有真正的或所有最近的。
有没有好的开源或其他免费的 MS SQL Server 事务阻塞监控工具?一种可以检测到持续时间超过 X 的阻塞事务,然后在某处通过电子邮件发送警报的方法是理想的。
一台服务器很简单。特别适用于 MS SQL Express 2008,但应该适用于所有真正的或所有最近的。
是的,实际上 SQL Server 提供了这样一个开箱即用的选项,但很少有人知道它,甚至更少知道如何使用它。它被称为blocked process threshold
:
使用阻塞进程阈值选项指定生成阻塞进程报告的阈值(以秒为单位)。阈值可以设置为 0 到 86,400。默认情况下,不会生成阻塞进程报告。不会为系统任务或正在等待资源且不会生成可检测死锁的任务生成此事件。
您可以定义在生成此事件时要执行的警报。因此,例如,您可以选择寻呼管理员以采取适当的措施来处理阻塞情况。
启用此选项后,系统将生成Blocked Process Report Event Class的分析器事件。下一个难题是可以使用DDL Event Notifications捕获这个(以及更多)Profiler 事件。这是一个实际的例子:
use msdb;
go
create queue events;
go
create service events on queue [events] (
[http://schemas.microsoft.com/SQL/Notifications/PostEventNotification]);
go
create event notification [blocked_threshold_exceeded]
on server for BLOCKED_PROCESS_REPORT
to service N'events', N'current database';
go
exec sp_configure 'show advanced options', 1;
reconfigure
go
exec sp_configure 'blocked process threshold', 10;
reconfigure
go
-- simulate blocking
use tempdb;
go
begin transaction;
create table x (a int);
go
现在,在另一个会话上,运行阻止上面启动的未提交事务的查询:
select * from tempdb..x
果然,在 10 秒内(我们配置的阈值)我们会收到通知:
use msdb;
receive cast(message_body as xml) from [events];
<EVENT_INSTANCE>
<EventType>BLOCKED_PROCESS_REPORT</EventType>
<PostTime>2013-02-12T16:19:55.610</PostTime>
<SPID>5</SPID>
<TextData>
<blocked-process-report monitorLoop="104441">
<blocked-process>
<process id="process47b946cf8"
waitresource="OBJECT: 2:373576369:0 "
waittime="18952" ...>
<executionStack>
<frame line="1" stmtstart="-1" ... />
</executionStack>
<inputbuf>
select * from x </inputbuf>
</process>
</blocked-process>
<blocking-process>
<process status="sleeping" ....>
<executionStack />
<inputbuf>
create table x (a int) </inputbuf>
</process>
</blocking-process>
</blocked-process-report>
</TextData>
...
</EVENT_INSTANCE>
您可以看到阻塞器最后执行的语句、阻塞的当前执行语句,以及等待时间等等。
连接事件通知以激活发送邮件的过程sp_send_db_mail
留给读者作为练习。是的,上面提到的所有内容都可以在 Express Edition 中使用。