启动SQLServer的死锁检查

server|sqlserver

对于数据库死锁,通常可以通过TRACE FLAG 1204、1205、1206,检查ERRORLOG里面的输出,和分析SQLTRACE的执行上下文判断死锁问题的来由。
TRACEON函数的第三个参数设置为-1,表示不单单针对当前connection,而是针对所有包括未来建立
的connection。这样,才够完全,否则只是监视当前已经建立的数据库连接了。

 

执行下面的话可以把死锁记录到Errorlog中:

dbcc traceon (1204, 3605, -1)
go
dbcc tracestatus(-1)
go

  

 

得到的输出为:

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
TraceFlag Status
--------- ------
1204      1
1205      1
3605      1

(所影响的行数为 3 行)

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

  

   

 

 

 

 

此后,你可以查看数据库的例行日志,每隔一段时间,数据库都会检查死锁,日志文本如下所示:

2004-01-16 18:34:38.50 spid4     ----------------------------------
2004-01-16 18:34:38.50 spid4     Starting deadlock search 1976

 

2004-01-16 18:34:38.50 spid4     Target Resource Owner:
2004-01-16 18:34:38.50 spid4      ResType:LockOwner Stype:'OR' Mode: U SPID:55 ECID:0 Ec:(0xAA577570) Value:0x4c25cba0
2004-01-16 18:34:38.50 spid4      Node:1  ResType:LockOwner Stype:'OR' Mode: U SPID:55 ECID:0 Ec:(0xAA577570) Value:0x4c25cba0
2004-01-16 18:34:38.50 spid4      Node:2  ResType:LockOwner Stype:'OR' Mode: U SPID:71 ECID:0 Ec:(0xABF07570) Value:0x9bd0ba00
2004-01-16 18:34:38.50 spid4    
2004-01-16 18:34:38.50 spid4     -- next branch --
2004-01-16 18:34:38.50 spid4      Node:2  ResType:LockOwner Stype:'OR' Mode: U SPID:71 ECID:0 Ec:(0xABF07570) Value:0x9bd0ba00
2004-01-16 18:34:38.50 spid4    
2004-01-16 18:34:38.50 spid4    
2004-01-16 18:34:38.50 spid4     End deadlock search 1976 ... a deadlock was not found.
2004-01-16 18:34:38.50 spid4     ----------------------------------

 

 

 

 

 

 

 

 

 

附录:
DBCC TRACEON
打开(启用)指定的跟踪标记。

 

注释
跟踪标记用于自定义某些控制 Microsoft SQL Server? 操作方式的特性。跟踪标记在服务器中
一直保持启用状态,直到通过执行 DBCC TRACEOFF 语句对其禁用为止。在发出 DBCC TRACEON
语句之前,连入到服务器的新连接看不到任何跟踪标记。一旦发出该语句,该连接就能看到服务
器中当前启用的所有跟踪标记(即使这些标记是由其它连接启用)。

跟踪标记
跟踪标记用于临时设置服务器的特定特征或关闭特定行为。如果启动 Microsoft SQL Server
时设置了跟踪标记 3205,将禁用磁带驱动程序的硬件压缩。跟踪标记经常用于诊断性能问题,
或调试存储过程或复杂的计算机系统。

下列跟踪标记在 SQL Server 中可用。

跟踪标记

描述

1204

返回参与死锁的锁的类型以及当前受影响的命令。

 

实际上可以在“错误 1000 -1999”中找到他们:

 

1204

19

SQL Server 此时无法获取 LOCK 资源。请在活动用户数较少时重新运行您的语句,或者请求系统管理员检查 SQL Server 锁和内存配置。

1205

13

事务(进程 ID %1!)与另一个进程已被死锁在资源 {%2!} 上,且该事务已被选作死锁牺牲品。请重新运行该事务。

1206

18

事务管理器已取消了分布式事务。

 

 

时间: 2024-10-04 10:57:30

启动SQLServer的死锁检查的相关文章

[SQL]启动SQLServer的死锁检查

server|sqlserver 启动SQLServer的死锁检查Report Date:   2003/12/11 Prepared by:     郑昀 Article last modified on 2004-2-16 The information in this article applies to: ü        Microsoft SQL Server 2000,7.0陈述:对于数据库死锁,通常可以通过TRACE FLAG 1204.1205.1206,检查ERRORLOG里

Linux下程序启动之后的初始化---检查配置文件及读取日志配置项的值

概述 最近,我对本开发组的几位新员工所编写的程序进行了代码走查,发现他们的代码都有一个共同的问题:缺少必要的初始化.在本文中,我将详细介绍程序在启动时所必须要进行的初始化操作,并用实际的C代码予以说明. 对于一般的程序来说,在启动时所必须要进行的初始化操作有两个:检查配置文件及读取日志配置项.对于检查配置文件,主要检查配置文件是否是规定的文件类型(后缀是否正确)及是否存放在了规定的目录下(一般存放在当前用户的etc目录下):对于读取日志配置项,主要将写日志文件相关的参数(如日志级别.日志文件最大

查询Sqlserver数据库死锁的一个存储过程分享_MsSql

使用sqlserver作为数据库的应用系统,都避免不了有时候会产生死锁, 死锁出现以后,维护人员或者开发人员大多只会通过sp_who来查找死锁的进程,然后用sp_kill杀掉.利用sp_who_lock这个存储过程,可以很方便的知道哪个进程出现了死锁,出现死锁的问题在哪里. 创建sp_who_lock存储过程 CREATE procedure sp_who_lock as begin declare @spid int declare @blk int declare @count int de

查找sqlserver查询死锁源头的方法 sqlserver死锁监控_MsSql

查找出SQLServer的死锁和阻塞的源头 --查找出SQLServer死锁和阻塞的源头 复制代码 代码如下: use mastergodeclare @spid int,@bl intDECLARE s_cur CURSOR FORselect  0 ,blockedfrom (select * from sysprocesses where  blocked>0 ) awhere not exists(select * from (select * from sysprocesses whe

sqlserver进程死锁关闭的方法_MsSql

1.首先我们需要判断是哪个用户锁住了哪张表. --查询被锁表 select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_type='OBJECT' 查询后会返回一个包含spid和tableName列的表. 其中spid是进程名,tableName是表名. 2.了解到了究竟是哪个进程锁了哪张表后,需要通过进程找到锁

sqlserver进程死锁关闭的方法

1.首先我们需要判断是哪个用户锁住了哪张表. --查询被锁表 select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_type='OBJECT' 查询后会返回一个包含spid和tableName列的表. 其中spid是进程名,tableName是表名. 2.了解到了究竟是哪个进程锁了哪张表后,需要通过进程找到锁

查找sqlserver查询死锁源头的方法 sqlserver死锁监控

查找出SQLServer的死锁和阻塞的源头 --查找出SQLServer死锁和阻塞的源头 复制代码 代码如下:use mastergodeclare @spid int,@bl intDECLARE s_cur CURSOR FORselect  0 ,blockedfrom (select * from sysprocesses where  blocked>0 ) awhere not exists(select * from (select * from sysprocesses wher

SQLServer中死锁产生的原因及解决办法

server|sqlserver|解决 其实所有的死锁最深层的原因就是一个:资源竞争表现一:一个用户A 访问表A(锁住了表A),然后又访问表B另一个用户B 访问表B(锁住了表B),然后企图访问表A这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B,才能继续,好了他老人家就只好老老实实在这等了同样用户B要等用户A释放表A才能继续这就死锁了解决方法:这种死锁是由于你的程序的BUG产生的,除了调整你的程序的逻辑别无他法仔细分析你程序的逻辑,1:尽量避免同时锁定两个资源2: 必须同时锁定两个资源

SQL Server常见错误(1)“无法打开用户默认数据库,登录失败” (2)系统密码改变后无法启动SQLServer

server|sqlserver|错误|数据|数据库 无法打开用户默认数据库,登录失败,这也是SQL Server使用者熟悉的问题之一.在使用企业管理器.查询分析器.各类工具和应用软件的时候,只要关系到连接SQL Server数据库的时候,都有可能会碰到此问题,引起此错误发生的原因比较多,下面我们就来详细分析引起此问题的原因以及解决办法. 一.原因登录帐户的默认数据库被删除. 二.解决方法:(一).使用管理员帐户修改此帐户的默认数据库1.打开企业管理器,展开服务器组,然后展开服务器2. 展开"安