SQL Server Profiler -- 识别异常

SQL Server Profiler -- 识别异常

在一个完美的环境中,所有的异常都应该可以被捕捉、处理并记录。有专人定期查看这些日志并创建基于发生的异常的错误报告,使它们可以被及时调试并在将来多能避免再次发生。然而,现实总是可以看到应用程序从数据库到用户界面都会不断地出现各种异常,并且这些异常都没有任何记录。更糟糕的是,应用程序搜索到并消化了这些异常,偶尔也会给用户返回奇怪的数据,而这些用户并不明白发生了什么。为了查明这些情况通常提出分析观察这些异常,以便能够查找并处理这些异常,避免影响太多用户。

跟踪异常十分简单,可以从TSQL模板开始,该模板包括审核登录和审核登出事件以及现存连接事件(这里可以将所有事件都可以移除)。剩下的就是“RPC:Starting”和“SQL:BatchStarting”,这两者都是必须的,用来跟踪引发一个异常的Transact-SQL,不管这个异常是由于SQL批处理还是由于RPC调用引起的。在这种情况下,跟踪启动事件更为重要,而不是去跟踪完成事件,因为某些错误可能导致完成事件无法激发一个给定的查询。

还要往RPC和SQL事件中添加错误和警告类别中的注意、异常和用户错误信息事件。每当一个客户强行断开连接时,注意事件就会被激发,最好的例子就是客户端查询超时,通常暗示性能或阻塞问题。每当一个任意类型的异常发生时,异常事件就会被激发,而当与一个异常合在一起,以消息形式送回关于锁发生事件的额外数据时,用户错误信息事件就会被激发,或者当一系列状态改变时,该事件也会被激发,如用户从一个数据库切换到另一个数据库。

我们也建议为每个选择事件类都添加一个EventSequence列,这将使稍后的查询数据更加简便。建议用来监视异常的一个事件和列的完成事件选择对话框如下。

注意:SQL Server在查询执行进程的各个阶段内部使用异常来发送信息。它的一个警示标志就是没有相应的用户错误信息事件的一个异常事件。如果出现此类情况,并不需要用户处理错误。

在选择了合适的事件后,就可以编辑跟踪并启动此事件了。用户可能要在后台运行这类跟踪,做一些临时收集。通常情况下,在活动忙碌期间收集该数据十分重要,它可以帮助查找用户可能遇到的异常。比如捕捉一些特别的东西来,这类跟踪更像是撒网并希望赶上一些什么,因此计时是必不可少的。用户可能会发现异常,也可能发现不了,但是仅仅因为在一个收集期内没有发现异常就不能认为没有异常,所以要确保经常监视异常。

如果捕捉到数据并将其传送到一张表里,查找发生的异常就是一个问题了:

1. 在先于断开连接的同一个spid上的所有注意事件(事件类16),以及Transact-SQL或RPC事件(事件类分别是13和10)。

2. 所有异常事件(事件类33)和紧随其后的一个用户错误信息事件(事件类162),以及在先于异常的同一个spid上的Transact-SQL或RPC事件。

所有前后相随的逻辑都可以用EventSequence列编码,建议在跟踪管理加入这个列。下面的查询使用这个逻辑查找出所有的用户异常和断开连接、相关错误信息及造成故障的查询:

;WITH Exceptions AS
(
SELECT
T0.SPID,
T0.EventSequence,
COALESCE(T0.TextData, ‘Attention’) AS Exception,
T1.TextData AS MessageText
FROM TraceTable T0
LEFT OUTER JOIN TraceTable T1 ON
T1.EventSequence = T0.EventSequence + 1
AND T1.EventClass = 162
WHERE
T0.EventClass IN (16,33)
AND (T0.EventClass = 16 OR T1.EventSequence IS NOT NULL)
)
SELECT *
FROM Exceptions
CROSS APPLY
(
SELECT TOP(1)
TextData AS QueryText
FROM TraceTable Queries
WHERE
Queries.SPID = Exceptions.SPID
AND Queries.EventSequence < Exceptions.EventSequence
AND Queries.EventClass IN (10,13)
ORDER BY EventSequence DESC
) p

如果已经收集了大量的事件,就可以通过在跟踪表上的EventSequence列创建索引来提高查询的性能。

提示:如果已经意识到调用某一存储过程会发生一种异常,但是还需要更多的信息来确定到底这些事件在什么顺序下会激发这个异常,就可能需要结合之前所述的相同事件对单个查询做性能调校了。将查询事件以完成改到相应的启动类,并添加异常和用户错误信息事件,与调校单个查询的例子类似,这也需要和正在工作的spid上的过滤器一起,直接在SQL Server性能分析器中运行。

时间: 2024-08-05 12:42:55

SQL Server Profiler -- 识别异常的相关文章

SQL Server Profiler工具

一.SQL Profiler工具简介 SQL Profiler是一个图形界面和一组系统存储过程,其作用如下: 图形化监视SQL Server查询: 在后台收集查询信息: 分析性能: 诊断像死锁之类的问题: 调试T-SQL语句: 模拟重放SQL Server活动: 也可以使用SQL Profiler捕捉在SQL Server实例上执行的活动.这样的活动被称为Profiler跟踪. 1.Profiler跟踪 从开始=>所有程序=>Microsoft SQL Server 2008=>性能工具

SQL Server Profiler(转载)

SQL Server Profiler工具 一.SQL Profiler工具简介 SQL Profiler是一个图形界面和一组系统存储过程,其作用如下: 图形化监视SQL Server查询: 在后台收集查询信息: 分析性能: 诊断像死锁之类的问题: 调试T-SQL语句: 模拟重放SQL Server活动: 也可以使用SQL Profiler捕捉在SQL Server实例上执行的活动.这样的活动被称为Profiler跟踪. 1.Profiler跟踪 从开始=>所有程序=>Microsoft SQ

SQL Server Profiler工具【转】

一.SQL Profiler工具简介 转自:http://www.cnblogs.com/kissdodog/p/3398523.html SQL Profiler是一个图形界面和一组系统存储过程,其作用如下: 图形化监视SQL Server查询: 在后台收集查询信息: 分析性能: 诊断像死锁之类的问题: 调试T-SQL语句: 模拟重放SQL Server活动: 也可以使用SQL Profiler捕捉在SQL Server实例上执行的活动.这样的活动被称为Profiler跟踪. 1.Profil

SQL Server Profiler -- 调试死锁

SQL Server Profiler -- 调试死锁 跟踪一般的异常很简单,但处理死锁很难,死锁的消息号为1205,严重度为13.从服务器无法得到足够的数据来帮助判断到底发生了什么及为什么会发生这种状况,甚至服务器返回的错误消息也没有价值,这种消息所提供的唯一建议就是可以"重新运行该事务". SQL跟踪有提供帮助隔离和调试死锁状态的工具,但是SQL Server 2005把这些工具提升到了一个新的层次,它提供了一个非常有用的图形界面,帮助用户解决这些难以应付的问题.为了阐明到底提供了

SQL优化工具 - SQL Server Profiler与数据库引擎优化顾问

最近项目做到几千个学生分别去人脸识别记录(目前约630000行)中查询最后一次记录,可想而知性能这块是个麻烦.于是乎,GET到了SQL Server Profiler和数据库引擎优化顾问这俩工SHEN具QI. 开始装逼... 首先来一条执行效率不怎么样的SQL语句 将SQL Server Profiler中的跟踪文件保存至本地 打开数据库优化引擎,选择工作负荷文件以及需要优化的数据库/表,点击开始分析 分析结束后会给你索引建议,执行操作→应用建议,将会自动生成SQL语句并执行,完成后再执行试试那

SQL Server 2012笔记分享-33:SQL Server profiler跟踪

需求 使用SQL server profiler跟踪当前实例的所有常见活动,并将结果保存到文件中. ================================================================ 开始程序中选择SQL server profiler,如图. 选择文件--新建跟踪,如图. 连接到当前的SQL server实例,如图. 在跟踪属性里面配置跟踪名称.保存到的文件地址.保存到SQL报表.启用跟踪停止时间等,如图. 下图是一个跟踪启动后实时的跟踪情况,如图

Sql Server Profiler跟踪死锁

Sql Server Profiler一个很重要的应用场景就是监视分析死锁. 下面通过一个例子来学习Profiler是如何监视死锁的. 1. 创建测试数据模拟死锁, 创建表Table_A和Table_B并插入测试数据. CREATE TABLE Table_A ( id int, num int ) CREATE TABLE Table_B ( id int, num int ) INSERT INTO Table_A VALUES(1,20) INSERT INTO Table_A VALUE

SQL Server Profiler使用教程,通俗易懂才是王道

SQL Server Profiler使用教程,通俗易懂才是王道 做开发,平时难免和数据库打交道,特别是写存储过程,对于我们这些不常写SQL的人来说是一件极其痛苦的事,每次写完运行总是有错,如果用的是本地数据库的话还好,可以在本机调试SQL,那如果在数据库在服务器上面,调试被禁用,那就悲剧了~ 最近,由于工作需求,写一个存储过程,有几十个参数,数据库在服务器上面,写完了,测试完查询语句没有问题,但是到了项目里面查询时就出错,很是气人!想到了用SQL Profiler这个工具,打开选择默认设置,开

统计分析SQL Server Profiler 跟踪的SQL

--跟踪文件读入到表中分析 SELECT * INTO ZGSJY FROM fn_trace_gettable('E:\wxxcdbprofiler.trc', default); --某时间内,最耗时SQL select TOP 100 SUBSTRING(Textdata,1,660) as '名称', count(*) as '数量', sum(duration/1000) as '总运行时间ms', avg(duration/1000) as '平均运行时间ms', avg(cpu)