SQL Server中如何监控死锁(Deadlock)

SQL Server中如何监控死锁(Deadlock)

什么是死锁?

所谓死锁: 是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象:死锁。

在SQL Server中为了阻止死锁大量充斥在系统中,我们有一个死锁监控的后端线程来帮助解决死锁。

死锁监控线程

如果我们查看sys.dm_os_waiting_tasks,我们可以发现一个系统任务一直处于等待状态:REQUEST_FOR_DEADLOCK_SEARCH。该线程每五秒钟被唤醒,来查看是否有死锁。如果发现死锁,它将结束一个会话。它会杀掉两个会话中的一个,让另一个会话拥有需要的所有资源。

SQL Server会判断,要确保杀掉的是最容易回滚的会话。因为如果SQL Server杀掉一个事务,它所做的任何工作必须回滚到数据库的同步状态。它由LOG USED的值来决定。

我们可以看到上例图杀掉了会话75而不是192,因为会话75使用了648字节日志而会话192使用了944字节。

后端线程每五分钟唤醒检查死锁。如果发现,它遵照上例的流程去决定如何解决。然而,当它第一次唤醒,立马唤醒第二次,确保不是一个嵌套死锁。如果有,会被杀掉,然后返回睡眠状态。下一次唤醒在4.90秒之后(预估唤醒时间花费10毫秒)。每次递减100毫秒,将每秒唤醒10次处理死锁。

如何监控死锁?

方法一:

Windows性能监视器(Performance Monitor)

Object: SQLServer:Locks

Counter: Number of Deadlocks/sec

Instance: _Total

下面的查询提供了自从上次重启以来在本服务器上发生的所有死锁:

SELECT cntr_value AS NumOfDeadLocks
FROM sys.dm_os_performance_counters
WHERE object_name = ‘SQLServer:Locks‘
AND counter_name = ‘Number of Deadlocks/sec‘
AND instance_name = ‘_Total‘

方法二:

跟踪标识(Trace Flags)1204和1222

Trace Flag 1204至少从SQL Server 2000开始存在。Trace Flag 1222从SQL Server 2005被包含进来。两者的死锁信息被记录到SQL Server错误日志(ERRORLOG)。

方法三:

SQL Server Profiler和服务端的SQL Trace

Trace Event Class: Locks Event Name: Deadlock Graph

像上面示例一样给出一个XML图示。非常容易阅读并找出当前正在进行什么动作。

方法四:

扩展事件(Extended Events)

自从SQL Server 2008开始的监控新方式。扩展事件最终会取代SQL Server Profiler(注意:SQL Server Profiler在被放弃属性列表中)。和SQL Server Profiler一样它提供了相同的XML图示,并且在性能影响上更轻量级。

方法五:

System Health

一个新的默认跟踪,但它不像SQL Server默认跟踪(Default Trace)那样有有限数量的跟踪信息且不能修改。我们可以修改system health的定义,它内置于扩展事件中。不像默认跟踪,system health可以跟踪到刚才已经发生过的死锁信息。我们可以从system health获取这些信息用来分析而不用部署我们自己的扩展事件监控。

时间: 2024-10-06 03:27:31

SQL Server中如何监控死锁(Deadlock)的相关文章

(4.7)怎么捕获和记录SQL Server中发生的死锁?

转自:https://blog.csdn.net/c_enhui/article/details/19498327 怎么捕获和记录SQL Server中发生的死锁? sql server如何让错误日志记录死锁 2014年02月19日 18:25:55 阅读数:1313 我们知道,可以使用SQL Server自带的Profiler工具来跟踪死锁信息.但这种方式有一个很大的敝端,就是消耗很大.据国外某大神测试,profiler甚至可以占到服务器总带宽的35%,所以,在一个繁忙的系统中,使用profi

深入浅出SQL Server中的死锁 【转】

简介 死锁的本质是一种僵持状态,是多个主体对于资源的争用而导致的.理解死锁首先需要对死锁所涉及的相关观念有一个理解. 一些基础知识 要理解SQL Server中的死锁,更好的方式是通过类比从更大的面理解死锁.比如说一个经典的例子就是汽车(主体)对于道路(资源)的征用,如图1所示. 图1.对于死锁的直观理解 在图1的例子中,每队汽车都占有一条道路,但都需要另外一队汽车所占有的另一条道路,因此互相阻塞,谁都无法前行,因此造成了死锁.由这个简单的例子可以看出,发生死锁需要四个必要条件,如下: 1)互斥

深入浅出SQL Server中的死锁

简介 死锁的本质是一种僵持状态,是多个主体对于资源的争用而导致的.理解死锁首先需要对死锁所涉及的相关观念有一个理解. 一些基础知识 要理解SQL Server中的死锁,更好的方式是通过类比从更大的面理解死锁.比如说一个经典的例子就是汽车(主体)对于道路(资源)的征用,如图1所示. 图1.对于死锁的直观理解 在图1的例子中,每队汽车都占有一条道路,但都需要另外一队汽车所占有的另一条道路,因此互相阻塞,谁都无法前行,因此造成了死锁.由这个简单的例子可以看出,发生死锁需要四个必要条件,如下: 1)互斥

深入浅出 关于SQL Server中的死锁问题

深入浅出 关于SQL Server中的死锁问题 博客2013-02-12 13:44 分享到:我要吐槽 死锁的本质是一种僵持状态,是多个主体对于资源的争用而导致的.理解死锁首先需要对死锁所涉及的相关观念有一个理解. 一些基础知识 要理解SQL Server中的死锁,更好的方式是通过类比从更大的面理解死锁.比如说一个经典的例子就是汽车(主体)对于道路(资源)的征用,如图1所示. 图1.对于死锁的直观理解 在图1的例子中,每队汽车都占有一条道路,但都需要另外一队汽车所占有的另一条道路,因此互相阻塞,

SQL Server中解决死锁的新方法介绍

SQL Server中解决死锁的新方法介绍 数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁,通过SQL Server 2005, 现在似乎有了一种新的解决办法. 将下面的SQL语句放在两个不同的连接里面,并且在5秒内同时执行,将会发生死锁. <ccid_nobr> <ccid_code>use Northwindbegin tran insert into Orders(CustomerId) values(@#[email protected]#)

SQL Server中解决死锁

SQL Server中解决死锁的新方法介绍 数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁,通过SQL Server 2005, 现在似乎有了一种新的解决办法. 将下面的SQL语句放在两个不同的连接里面,并且在5秒内同时执行,将会发生死锁. <ccid_nobr> <ccid_code>use Northwindbegin tran insert into Orders(CustomerId) values(@#[email protected]#)

十步优化SQL Server中的数据访问(转载)

原文地址:http://tech.it168.com/a2009/1125/814/000000814758.shtml 故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性能表现不错,但随着注册用户的增多,访问速度开始变慢,一些用户开始发来邮件表示抗议,事情变得越来越糟,为了留住用户,你开始着手调查访问变慢的原因. 经过紧张的调查,你发现问题出在数据库上,当应用程序尝试访问/更新数据时,数据库执行得相当慢,再次深入调查数据库后,你发现数据库表增长得很大,有些表

SQL Server中关于跟踪(Trace)那点事

前言 一提到跟踪俩字,很多人想到警匪片中的场景,同样在我们的SQL Server数据库中“跟踪”也是无处不在的,如果我们利用好了跟踪技巧,就可以针对某些特定的场景做定向分析,找出充足的证据来破案. 简单的举几个应用场景: 在线生产库为何突然宕机?数百张数据表为何不翼而飞?刚打好补丁的系统为何屡遭黑手?新添加的信息表为何频频丢失?某张表字段的突然更改,究竟为何人所为?这些个匿名的访问背后,究竟是人是鬼?突然增加的增量数据,究竟是对是错?数百兆的日志爆炸式的增长背后又隐藏着什么?这一且的背后,是应用

SQL Server中关于跟踪(Trace)那点事(转载)

前言 一提到跟踪俩字,很多人想到警匪片中的场景,同样在我们的SQL Server数据库中“跟踪”也是无处不在的,如果我们利用好了跟踪技巧,就可以针对某些特定的场景做定向分析,找出充足的证据来破案. 简单的举几个应用场景: 在线生产库为何突然宕机?数百张数据表为何不翼而飞?刚打好补丁的系统为何屡遭黑手?新添加的信息表为何频频丢失?某张表字段的突然更改,究竟为何人所为?这些个匿名的访问背后,究竟是人是鬼?突然增加的增量数据,究竟是对是错?数百兆的日志爆炸式的增长背后又隐藏着什么?这一且的背后,是应用