SQL Server Profiler -- 识别异常

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:

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

 

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

 

clip_image001

 

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

 

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

 

clip_image002

 

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

 

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

 

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

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

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

 

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

 

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




















本文转自UltraSQL51CTO博客,原文链接:http://blog.51cto.com/ultrasql/1589292 ,如需转载请自行联系原作者


相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
8天前
|
SQL 人工智能 算法
【SQL server】玩转SQL server数据库:第二章 关系数据库
【SQL server】玩转SQL server数据库:第二章 关系数据库
47 10
|
1月前
|
SQL 数据库 数据安全/隐私保护
Sql Server数据库Sa密码如何修改
Sql Server数据库Sa密码如何修改
|
2月前
|
SQL 算法 数据库
【数据库SQL server】关系数据库标准语言SQL之数据查询
【数据库SQL server】关系数据库标准语言SQL之数据查询
95 0
|
2月前
|
SQL 算法 数据库
【数据库SQL server】关系数据库标准语言SQL之视图
【数据库SQL server】关系数据库标准语言SQL之视图
76 0
|
2月前
|
SQL 人工智能 算法
【数据库SQL server】传统运算符与专门运算符
【数据库SQL server】传统运算符与专门运算符
68 0
|
18天前
|
SQL
启动mysq异常The server quit without updating PID file [FAILED]sql/data/***.pi根本解决方案
启动mysq异常The server quit without updating PID file [FAILED]sql/data/***.pi根本解决方案
16 0
|
8天前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
66 6
|
8天前
|
SQL 存储 数据挖掘
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
服务器数据恢复环境: 一台安装windows server操作系统的服务器。一组由8块硬盘组建的RAID5,划分LUN供这台服务器使用。 在windows服务器内装有SqlServer数据库。存储空间LUN划分了两个逻辑分区。 服务器故障&初检: 由于未知原因,Sql Server数据库文件丢失,丢失数据涉及到3个库,表的数量有3000左右。数据库文件丢失原因还没有查清楚,也不能确定数据存储位置。 数据库文件丢失后服务器仍处于开机状态,所幸没有大量数据写入。 将raid5中所有磁盘编号后取出,经过硬件工程师检测,没有发现明显的硬件故障。以只读方式将所有磁盘进行扇区级的全盘镜像,镜像完成后将所
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
|
12天前
|
SQL 安全 Java
SQL server 2017安装教程
SQL server 2017安装教程
14 1
|
25天前
|
SQL 存储 Python
Microsoft SQL Server 编写汉字转拼音函数
Microsoft SQL Server 编写汉字转拼音函数