设为首页 收藏本站
查看: 1016|回复: 0

[经验分享] SQL Server Profiler -- 识别异常

[复制链接]

尚未签到

发表于 2018-10-12 08:55:28 | 显示全部楼层 |阅读模式
SQL Server Profiler -- 识别异常
  在一个完美的环境中,所有的异常都应该可以被捕捉、处理并记录。有专人定期查看这些日志并创建基于发生的异常的错误报告,使它们可以被及时调试并在将来多能避免再次发生。然而,现实总是可以看到应用程序从数据库到用户界面都会不断地出现各种异常,并且这些异常都没有任何记录。更糟糕的是,应用程序搜索到并消化了这些异常,偶尔也会给用户返回奇怪的数据,而这些用户并不明白发生了什么。为了查明这些情况通常提出分析观察这些异常,以便能够查找并处理这些异常,避免影响太多用户。
  跟踪异常十分简单,可以从TSQL模板开始,该模板包括审核登录和审核登出事件以及现存连接事件(这里可以将所有事件都可以移除)。剩下的就是“RPC:Starting”和“SQL:BatchStarting”,这两者都是必须的,用来跟踪引发一个异常的Transact-SQL,不管这个异常是由于SQL批处理还是由于RPC调用引起的。在这种情况下,跟踪启动事件更为重要,而不是去跟踪完成事件,因为某些错误可能导致完成事件无法激发一个给定的查询。
DSC0000.jpg

  还要往RPC和SQL事件中添加错误和警告类别中的注意、异常和用户错误信息事件。每当一个客户强行断开连接时,注意事件就会被激发,最好的例子就是客户端查询超时,通常暗示性能或阻塞问题。每当一个任意类型的异常发生时,异常事件就会被激发,而当与一个异常合在一起,以消息形式送回关于锁发生事件的额外数据时,用户错误信息事件就会被激发,或者当一系列状态改变时,该事件也会被激发,如用户从一个数据库切换到另一个数据库。
  我们也建议为每个选择事件类都添加一个EventSequence列,这将使稍后的查询数据更加简便。建议用来监视异常的一个事件和列的完成事件选择对话框如下。
DSC0001.jpg

  注意: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性能分析器中运行。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-620578-1-1.html 上篇帖子: linux下安装sql server 下篇帖子: SQL Server Integration Services报错
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表