关于SQLServer死锁的诊断和定位

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:
关于 SQLServer 死锁的诊断和定位
在 SQLServer 中经常会发生死锁情况,必须连接到企业管理 器— > 管理— > 当前活动— > 锁 / 进程 ID 去查找相关死锁进程和定位死锁的原因。
通过查询分析器也要经过多个系统表 (sysprocesses,sysobjects 等 ) 和系统存储过程 (sp_who,sp_who2,sp_lock 等 ) ,而且不一定能够直接定位到。
本存储过程参考 sp_lock_check 和 sysprocesses 系统表,同时利用了 DBCC 命令,直接将死锁和造成死锁的进程和相关语句列出,以方便分析和定位。
Create procedure sp_check_deadlock            
as
set nocount on
 /*
select
spid    被锁进程 ID,
 blocked 锁进程 ID,
 status  被锁状态 ,
SUBSTRING(SUSER_SNAME(sid),1,30) 被锁进程登陆帐号 ,
 SUBSTRING(hostname,1,12)         被锁进程用户机器名称 ,
SUBSTRING(DB_NAME(dbid),1,10)    被锁进程数据名称 ,
cmd 被锁进程命令 ,
 waittype 被锁进程等待类型 
FROM master..sysprocesses

WHERE blocked>0
--dbcc inputbuffer(66) 输出相关锁进程的语句 
-- 创建锁进程临时表 
CREATE TABLE #templocktracestatus ( 
  EventType varchar(100),
  Parameters INT,
  EventInfo varchar(200)
)
(
-- 创建被锁进程临时表 
CREATE TABLE #tempbelocktracestatus (
  EventType varchar(100),
  Parameters INT,  EventInfo varchar(200)
)
-- 创建之间的关联表 
CREATE TABLE #locktracestatus (
  belockspid INT,
  belockspidremark varchar(20),
  belockEventType varchar(100),
  belockEventInfo varchar(200),
lockspid INT
  lockspidremark  varchar(20)
  lockEventType   varchar(100)
  lockEventInfo   varchar(200)
  )

-- 获取死锁进程
DECLARE dbcc_inputbuffer CURSOR READ_ONLY
FOR select spid 被锁进程 ID,blocked 锁进程 ID
     FROM master..sysprocesses
    WHERE blocked>0
DECLARE @lockedspid int          DECLARE @belockedspid int
OPEN dbcc_inputbuffer

FETCH NEXT FROM dbcc_inputbuffer INTO @belockedspid,@lockedspid
WHILE (@@fetch_status <> -1)
BEGIN
IF (@@fetch_status <> -2)
BEGIN
        --print ' 被堵塞进程 
        --select @belockedspid
--dbcc inputbuffer(@belockedspid
        --print ' 堵塞进程         --select @lockedspid
  --dbcc inputbuffer(@lockedspid)
        INSERT INTO #tempbelocktracestatus
      EXEC('DBCC INPUTBUFFER( '+@belockedspid+')')
        INSERT INTO #templocktracestatus
5b4Eq*y0GpC6517           EXEC('DBCC INPUTBUFFER( '+@lockedspid+')'
        INSERT INTO #locktracestatus
 select @belockedspid,' 被锁进程 ',a.EventType,a.EventInfo,@lockedspid,' 锁进程 
             from #tempbelocktracestatus a,#templocktracestatus b
       END
       FETCH NEXT FROM dbcc_inputbuffer INTO @belockedspid,@lockedspid
END
CLOSE dbcc_inputbuffer
DEALLOCATE dbcc_inputbuffer
select * from #locktracestatus
return (0) -- sp_check_deadlock


 
执行该存储过程
exec sp_check_deadlock 
 
 





本文转自baoqiangwang51CTO博客,原文链接:http://blog.51cto.com/baoqiangwang/313006 ,如需转载请自行联系原作者
相关实践学习
使用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
相关文章
|
SQL 运维 监控
【走进RDS】之SQL Server性能诊断案例分析
数据库性能诊断不仅对其数据库技能要求较高,而且需要大量的前期准备工作,如收集各种性能基线、性能指标和慢SQL日志等,尤其是面对多数据库性能调优时,往往事倍功半。
28448 0
【走进RDS】之SQL Server性能诊断案例分析
|
SQL 索引 数据格式
SQL Server死锁诊断--同一行数据在不同索引操作下引起的死锁
原文:SQL Server死锁诊断--同一行数据在不同索引操作下引起的死锁     死锁概述 对于数据库中出现的死锁,通俗地解释就是:不同Session(会话)持有一部分资源,并且同时相互排他性地申请对方持有的资源,然后双方都得不到自己想要的资源,从而造成的一种僵持的现象。
1646 0
|
SQL 存储 缓存
Sql Server 内存相关计数器以及内存压力诊断
原文:Sql Server 内存相关计数器以及内存压力诊断   在数据库服务器中,内存是数据库对外提供服务最重要的资源之一,  不仅仅是Sql Server,包括其他数据库,比如Oracle,MySQL等,都是一类非常喜欢内存的应用.  在Sql Server服务器中,最理想的情况是Sql Server把所有所需的数据全部缓存到内存中,但是这往往也是不现实的,因为数据往往总是大于可用的物理内存  可以说内存是否存在压力能够直接决定数据库能否高效运行,  同时,如果内存出现压力,同时也会影响到CPU的使用和存储性能,可以说是一损俱损,具有连带性。
1266 0
|
SQL 监控 Go
SQL Server如何定位自定义标量函数被那个SQL调用次数最多浅析
原文:SQL Server如何定位自定义标量函数被那个SQL调用次数最多浅析 前阵子遇到一个很是棘手的问题,监控系统DPA发现某个自定义标量函数被调用的次数非常高,高到一个离谱的程度。然后在Troubleshooting这个问题的时候,确实遇到了一些问题让我很是纠结,下文是解决问题过程的一点思索和尝试,如果你有更好的思路和解决方法,也请多多指教。
956 0
|
SQL Go 数据库
SQL Server中如何定位Row Lock锁定哪一行数据
原文:SQL Server中如何定位Row Lock锁定哪一行数据 在SQL Server中有时候会使用提示(Hint)强制SQL使用行锁(Row Lock),前两天有个同事咨询了一个问题,如何定位Row Lock具体锁定了哪一行。
1078 0
|
SQL 索引
sql server 死锁排查
原文:sql server 死锁排查            记得以前客户在使用软件时,有偶发出现死锁问题,因为发生的时间不确定,不好做问题的重现,当时解决问题有点棘手了。 现总结下查看死锁的常用二种方式: 第一种是图形化监听:   sqlserver -->工具--> sql server profiler   登录后在跟踪属性中选择如下图:        监听到的死锁图形如下图              这里的描述大致是:有二个进程 一个进程ID是96, 另一个ID是348.   系统自动kill 掉了进程ID:96,保留了进程ID:348 的事务Commit。
1318 0