关于SQLServer死锁的诊断和定位
发布时间:2020-12-12 15:32:19 所属栏目:MsSql教程 来源:网络整理
导读:关于 SQLServer 死锁的诊断和定位 在 SQLServer 中经常会发生死锁情况,必须连接到企业管理 器― 管理― 当前活动― 锁 / 进程 ID 去查找相关死锁进程和定位死锁的原因。 通过查询分析器也要经过多个系统表 (sysprocesses,sysobjects 等 ) 和系统存储过程 (s
关于 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,12)???????? 被锁进程用户机器名称, SUBSTRING(DB_NAME(dbid),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),? 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 ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- sql-server – SQL Server 2008 R2错误:15023,用户,组或角
- 回归命令行 SQLServer的命令行工具们(1) --dta.exe
- SQLServer的聚集索引和非聚集索引
- 每个分类取最新的几条的SQL实现代码
- CSharp基础起步第十三期---SqlServer 基础02(SQL语句入门)
- SQLServer拆分字符串的三种方法
- tSQL – 从varchar到numeric的转换适用于除整数之外的所有内
- MAC下mysql安装配置方法图文教程
- sql-server – Bacpac导出错误
- sql-server – 如何从SQL Server 2005中的MDF恢复数据库?