死锁和杀死死锁进程

1. SQL数据库账号登录

  1. 双击 SQL Server Managemant Studio”登录,如下图所示:

    2Q==

     

9k=

 

 

登录后,SQL Server Managemant Studio 如下图所示:
  1. 9k=

     

2. 查找死锁进程的方法和杀掉死锁进程
  1. 方法一  执行SQL脚本

    1.1  选择数据库àrispacs  à右键dbo.register à 编写表脚本为à SELECT à新查询编辑窗口 单击,如下图所示:

    9k=

     

     

    1.2 打开后执行如下SQL语句:

     

DECLARE @spid INT ,

            @bl INT ,

            @intTransactionCountOnEntry INT ,

            @intRowcount INT ,

            @intCountProperties INT ,

            @intCounter INT

 

        CREATE TABLE #tmp_lock_who

            (

              id INT IDENTITY(1, 1) ,

              spid SMALLINT ,

              bl SMALLINT

            )

 

        INSERT INTO #tmp_lock_who ( spid, bl )

                SELECT 0, blocked

                    FROM ( SELECT *

                            FROM sys.sysprocesses

                            WHERE blocked > 0

                         ) a

                    WHERE NOT EXISTS ( SELECT *

                                        FROM ( SELECT *

                                                FROM sys.sysprocesses

                                                WHERE blocked > 0

                                             ) b

                                        WHERE a.blocked = spid )

                UNION

                SELECT spid, blocked

                    FROM sys.sysprocesses

                    WHERE blocked > 0

 

       -- 找到临时表的记录数

        SELECT @intCountProperties = COUNT(*), @intCounter = 1

            FROM #tmp_lock_who

 

        IF @intCountProperties = 0

            SELECT N'现在没有阻塞和死锁信息' AS message

       -- 循环开始

        WHILE @intCounter <= @intCountProperties

            BEGIN

              -- 取第一条记录

                SELECT @spid = spid, @bl = bl

                    FROM #tmp_lock_who

                    WHERE Id = @intCounter

                BEGIN

                    IF @spid = 0

                        SELECT N'引起数据库死锁的是: ' + CAST(@bl AS VARCHAR(10))

                                + N'进程号,其执行的SQL语法如下'

                    ELSE

                        SELECT N'进程号SPID' + CAST(@spid AS VARCHAR(10))

                                + N'被进程号SPID' + CAST(@bl AS VARCHAR(10)) N'阻塞,其当前进程执行的SQL语法如下'

                    DBCC INPUTBUFFER (@bl )

                END

              -- 循环指针下移

                SET @intCounter = @intCounter + 1

            END

        DROP TABLE #tmp_lock_who

 

运行结果如下图所示:

9k=

1.3   如果没有死锁,message值为“现在没有阻塞和死锁信息“;如果有死锁,会显示具体引起阻塞的进程和被阻塞的进程信息,直接用命令 Kill spid(进程号)杀死引起死锁的进程。如上图。

 

 如果有死锁,会显示具体引起阻塞的进程和被阻塞的进程信息,如下图。

首先鼠标右键拷贝SQL语句并把SQL语句保存下来

然后用命令 Kill spid(进程号)杀死引起死锁的进程。

最后把拷贝的SQL语句提交给DBA。这一步很重要,DBA只有知道引起死锁的原因,才能从根源上解决问题,避免此类事件再次发生。



 


 

2. 方法二   任务管理器

   2.1 选择管理à活动监视器à查看进程,如下图所示:



2Q==

2.2 点击打开活动监视器后,将页面底部窗口滑动条向右拖,找到阻塞者字段,如图:

9k=2Q==


    2.3 “阻塞“值为“0“表示当前进程没有引起阻塞;如果 阻塞值为”1“,表示当前进程引起阻塞,用命令: kill spid 杀掉进程。

 

3. 方法三    sp_lock

 3.1 选择数据库àrispacs  à右键dbo.register à 编写表脚本为à SELECT à新查询编辑窗口 单击,如下图所示:9k=

 

    3.2  去除里面的代码,输入命令: sp_lock,然后点击执行按钮,结果出来后在字段Mode” 中找到值为 X“,或”“IX的进程,如下图所示:jxL4HytOyCJBNe5tAAAAAElFTkSuQmCC 

  3.3  如果找到”Mode”值为“X“或”IX“的进程,使用命令:kill spid(这里换成具体的进程号) 杀掉。


4. 其他方法   

当然还有很多方法查看死锁进程,比如:

4.1  sp_who

4.2 使用profiler捕获死锁

4.3 使用DBCC捕获死锁

4.4 使用 Service Broker Event Notification捕获死锁

4.5 ……….

 

处理死锁的方法很多,在此不一一列举。

建议使用脚本查询(方法一),能更快更有效的定位问题! 有兴趣的可以多研究,多和总部运维交流。

 

 


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26435490/viewspace-1472710/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26435490/viewspace-1472710/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值