SQL Server Profiler -- 调试死锁

SQL Server Profiler -- 调试死锁

跟踪一般的异常很简单,但处理死锁很难,死锁的消息号为1205,严重度为13。从服务器无法得到足够的数据来帮助判断到底发生了什么及为什么会发生这种状况,甚至服务器返回的错误消息也没有价值,这种消息所提供的唯一建议就是可以“重新运行该事务”。

SQL跟踪有提供帮助隔离和调试死锁状态的工具,但是SQL Server 2005把这些工具提升到了一个新的层次,它提供了一个非常有用的图形界面,帮助用户解决这些难以应付的问题。为了阐明到底提供了什么,将展示如何在tempdb数据库中强制引发一个死锁,由下列代码开始:

USE tempdb
GO
 
CREATE TABLE Deadlock_Table
(
ColumnA int NOT NULL PRIMARY KEY
)
GO
 
INSERT Deadlock_Table
SELECT 1 UNION ALL SELECT 2
GO

通过启动两个独立的事务并逆序交错更新行,可以引发一个死锁,并观察SQL跟踪是如何帮助调试该死锁的。

注意:下列例子假设用户已经识别了涉及引发死锁的两个存储过程或查询,无论是基于异常跟踪,还是通过启动服务器级别的跟踪标志1222(往SQL Server服务的启动参数中添加-T1222)并从SQL Server错误日志中收集死锁资源。如果确定了参与的查询后,就要在已经恢复了产品数据的SQL Server的一个高级实例上进行调查。调试死锁需要收集大量的数据,由于有些事件是被系统spid激发的,因此想要过滤跟踪仅仅收集相关的数据是不可能的。在一个忙碌的系统里,该跟踪将创建大量的荷载,因此建议始终脱机工作。

首先,在SQL Server管理工作室里打开两个查询窗口,用@@SPID收集spid。稍后可能会用这些spid来帮助分析收集到的跟踪数据。然后启动一个新的SQL Server性能分析器会话,并用TSQL模板来选择“RPC:Starting”和“SQL:BatchStarting”事件。将“Locks: Deadlock graph”、“Locks: Lock:Acquired”、“Lock: Lock:Released”和“Locks: Lock:Escalation”事件都添加到上述事件中,这些事件都可以在锁类别里找到。锁事件将帮助分析促成死锁状态的锁顺序,死锁图事件则可以提供出错事件的图形显示以辅助分析。

用户可以选择考虑添加 “SP:StmtStarting”事件,以防正在调试的一个或多个存储过程运行了大量的语句,这样可能会导致死锁。也应该添加EventSequence列,以方便收集数据后对其进行分析。下图显示了这个活动的完成事件选择对话框。

提示:这个例子将展示当监视SQL Server性能分析器中的跟踪时,如何以正确的顺序运行语句以及如何在正确的时间强制引发一个死锁。但是,许多死锁都依赖于精确的计时(或时误),要想重新生成死锁就必须在闭环中运行每个查询,它们最终能以正确的方式发生冲突。SQL Server管理工作室还有一个特性,它可以帮助用户按自己的次数需要任意在闭环中运行某个查询。在每个查询窗口中,为查询建立一个批处理,然后用“GO”追踪该批处理,可以指定想让该查询运行的次数。如下面的Transact-SQL代码会执行1000次MyStoredProcedure存储过程:

EXEC MyStoredProcedure
GO 1000

如果建立好事件,就可以启动性能分析器里的跟踪了。注意,在这里不能使用过滤器,因为死锁图事件可能被任意数目的系统spid激发。由于没有过滤器,用户可能会看到一些系统锁活动。在跟踪结束后,这些可以被忽略或过滤掉。

在这个跟踪启动后,回到第1个查询窗口(在本测试中是spid52),运行如下的批处理:

BEGIN TRANSACTION
UPDATE Deadlock_Table
SET ColumnA = 3
WHERE ColumnA = 1
GO

接下来,在第2个查询窗口(在本测试中是spid53)中运行下列批处理:

BEGIN TRANSACTION
UPDATE Deadlock_Table
SET ColumnA = 4
WHERE ColumnA = 2
GO

由于以上两个查询的锁是兼容的,因此都应该返回。它们各自持有Deadlock_Table表上不同行的锁,回到第一个查询窗口,启动下列更新,将开始等待第二个窗口的会话释放锁:

UPDATE Deadlock_Table
SET ColumnA = 4
WHERE ColumnA = 2
GO

最后,回到第2个窗口运行下列更新,将开始等待第一个窗口释放锁。由于两个会话都在等待对方释放资源,于是就会出现一个死锁:

UPDATE Deadlock_Table
SET ColumnA = 3
WHERE ColumnA = 1
GO

出现死锁后就可以停止跟踪了,找到生成的死锁图事件,该事件应该如下图所示。

死锁图事件包括大量的数据以协助调试发生的状况,还包括对象ID、索引名(如果有)及HoBt(哈希或B树)ID,这些都可以用来过滤锁资源,甚至还可以进一步用sys.partitions视图中的hobt_id列过滤锁资源。此外,还可以回滚查找在死锁发生前每个spid运行的最后一个查询事件,以确定和死锁有关的实际查询。

如果用户需要更多的数据进行下一步的调试,这里也提供了很多可用的锁信息。读者可能注意到在这个截图中,与死锁图事件邻近的锁事件没有一个和工作的spid有关。即便在空闲时系统也会获取和释放相当多的锁,因此,要想更仔细地查看这个锁链,就需要将数据加载到一个跟踪表里,并利用EventSequence列依正确的顺序重建发生过的事情。

同性能分析一样,SQL跟踪并不能实际解决死锁状态,但是可以提供较多的数据以帮助确定原因并接近解决方案。

时间: 2024-10-10 15:11:28

SQL Server Profiler -- 调试死锁的相关文章

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语句,直接使用ORM框架的系统处理数据库的项目,在调试sql语句时,给了很大的帮助. 之前写了使用SQL Server Profiler追踪死锁的文章<SQL Server Profiler追踪数据库死锁>,这里再简单写SQL Server Profiler使用过程中常用到的功能. 这里使用SQL Server 2008 R2版本 1. 在安装SQL Server 数据库时,请保证安装了SQL Se

通过SQL Server Profiler来监视分析死锁

在两个或多个SQL Server进程中,每一个进程锁定了其他进程试图锁定的资源,就会出现死锁,例如,进程process1对table1持有1个排它锁(X),同时process1对table2请求1个排它锁(X),进程process2对table2持有1个排它锁(X),同时process2对table1请求1个排它锁(X) 类似这种情况,就会出现死锁,除非当某个外部进程断开死锁,否则死锁中的两个事务都将无限期等待下去. Microsoft SQL Server 数据库引擎死锁监视器定期检查陷入死锁

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

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

Sql Server Profiler保存与重演跟踪

重演跟踪的作用 可以将一个跟踪当做测试工具,当按照正确的顺序调用某些存储过程是肯能会重新生成特定的故障. 跟踪模板 保存跟踪有四个选项(文件->另存为) 1. 跟踪文件选项用来将数据保存成二进制格式的文件中,保存数据最快速,同时也是占用磁盘字节最少的方法. 2. 跟踪表选项用来将数据保存至用户选择的数据库中一个新的或预先创建好的表.适用于适用T-SQL 操作或报告数据. 3. 跟踪XML文件选项将数据保存到一个XML格式的文件中. 4. 重演跟踪XML文件选项将数据保存至一个XML文本文件,但是

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的优化与监视(SQL Server Profiler)

0.简介 SQL Server 供给号码大全 SQL 盯梢和事情告诉来监督数据库引擎中发作关键词挖掘工具的事情. 通过记载指定事情,SQL 盯梢能够协助您处置功用疑问.审阅数据库活动.搜集用于测验环境的示例数据.调试 Transact-SQL 句子和存储进程以及为功用剖析东西搜集数据.能够通过 SQL Server Profiler(一个图形用户界面)或在命令行输入的 Transact-SQL 体系存储进程拜访 SQL 盯梢. 运转时,SQL 盯梢在数据库引擎中的事情发作时捕获事情.捕获的事情是