SqlServer 总体分析死锁进程

SqlServer 总体分析死锁进程,第1张

概述--首先,开启死锁跟踪一段时间DBCC TRACEON(1222,-1)DBCC TRACESTATUS 日志记录的死锁信息如图,只是其中的一个死锁信息: 现在不分析死锁,只分析参与死锁的所有进程信息和死锁的对象信息。 --搜索当前日志中参与死锁的进程信息(第一个参数代表日志,现在查看2个日志)exec xp_readerrorlog 0,1,'process id=process',NUL

--首先,开启死锁跟踪一段时间DBCC TRACEON(1222,-1)DBCC TRACESTATUS

日志记录的死锁信息如图,只是其中的一个死锁信息:



现在不分析死锁,只分析参与死锁的所有进程信息和死锁的对象信息。


--搜索当前日志中参与死锁的进程信息(第一个参数代表日志,现在查看2个日志)exec xp_readerrorlog 0,1,'process ID=process',NulL,'2015-03-01','2015-03-12','ASC' exec xp_readerrorlog 1,'ASC'




将【text】列拷贝到txt文件中。


使用数据库导入导出工具将txt数据导入到表,只1列数据
(不要以空格分列,因为有很多是不对齐的,所以全部作为1列)




--导入后:--将有用的信息提取成各列,插入到新表中--	DROP table dbo.DeadlockProcSELECT  LTRIM(RTRIM(substring(col,CHARINDEX('currentdb',col)+LEN('currentdb='),CHARINDEX('lockTimeout',col)-CHARINDEX('currentdb',col)-LEN('currentdb=')))) AS currentdb,LTRIM(RTRIM(substring(col,CHARINDEX('waitresource',col)+LEN('waitresource='),CHARINDEX('waittime',col)-CHARINDEX('waitresource',col)-LEN('waitresource=')))) AS waitresource,col)+LEN('waittime='),CHARINDEX('ownerID',col)-CHARINDEX('waittime',col)-LEN('waittime=')))) AS waittime,col)+LEN('ownerID='),CHARINDEX('transactionname',col)-CHARINDEX('ownerID',col)-LEN('ownerID=')))) AS ownerID,CHARINDEX('lockMode',col)+LEN('lockMode='),CHARINDEX('schedulerID',col)-CHARINDEX('lockMode',col)-LEN('lockMode=')))) AS lockMode,CHARINDEX('clIEntapp',col)+LEN('clIEntapp='),CHARINDEX('hostname',col)-CHARINDEX('clIEntapp',col)-LEN('clIEntapp=')))) AS clIEntapp,col)+LEN('hostname='),CHARINDEX('hostpID',col)-CHARINDEX('hostname',col)-LEN('hostname=')))) AS hostname,CHARINDEX('loginname',col)+LEN('loginname='),CHARINDEX('isolationlevel',col)-CHARINDEX('loginname',col)-LEN('loginname=')))) AS loginname,CHARINDEX('trancount',col)+LEN('trancount='),CHARINDEX('lastbatchstarted',col)-CHARINDEX('trancount',col)-LEN('trancount=')))) AS trancount,col)+LEN('lastbatchstarted='),CHARINDEX('lastbatchcompleted',col)-CHARINDEX('lastbatchstarted',col)-LEN('lastbatchstarted=')))) AS lastbatchstarted,col)+LEN('lastbatchcompleted='),col)-CHARINDEX('lastbatchcompleted',col)-LEN('lastbatchcompleted=')))) AS lastbatchcompletedINTO dbo.DeadlockProcFROM dbo.LOCK 

select top 10 * from DeadlockProc



部分分析:

--参与死锁的客户进程数SELECT top 30 loginname,COUNT(*) CNT FROM DeadlockProc GROUP BY loginname ORDER BY CNT DESC--哪台主机连接参与最多SELECT top 30 hostname,COUNT(*) CNT FROM DeadlockProc GROUP BY hostname ORDER BY CNT DESC--请求哪些锁模式导致死锁SELECT top 30 lockMode,COUNT(*) CNT FROM DeadlockProc GROUP BY lockMode ORDER BY CNT DESC----按小时查看死锁主要发生在什么时段SELECT left(lastbatchstarted,13) hours,COUNT(*) CNT FROM DeadlockProc GROUP BY left(lastbatchstarted,13) ORDER BY hours--等待的锁资源数;WITH TAB AS(select  LTRIM(RTRIM(left(waitresource,CHARINDEX(':',waitresource)-1))) AS lockResource,LTRIM(RTRIM(left(LTRIM(RTRIM(RIGHT(waitresource,LEN(waitresource)-CHARINDEX(':',waitresource)))),LTRIM(RTRIM(RIGHT(waitresource,waitresource)))))-1))) AS Database_ID,REPLACE(left(REVERSE(left(REVERSE(waitresource),REVERSE(waitresource))-1)),CHARINDEX('(',REVERSE(left(REVERSE(waitresource),REVERSE(waitresource))-1)))),'(','') AS hobt_ID,LTRIM(RTRIM(SUBSTRING(waitresource,waitresource),CHARINDEX(')',waitresource)-CHARINDEX('(',waitresource)+1))) KeyHashfrom DeadlockProc) select lockResource,COUNT(*) cnt from tab group by lockResource


------------------------------------------------------------------------------------------------------------------------------------------------------
--也可以按相同方法把锁资源也导入到数据库中exec xp_readerrorlog 0,'indexname','hobtID','ASC'  exec xp_readerrorlog 1,'ASC'  

--	DROP table dbo.resourceListTempSELECT * FROM dbo.resourceListTemp--	DROP table dbo.ResourceListSELECT LTRIM(RTRIM(left(col,CHARINDEX('hobtID',col)-1))) AS lockResource,CHARINDEX('dbID',col)+LEN('dbID='),CHARINDEX('objectname',col)-CHARINDEX('dbID',col)-LEN('dbID=')))) AS dbID,col)+LEN('objectname='),CHARINDEX('indexname',col)-CHARINDEX('objectname',col)-LEN('objectname=')))) AS objectname,col)+LEN('indexname='),CHARINDEX('ID=lock',col)-CHARINDEX('indexname',col)-LEN('indexname=')))) AS indexname,CHARINDEX('mode',col)+LEN('mode='),CHARINDEX('associatedobjectID',col)-CHARINDEX('mode',col)-LEN('mode=')))) AS modeINTO dbo.ResourceList FROM dbo.resourceListTemp SELECT * FROM ResourceList



分析:

--参与死锁的这些资源中,哪些表索引请求什么模式导致死锁SELECT objectname,indexname,lockResource,mode,COUNT(*) CNTFROM ResourceList GROUP BY objectname,modeORDER BY CNT DESC


--锁粒度及请求模式统计SELECT lockResource,COUNT(*) CNTFROM ResourceList GROUP BY lockResource,modeORDER BY CNT DESC

总结

以上是内存溢出为你收集整理的SqlServer 总体分析死锁进程全部内容,希望文章能够帮你解决SqlServer 总体分析死锁进程所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/sjk/1161260.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存