检测死锁:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1
declare
@spid
int,
2 @bl int,
3 @intTransactionCountOnEntry int,
4 @intRowcount int,
5 @intCountProperties int,
6 @intCounter int
7 create table #tmp_lock_who
8 ( id int identity( 1, 1),
9 spid smallint,
10 bl smallint
11 )
12 IF @@ERROR <> 0
13 print @@ERROR
14 insert into #tmp_lock_who(spid,bl)
15 select 0 ,blocked from ( select * from sysprocesses where blocked > 0 ) a
16 where not exists( select * from ( select * from sysprocesses where blocked > 0 ) b where a.blocked =spid)
17 union
18 select spid,blocked from sysprocesses where blocked > 0
19 IF @@ERROR <> 0
20 print @@ERROR
21 -- 找到临时表的记录数
22 select @intCountProperties = Count( *), @intCounter = 1 from #tmp_lock_who
23 IF @@ERROR <> 0
24 print @@ERROR
25 if @intCountProperties = 0
26 select ' 现在没有阻塞和死锁信息 ' as message
27 -- 循环开始
28 while @intCounter <= @intCountProperties
29 begin
30 -- 取第一条记录
31 select @spid = spid, @bl = bl from #tmp_lock_who
32 where Id = @intCounter
33 begin
34 if @spid = 0
35 select ' 引起数据库死锁的是: ' + CAST( @bl AS VARCHAR( 10)) + ' 进程号,其执行的SQL语法如下 '
36 else
37 select ' 进程号SPID: ' + CAST( @spid AS VARCHAR( 10)) + ' 被 ' + ' 进程号SPID: ' + CAST( @bl AS VARCHAR( 10)) + ' 阻塞,其当前进程执行的SQL语法如下 ' DBCC INPUTBUFFER ( @bl ) end
38 -- 循环指针下移
39 set @intCounter = @intCounter + 1
40 end
41 drop table #tmp_lock_who
2 @bl int,
3 @intTransactionCountOnEntry int,
4 @intRowcount int,
5 @intCountProperties int,
6 @intCounter int
7 create table #tmp_lock_who
8 ( id int identity( 1, 1),
9 spid smallint,
10 bl smallint
11 )
12 IF @@ERROR <> 0
13 print @@ERROR
14 insert into #tmp_lock_who(spid,bl)
15 select 0 ,blocked from ( select * from sysprocesses where blocked > 0 ) a
16 where not exists( select * from ( select * from sysprocesses where blocked > 0 ) b where a.blocked =spid)
17 union
18 select spid,blocked from sysprocesses where blocked > 0
19 IF @@ERROR <> 0
20 print @@ERROR
21 -- 找到临时表的记录数
22 select @intCountProperties = Count( *), @intCounter = 1 from #tmp_lock_who
23 IF @@ERROR <> 0
24 print @@ERROR
25 if @intCountProperties = 0
26 select ' 现在没有阻塞和死锁信息 ' as message
27 -- 循环开始
28 while @intCounter <= @intCountProperties
29 begin
30 -- 取第一条记录
31 select @spid = spid, @bl = bl from #tmp_lock_who
32 where Id = @intCounter
33 begin
34 if @spid = 0
35 select ' 引起数据库死锁的是: ' + CAST( @bl AS VARCHAR( 10)) + ' 进程号,其执行的SQL语法如下 '
36 else
37 select ' 进程号SPID: ' + CAST( @spid AS VARCHAR( 10)) + ' 被 ' + ' 进程号SPID: ' + CAST( @bl AS VARCHAR( 10)) + ' 阻塞,其当前进程执行的SQL语法如下 ' DBCC INPUTBUFFER ( @bl ) end
38 -- 循环指针下移
39 set @intCounter = @intCounter + 1
40 end
41 drop table #tmp_lock_who
杀死死锁和进程
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1
declare
@sql
nvarchar(
500)
2 declare @spid nvarchar( 20)
3 declare #tb cursor for select spid = cast(spid as varchar( 20)) from master..sysprocesses -- where dbid=db_id(@dbname)
4 open #tb
5 fetch next from #tb into @spid
6 while @@fetch_status = 0
7 begin
8 exec( ' kill ' + @spid)
9 fetch next from #tb into @spid
10 end
11 close #tb
12 deallocate #tb
2 declare @spid nvarchar( 20)
3 declare #tb cursor for select spid = cast(spid as varchar( 20)) from master..sysprocesses -- where dbid=db_id(@dbname)
4 open #tb
5 fetch next from #tb into @spid
6 while @@fetch_status = 0
7 begin
8 exec( ' kill ' + @spid)
9 fetch next from #tb into @spid
10 end
11 close #tb
12 deallocate #tb
查看锁进程
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1
create
table #t
2 (req_spid int,
3 obj_name sysname)
4 declare @s nvarchar( 4000),
5 @rid int,
6 @dbname sysname,
7 @id int,
8 @objname sysname
9 declare tb cursor for
10 select distinct req_spid,dbname = db_name(rsc_dbid),rsc_objid
11 from master..syslockinfo where rsc_type in( 4, 5)
12 open tb
13 fetch next from tb into @rid, @dbname, @id
14 while @@fetch_status =0 begin
15 set @s = ' select @objname=name from [ ' + @dbname + ' ]..sysobjects where id=@id '
16 exec sp_executesql @s,N ' @objname sysname out,@id int ', @objname out, @id
17 insert into #t values( @rid, @objname)
18 fetch next from tb into @rid, @dbname, @id
19 end
20 close tb
21 deallocate tb
22 select 进程id =a.req_spid
23 ,数据库 = db_name(rsc_dbid)
24 ,类型 = case rsc_type when 1 then ' NULL 资源(未使用) '
25 when 2 then ' 数据库 '
26 when 3 then ' 文件 '
27 when 4 then ' 索引 '
28 when 5 then ' 表 '
29 when 6 then ' 页 '
30 when 7 then ' 键 '
31 when 8 then ' 扩展盘区 '
32 when 9 then ' RID(行 ID) '
33 when 10 then ' 应用程序 '
34 end
35 ,对象id =rsc_objid
36 ,对象名 =b.obj_name
37 ,rsc_indid from master..syslockinfo a left join #t b on a.req_spid =b.req_spid
38 go
39 drop table #t
2 (req_spid int,
3 obj_name sysname)
4 declare @s nvarchar( 4000),
5 @rid int,
6 @dbname sysname,
7 @id int,
8 @objname sysname
9 declare tb cursor for
10 select distinct req_spid,dbname = db_name(rsc_dbid),rsc_objid
11 from master..syslockinfo where rsc_type in( 4, 5)
12 open tb
13 fetch next from tb into @rid, @dbname, @id
14 while @@fetch_status =0 begin
15 set @s = ' select @objname=name from [ ' + @dbname + ' ]..sysobjects where id=@id '
16 exec sp_executesql @s,N ' @objname sysname out,@id int ', @objname out, @id
17 insert into #t values( @rid, @objname)
18 fetch next from tb into @rid, @dbname, @id
19 end
20 close tb
21 deallocate tb
22 select 进程id =a.req_spid
23 ,数据库 = db_name(rsc_dbid)
24 ,类型 = case rsc_type when 1 then ' NULL 资源(未使用) '
25 when 2 then ' 数据库 '
26 when 3 then ' 文件 '
27 when 4 then ' 索引 '
28 when 5 then ' 表 '
29 when 6 then ' 页 '
30 when 7 then ' 键 '
31 when 8 then ' 扩展盘区 '
32 when 9 then ' RID(行 ID) '
33 when 10 then ' 应用程序 '
34 end
35 ,对象id =rsc_objid
36 ,对象名 =b.obj_name
37 ,rsc_indid from master..syslockinfo a left join #t b on a.req_spid =b.req_spid
38 go
39 drop table #t
查看阻塞信息
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1
SELECT SPID
=p.spid,
2
3 DBName = convert( CHAR( 20),d.name),
4
5 ProgramName = program_name,
6
7 LoginName = convert( CHAR( 20),l.name),
8
9 HostName = convert( CHAR( 20),hostname),
10
11 Status = p.status,
12
13 BlockedBy = p.blocked,
14
15 LoginTime = login_time,
16
17 QUERY = CAST( TEXT AS VARCHAR( MAX))
18
19 FROM MASTER.dbo.sysprocesses p
20
21 INNER JOIN MASTER.dbo.sysdatabases d
22
23 ON p.dbid = d.dbid
24
25 INNER JOIN MASTER.dbo.syslogins l
26
27 ON p.sid = l.sid
28
29 CROSS APPLY sys.dm_exec_sql_text(sql_handle)
30
31 WHERE p.blocked = 0
32 and d.name = ' 数据库名字 '
33
34 AND EXISTS ( SELECT 1
35
36 FROM MASTER..sysprocesses p1
37
38 WHERE p1.blocked = p.spid)
2
3 DBName = convert( CHAR( 20),d.name),
4
5 ProgramName = program_name,
6
7 LoginName = convert( CHAR( 20),l.name),
8
9 HostName = convert( CHAR( 20),hostname),
10
11 Status = p.status,
12
13 BlockedBy = p.blocked,
14
15 LoginTime = login_time,
16
17 QUERY = CAST( TEXT AS VARCHAR( MAX))
18
19 FROM MASTER.dbo.sysprocesses p
20
21 INNER JOIN MASTER.dbo.sysdatabases d
22
23 ON p.dbid = d.dbid
24
25 INNER JOIN MASTER.dbo.syslogins l
26
27 ON p.sid = l.sid
28
29 CROSS APPLY sys.dm_exec_sql_text(sql_handle)
30
31 WHERE p.blocked = 0
32 and d.name = ' 数据库名字 '
33
34 AND EXISTS ( SELECT 1
35
36 FROM MASTER..sysprocesses p1
37
38 WHERE p1.blocked = p.spid)
枚举索引
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 SELECT 索引名称 = a.name , 2 表名 = c.name , 3 索引字段名 = d.name , 4 索引字段位置 = d.colid, 5 c.crdate 6 FROM sysindexes a 7 JOIN sysindexkeys b ON a.id = b.id 8 AND a.indid = b.indid 9 JOIN sysobjects c ON b.id = c.id 10 JOIN syscolumns d ON b.id = d.id 11 AND b.colid = d.colid 12 WHERE a.indid NOT IN ( 0, 255 ) 13 -- and c.xtype='U' and c.status>0 --查所有用户表 14 --AND c.name = 'ORDER' --查指定表 15 ORDER BY 16 c.crdate desc, 17 c.name , 18 a.name ,