`
sjk2013
  • 浏览: 2183566 次
文章分类
社区版块
存档分类
最新评论

分享:MSSQL找出发生死锁,阻塞的语句并直接KILL掉

 
阅读更多

USE master 
GO
IF OBJECT_ID('dbo.sp_kill_blocked','P') IS NOT NULL 
DROP PROCEDURE dbo.sp_kill_blocked
GO 
CREATE PROCEDURE dbo.sp_kill_blocked 
AS 
/* 
作者:陈恩辉-弘恩
找出发生死锁,阻塞的语句并直接KILL掉
*/
DECLARE @kill VARCHAR(255) , @dbcc_inputbuffer VARCHAR(255) ;
WITH    cte
          AS ( SELECT   *
               FROM     master.sys.sysprocesses p
               WHERE    p.spid > 50
                        AND p.blocked > 0
             )
    SELECT  @kill = ' kill ' + CAST(blocked AS VARCHAR) ,
            @dbcc_inputbuffer = ' dbcc inputbuffer( ' + CAST(blocked AS VARCHAR) + ')'
    FROM    cte a
    WHERE   NOT EXISTS ( SELECT 1
                         FROM   cte b
                         WHERE  a.blocked = b.spid )
IF @kill IS NOT NULL
    OR @dbcc_inputbuffer IS NOT NULL 
    BEGIN                          
        SELECT  GETDATE() AS exec_time ,
                @kill AS [exec_kill] ,
                @dbcc_inputbuffer AS dbcc_inputbuffer ;
        PRINT @dbcc_inputbuffer 
		PRINT @kill        
        EXEC (@dbcc_inputbuffer)                        
        EXEC (@kill)
    END 
ELSE 
    BEGIN 
        SELECT  GETDATE() AS exec_time ,'没有死锁,请确认!' AS result 
    END 
GO 
 
EXEC sp_Ms_marksystemobject 'sp_kill_blocked'
GO 



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics