34,587
社区成员
发帖
与我相关
我的任务
分享
-- =============================================
-- Author: yng
-- Create date: 2014-11-18
-- Description: 阻塞预警
-- =============================================
CREATE PROCEDURE [dbo].[Proc_DBA_BlockingWarning]
@BlockingWarning INT = 100 --被阻塞的会话数大于@BlockingWarning就预警
AS
BEGIN
SET NOCOUNT ON
--1. 定义表变量,并将阻塞和被阻塞的数据放入表变量
DECLARE @t TABLE (
SPID SMALLINT,
DBName NVARCHAR(128),
Remark NCHAR(3),
[ProgramName] nchar(128),
[LoginName] nchar(128),
HostName nchar(128),
[Status] nchar(30),
BlockedBy SMALLINT,
LoginTime DATETIME,
QUERY nvarchar(max)
)
INSERT INTO @t (
SPID,
DBName,
Remark,
[ProgramName],
[LoginName],
HostName,
[Status],
BlockedBy,
LoginTime,
QUERY
)
SELECT
SPID=p.spid,
DBName = convert(VARCHAR(20),d.name),
Remark = CASE WHEN p.blocked>0 THEN '被阻塞' else '阻塞源' end,
ProgramName = program_name,
LoginName = convert(CHAR(20),l.name),
HostName = convert(CHAR(20),hostname),
Status = p.status,
BlockedBy = p.blocked,
LoginTime = login_time,
QUERY = TEXT
FROM MASTER.dbo.sysprocesses p
LEFT JOIN MASTER.dbo.sysdatabases d
ON p.dbid = d.dbid
LEFT JOIN MASTER.dbo.syslogins l
ON p.sid = l.sid
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
WHERE (p.blocked = 0
AND EXISTS (SELECT 1
FROM MASTER.dbo.sysprocesses p1
WHERE p1.blocked = p.spid))
OR (p.blocked>0)
--2. 如果被阻塞的数量大于设置参数,则
DECLARE @Warning INT
IF (SELECT COUNT(1) FROM @t WHERE BlockedBy>0)>=@BlockingWarning
BEGIN
SET @Warning = 1
END
ELSE
BEGIN
SET @Warning = 0
END
SELECT @Warning AS Warning,
SPID,
DBName,
Remark,
[ProgramName],
[LoginName],
HostName,
[Status],
BlockedBy,
LoginTime,
QUERY
FROM @t
SET NOCOUNT OFF
END
GO
执行了看下。