ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

【SQLServer】sqlserver死锁检测

2022-08-24 18:36:07  阅读:188  来源: 互联网

标签:sqlserver der SQLServer 死锁 spid WHERE id SELECT


--1.通过以下dmvs方式

SELECT
	dowt.session_id
	,dowt.wait_duration_ms
	,dowt.wait_type
	,dowt.blocking_session_id
	,dese.host_name as HostName
	,der.command
	,der.percent_complete
	,der.cpu_time
	,der.total_elapsed_time
	,der.reads
	,der.writes
	,der.logical_reads
	,der.row_count
	,dest.text AS QueryText
	,dest.dbid AS DatabaseID
	,deqp.query_plan
	,der.plan_handle
FROM sys.dm_os_waiting_tasks as dowt
INNER JOIN sys.dm_exec_sessions as dese
	ON dowt.session_id = dese.session_id
INNER JOIN sys.dm_exec_requests as der
	ON dese.session_id = der.session_id
CROSS APPLY sys.dm_exec_sql_text(der.plan_handle) as dest
CROSS APPLY sys.dm_exec_query_plan(der.plan_handle) as deqp
WHERE dowt.session_id > 50

  

--2.通过sysprocesses查看死锁
--查询死锁脚本

USE master 
GO
DECLARE @spid INT,@bl INT 
DECLARE s_cur CURSOR FOR 
SELECT 0,blocked 
FROM
	( SELECT * FROM sysprocesses WHERE blocked > 0 ) a 
WHERE
	NOT EXISTS ( SELECT * FROM ( SELECT * FROM sysprocesses WHERE blocked > 0 ) b WHERE a.blocked= spid ) 
UNION
SELECT
	spid,blocked 
FROM
	sysprocesses 
WHERE
	blocked > 0 
OPEN s_cur FETCH NEXT 
FROM
	s_cur INTO @spid,@bl
WHILE @@FETCH_STATUS = 0 
BEGIN
		IF @spid = 0 
			SELECT ' 引起数据库死锁的是: ' + CAST ( @bl AS VARCHAR ( 10 ) ) + ' 进程号, 其执行的SQL 语法如下' 
		ELSE 
			SELECT ' 进程号SPID :' + CAST ( @spid AS VARCHAR ( 10 ) ) + ' 被' + ' 进程号SPID :' + CAST ( @bl AS VARCHAR ( 10 ) ) + ' 阻塞, 其当前进程执行的SQL 语法如下' 
DBCC INPUTBUFFER ( @bl ) FETCH NEXT 
FROM
s_cur INTO @spid,@bl 
END CLOSE s_cur 
DEALLOCATE s_cur 
EXEC sp_who2



--杀死锁脚本:

SELECT
	* 
FROM
	master.dbo.sysprocesses 
WHERE
	spid > 50 
	AND waittype = 0x0000 
	AND waittime = 0 
	AND status = 'sleeping' 
	AND last_batch < dateadd( MINUTE, - 10, getdate( ) ) 
	AND login_time < dateadd( MINUTE, - 10, getdate( ) ) 
DECLARE
	hcforeach CURSOR GLOBAL FOR SELECT
	'kill ' + rtrim( spid ) 
FROM
	master.dbo.sysprocesses 
WHERE
	spid > 50 
	AND waittype = 0x0000 
	AND waittime = 0 
	AND status = 'sleeping' 
	AND last_batch < dateadd( MINUTE, - 60, getdate( ) ) 
AND login_time < dateadd( MINUTE, - 60, getdate( ) ) EXEC sp_msforeach_worker '?'


--3.以下是备用方案:
--查询死锁

SELECT request_session_id spid,OBJECT_NAME(resource_associated_entity_id)tableName
FROM sys.dm_tran_locks
WHERE resource_type='OBJECT'

--杀死死锁

KILL 155

 

--显示死锁相关信息

exec sp_who2 137


参考原文:https://www.cnblogs.com/guangang/articles/9242028.html

 

标签:sqlserver,der,SQLServer,死锁,spid,WHERE,id,SELECT
来源: https://www.cnblogs.com/abclife/p/16621154.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有