博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Linux下网络分析工具

Posted on 2005-09-03 00:11  飞骐  阅读(229)  评论(0)    收藏  举报

一个生成死锁日志的存储过程

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数据库中。

表:

 1CREATE TABLE [custom_ProcessesLog] (
 2 [ID] [numeric](180IDENTITY (11NOT 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())
 9ON [PRIMARY]
10GO

 

存储过程:

 1CREATE Procedure custom_BuildProcesses AS
 2
 3Declare 
 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
23Create Table #Stack(spid smallint, blocked smallint, isblocked bit)
24
25INSERT INTO #Stack Select * From (
26select 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  
29Select @forCount=Count(*From #Stack
30
31select @i = 0@blockedCount=@forCount@isblocked=case  when @forCount>0 then 1 else 0 end@spidList=''
32  @blockedList=''@tableList=''@blockedDate=getDate()
33
34while @i<@forCount
35begin
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 = @spidAND (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
47end
48
49insert into custom_ProcessesLog (blockedCount, isblocked, spidList, blockedList, tableList) values(@blockedCount@isblocked@spidList@blockedList@tableList)
50GO
51
52


 

版权所有 2004 cjsh 保留所有权利。欢迎转载,请注明出处:http://www.cnblogs.com/cjsh