一个生成死锁日志的存储过程
1、sysdatabases
Microsoft® SQL Server™ 上的每个数据库在表中占一行。最初安装 SQL Server 时,sysdatabases 包含 master、model、msdb、mssqlweb 和 tempdb 数据库的项。该表只存储在 master 数据库中。
2、sysprocesses
sysprocesses 表中保存关于运行在 Microsoft® SQL Server™ 上的进程的信息。这些进程可以是客户端进程或系统进程。sysprocesses 只存储在 master 数据库中。
3、syslockinfo
包含有关所有已授权、正在转换和正在等待的锁请求的信息。此表是锁管理器内部数据结构的非规范化表格格式视图,只存储在 master 数据库中。
4、sysindexes
数据库中的每个索引和表在表中各占一行。该表存储在每个数据库中。
sysdatabases包含所数据库的信息。
sysprocesses包含当前所有活动的进程。
syslockinfo包含所有阻塞或被阻塞的进程信息。
sysindexes包含所有表名的索引信息。
sysprocesses表的spid字段与syslockinfo表的req_spid对应,
syslockinfo表的rsc_dbid字段与sysdatabases表的dbid对应
syslockinfo表的rsc_objid字段与sysindexes(该表在当前被锁的库中)的字段id对应。
请将以下表与存储过程新建在master数据库中。
表:
1
CREATE TABLE [custom_ProcessesLog] (
2
[ID] [numeric](18, 0) IDENTITY (1, 1) NOT NULL ,
3
[blockedCount] [int] NULL ,
4
[isblocked] [bit] NULL ,
5
[spidList] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,
6
[blockedList] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,
7
[tableList] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,
8
[buildDate] [datetime] NOT NULL CONSTRAINT [DF_ServerRunInfo_InputTime] DEFAULT (getdate())
9
) ON [PRIMARY]
10
GO
存储过程:
1
CREATE Procedure custom_BuildProcesses AS
2
3
Declare
4
@i int,
5
@forCount int,
6
7
@spid smallint,
8
@blocked smallint,
9
@dbid smallint,
10
@objid int,
11
@dbname varchar(128),
12
@tablename varchar(128),
13
14
@blockedCount int,
15
@isblocked bit,
16
@spidList varchar(255),
17
@blockedList varchar(255),
18
@tableList varchar(255),
19
@blockedDate datetime,
20
21
@query nvarchar(800);
22
23
Create Table #Stack(spid smallint, blocked smallint, isblocked bit)
24
25
INSERT INTO #Stack Select * From (
26
select spid, blocked, case when spid in (
27
select blocked from master.dbo.sysprocesses) then '1' else '0' end As isblocked from master.dbo.sysprocesses) As T1 where T1.isblocked='1'
28
29
Select @forCount=Count(*) From #Stack
30
31
select @i = 0, @blockedCount=@forCount, @isblocked=case when @forCount>0 then 1 else 0 end, @spidList='',
32
@blockedList='', @tableList='', @blockedDate=getDate()
33
34
while @i<@forCount
35
begin
36
select top 1 @spid=spid, @blocked=blocked from #Stack
37
delete from #Stack where spid=@spid
38
39
select @dbid=rsc_dbid, @objid=rsc_objid from master.dbo.syslockinfo where (req_spid = @spid) AND (rsc_type = 5) --得到数据库ID和表的引ID
40
select @dbname=name from master.dbo.sysdatabases where dbid=@dbid -- 跟据数据库ID得到数据库名称
41
select @query=('select @tablename=name from '+@dbname+'.dbo.sysindexes where id='+str(@objid))
42
exec sp_executesql @query, N'@tablename varchar(128) out',
43
@tablename out
44
select @spidList = @spidList+RTrim(Ltrim(Str(@spid)))+',', @blockedList = @blockedList+RTrim(Ltrim(Str(@blocked )))+',',
45
@tableList = @tableList+RTrim(LTrim(@tablename))+','
46
select @i = @i+1
47
end
48
49
insert into custom_ProcessesLog (blockedCount, isblocked, spidList, blockedList, tableList) values(@blockedCount, @isblocked, @spidList, @blockedList, @tableList)
50
GO
51
52
版权所有 2004 cjsh 保留所有权利。欢迎转载,请注明出处:http://www.cnblogs.com/cjsh