查杀死锁

来源:互联网 发布:演讲倒计时软件 编辑:程序博客网 时间:2024/05/16 06:52
Create Proc [dbo].[p_lockinfo]          @kill_lock_spid      Bit = 1, --是否杀掉死锁的进程,1 杀掉, 0 仅显示          @show_spid_if_nolock Bit = 1 --如果没有死锁的进程,是否显示正常进程信息,1 显示,0 不显示                                     As  Declare    @count Int,    @s     Nvarchar(1000),    @i     Int  Select   id = Identity(Int,1,1),           标志,           进程ID = spid,           线程ID = kpid,           块进程ID = blocked,           数据库ID = dbid,           数据库名 = Db_name(dbid),           用户ID = uid,           用户名 = loginame,           累计CPU时间 = cpu,           登陆时间 = login_time,           打开事务数 = open_tran,           进程状态 = status,           工作站名 = hostname,           应用程序名 = program_name,           工作站进程ID = hostprocess,           域名 = nt_domain,           网卡地址 = net_address  Into     #t  From     (Select 标志 = '死锁的进程',                   spid,                   kpid,                   a.blocked,                   dbid,                   uid,                   loginame,                   cpu,                   login_time,                   open_tran,                   status,                   hostname,                   program_name,                   hostprocess,                   nt_domain,                   net_address,                   s1 = a.spid,                   s2 = 0            From   master..sysprocesses a                   Join (Select   blocked                         From     master..sysprocesses                         Group By blocked) b                     On a.spid = b.blocked            Where  a.blocked = 0            Union All            Select '|_牺牲品_>',                   spid,                   kpid,                   blocked,                   dbid,                   uid,                   loginame,                   cpu,                   login_time,                   open_tran,                   status,                   hostname,                   program_name,                   hostprocess,                   nt_domain,                   net_address,                   s1 = blocked,                   s2 = 1            From   master..sysprocesses a            Where  blocked <> 0) a  Order By s1,           s2  Select @count =@@ rowcount,         @i = 1  If @count = 0     And @show_spid_if_nolock = 1    Begin      Insert #t      Select 标志 = '正常的进程',             spid,             kpid,             blocked,             dbid,             Db_name(dbid),             uid,             loginame,             cpu,             login_time,             open_tran,             status,             hostname,             program_name,             hostprocess,             nt_domain,             net_address      From   master..sysprocesses      Set @count =@@ rowcount    End  If @count > 0    Begin      Create Table #t1 (        id        Int Identity( 1  , 1  ),        a         Nvarchar(30),        b         Int,        EventInfo Nvarchar(255))      If @kill_lock_spid = 1        Begin          Declare            @spid Varchar(10),            @标志   Varchar(10)          While @i <= @count            Begin              Select @spid = 进程ID,                     @标志 = 标志              From   #t              Where  id = @i              Insert #t1              Exec( 'dbcc inputbuffer(' + @spid + ')')              If @标志 = '死锁的进程'                Exec( 'kill ' + @spid)              Set @i = @i + 1            End        End       Else        While @i <= @count          Begin            Select @s = 'dbcc inputbuffer(' + Cast(进程ID As Varchar) + ')'            From   #t            Where  id = @i            Insert #t1            Exec( @s)            Set @i = @i + 1          End      Select a.*,             进程的SQL语句 = b.EventInfo      From   #t a             Join #t1 b               On a.id = b.id    End


Create Proc [dbo].[p_killspid]           @dbname Varchar(200) --要关闭进程的数据库名           As  Declare    @sql Nvarchar(500)  Declare    @spid Nvarchar(20)  Declare #tb Cursor  For  Select spid = Cast(spid As Varchar(20))  From   master..sysprocesses  Where  dbid = Db_id(@dbname)  Open #tb  Fetch Next From #tb  Into @spid  While @@fetch_status = 0    Begin      Exec( 'kill ' + @spid)      Fetch Next From #tb      Into @spid    End  Close #tb  Deallocate #tb



0 0
原创粉丝点击