USE [DBA]
GO
/****** Object: StoredProcedure [dbo].[BlockingAlert] Script Date: 18/02/2016 13:09:57 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--select * from BlockingMonitoring
--USE [DBA]
--GO
--select @@SERVERNAME
--[BlockingAlert] 'KCRCSTVSQL410\I01'
ALTER procedure [dbo].[BlockingAlert]
(
@datasource sysname
)
As begin
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[BlockingMonitoring]')
AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[BlockingMonitoring](
[WaitInSeconds] [bigint]
NULL,
[BlockingSessionId] [int]
NULL,
[BlockingUser] [nvarchar](128) NOT NULL,
[BlockingSQL] [nvarchar](max) NULL,
[WhyBlocked] [nvarchar](60) NULL,
[BlockedSessionId] [smallint]
NULL,
[BlockedUser] [nvarchar](128) NULL,
[BlockedSQL] [nvarchar](max) NULL,
[DatabaseName] [nvarchar](128) NULL,
[Programname] [nvarchar](32) NULL,
[datereceived] date null
) ON [PRIMARY] TEXTIMAGE_ON
[PRIMARY]
END
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[BlockingAnalysis]')
AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[BlockingAnalysis](
[WaitInSeconds] [bigint]
NULL,
[BlockingSessionId] [int]
NULL,
[BlockingUser] [nvarchar](128) NOT NULL,
[BlockingSQL] [nvarchar](max) NULL,
[WhyBlocked] [nvarchar](60) NULL,
[BlockedSessionId] [smallint]
NULL,
[BlockedUser] [nvarchar](128) NULL,
[BlockedSQL] [nvarchar](max) NULL,
[DatabaseName] [nvarchar](128) NULL,
[Programname] [nvarchar](32) NULL,
[datereceived] date null
) ON [PRIMARY] TEXTIMAGE_ON
[PRIMARY]
END
SELECT
Waits.wait_duration_ms / 1000 AS WaitInSeconds,
Blocking.session_id as BlockingSessionId
, Sess.login_name AS BlockingUser
, BlockingSQL.text AS BlockingSQL
, Waits.wait_type WhyBlocked
, Blocked.session_id AS BlockedSessionId
, USER_NAME(Blocked.user_id) AS BlockedUser
, BlockedSQL.text AS BlockedSQL
, DB_NAME(Blocked.database_id) AS DatabaseName
,Sess.client_interface_name as
Programname
into #blockingAnalysis
FROM sys.dm_exec_connections
AS Blocking
INNER JOIN sys.dm_exec_requests AS Blocked
ON Blocking.session_id = Blocked.blocking_session_id
INNER JOIN sys.dm_os_waiting_tasks AS
Waits
ON Blocked.session_id = Waits.session_id
RIGHT OUTER JOIN sys.dm_exec_sessions Sess
ON Blocking.session_id = sess.session_id
CROSS APPLY sys.dm_exec_sql_text(Blocking.most_recent_sql_handle)
AS BlockingSQL
CROSS APPLY sys.dm_exec_sql_text(Blocked.sql_handle) AS BlockedSQL
ORDER BY BlockingSessionId, BlockedSessionId
select * from #blockingAnalysis
-- is currently any blocking ...if it's
no then proceed below step
if @@rowcount=0
Begin
select 'Spid' +' '+cast(B.BlockedSessionId as varchar)+' '+'released by'+' '+cast(B.BlockingSessionId as varchar) as BlockingStatus,B.*
into #blockingrelease
from [BlockingMonitoring]
as B
Left outer join #blockingAnalysis
as BA
on BA.BlockingSessionId=B.BlockingSessionId and BA.BlockedSessionId=B.BlockedSessionId
where BA.BlockingSessionId is null and BA.BlockedSessionId is null and B.WaitInSeconds>=120
--is it latest blocking resolved and
released ? if it's yes then proceed the below step
if @@rowcount>0
Begin
DECLARE @bodyMsg nvarchar(max)
DECLARE @subject nvarchar(max)
DECLARE @tableHTML nvarchar(max)
Declare @srvname sysname
select @srvname=srvname from sys.sysservers where datasource=@datasource
SET @subject = 'Blocking automatically
resolved' +' '+ 'in' + ' ' + @srvname
--set @bodyMsg='Please contact DBA team
to resolve this Blocking issue'
SET @tableHTML =
N'
#box-table
{
font-family: "Lucida Sans
Unicode", "Lucida Grande", Sans-Serif;
font-size: 15px;
text-align: center;
border-collapse: collapse;
border-top: 7px solid #9baff1;
border-bottom: 7px solid #9baff1;
}
#box-table th
{
font-size: 20px;
font-weight: normal;
background: #b9c9fe;
border-right: 2px solid #9baff1;
border-left: 2px solid #9baff1;
border-bottom: 2px solid #9baff1;
color: #039;
}
#box-table td
{
border-right: 1px solid #aabcfe;
border-left: 1px solid #aabcfe;
border-bottom: 1px solid #aabcfe;
color: #669;
}
tr:nth-child(odd) { background-color:#eee; }
tr:nth-child(even) { background-color:#fff; }
'+
N'
Blocking Alert
' +
N'
BlockingStatus |
WaitInSeconds |
BlockingSessionId |
BlockingUser
|
BlockingSQL
|
WhyBlocked
|
BlockedSessionId |
BlockedUser
|
BlockedSQL
|
DatabaseName
|
Programname
|
'
+
CAST ( (
SELECT td = CAST(BlockingStatus AS VARCHAR(100)),'',
td = CAST(WaitInSeconds AS VARCHAR(100)),'',
td = CAST(BlockingSessionId AS VARCHAR(100)),'',
td = CAST(BlockingUser AS VARCHAR(100)),'',
td = CAST(BlockingSQL AS VARCHAR(100)),'',
td = CAST(WhyBlocked AS VARCHAR(100)),'',
td = CAST(BlockedSessionId AS VARCHAR(100)),'',
td = CAST(BlockedUser AS VARCHAR(100)),'',
td = CAST(BlockedSQL AS VARCHAR(100)),'',
td = CAST(DatabaseName AS VARCHAR(100)),'',
td = CAST(Programname AS VARCHAR(100))
FROM #blockingrelease
FOR XML PATH('tr'), TYPE
) AS NVARCHAR(MAX) ) +
N'
'
+
N'
Blocking Status - Resolved Automatically
'
EXEC msdb.dbo.sp_send_dbmail
@profile_name='db_profile name',
@recipients='xxxxxxx',
--@copy_recipients ='xxxxxx',
@subject = @subject1,
@body = @tableHTML1,
@body_format = 'HTML' ;
Delete from [BlockingMonitoring]
output DELETED.* INTO [BlockingAnalysis] where
[WaitInSeconds]>=120
Drop table #blockingrelease
End
else
print 'validation check 2 : No Release
Email Alert'
End
Else
print 'validation check 1 :No Release
Email Alert'
drop table #blockingAnalysis
--for releasing the spid and Analysis
purpose
INSERT INTO [dbo].[BlockingMonitoring]
([WaitInSeconds]
,[BlockingSessionId]
,[BlockingUser]
,[BlockingSQL]
,[WhyBlocked]
,[BlockedSessionId]
,[BlockedUser]
,[BlockedSQL]
,[DatabaseName]
,[Programname]
,[datereceived])
SELECT
Waits.wait_duration_ms / 1000 AS WaitInSeconds,
Blocking.session_id as BlockingSessionId
, Sess.login_name AS BlockingUser
, BlockingSQL.text AS BlockingSQL
, Waits.wait_type WhyBlocked
, Blocked.session_id AS BlockedSessionId
, USER_NAME(Blocked.user_id) AS BlockedUser
, BlockedSQL.text AS BlockedSQL
, DB_NAME(Blocked.database_id) AS DatabaseName
,Sess.client_interface_name as
Programname
,getdate() as datereceived
FROM sys.dm_exec_connections
AS Blocking
INNER JOIN sys.dm_exec_requests AS Blocked
ON Blocking.session_id = Blocked.blocking_session_id
INNER JOIN sys.dm_os_waiting_tasks AS
Waits
ON Blocked.session_id = Waits.session_id
RIGHT OUTER JOIN sys.dm_exec_sessions Sess
ON Blocking.session_id = sess.session_id
CROSS APPLY sys.dm_exec_sql_text(Blocking.most_recent_sql_handle)
AS BlockingSQL
CROSS APPLY sys.dm_exec_sql_text(Blocked.sql_handle) AS BlockedSQL
ORDER BY BlockingSessionId, BlockedSessionId
SELECT
Waits.wait_duration_ms / 1000 AS WaitInSeconds,
Blocking.session_id as BlockingSessionId
, Sess.login_name AS BlockingUser
, BlockingSQL.text AS BlockingSQL
, Waits.wait_type WhyBlocked
, Blocked.session_id AS BlockedSessionId
, USER_NAME(Blocked.user_id) AS BlockedUser
, BlockedSQL.text AS BlockedSQL
, DB_NAME(Blocked.database_id) AS DatabaseName
,Sess.client_interface_name as
Programname
into #backupmonitoring
FROM sys.dm_exec_connections
AS Blocking
INNER JOIN sys.dm_exec_requests AS Blocked
ON Blocking.session_id = Blocked.blocking_session_id
INNER JOIN sys.dm_os_waiting_tasks AS
Waits
ON Blocked.session_id = Waits.session_id
RIGHT OUTER JOIN sys.dm_exec_sessions Sess
ON Blocking.session_id = sess.session_id
CROSS APPLY sys.dm_exec_sql_text(Blocking.most_recent_sql_handle)
AS BlockingSQL
CROSS APPLY sys.dm_exec_sql_text(Blocked.sql_handle) AS BlockedSQL
ORDER BY BlockingSessionId, BlockedSessionId
select WaitInSeconds from #backupmonitoring
where WaitInSeconds>=120
if @@ROWCOUNT>0
begin
DECLARE @bodyMsg1 nvarchar(max)
DECLARE @subject1 nvarchar(max)
DECLARE @tableHTML1 nvarchar(max)
Declare @srvname1 sysname
select @srvname1=srvname from sys.sysservers where datasource=@datasource
SET @subject1 = 'Blocking Alert' +' '+ 'in' + ' ' + @srvname1
SET @tableHTML1 =
N'
#box-table
{
font-family: "Lucida Sans
Unicode", "Lucida Grande", Sans-Serif;
font-size: 15px;
text-align: center;
border-collapse: collapse;
border-top: 7px solid #9baff1;
border-bottom: 7px solid #9baff1;
}
#box-table th
{
font-size: 20px;
font-weight: normal;
background: #b9c9fe;
border-right: 2px solid #9baff1;
border-left: 2px solid #9baff1;
border-bottom: 2px solid #9baff1;
color: #039;
}
#box-table td
{
border-right: 1px solid #aabcfe;
border-left: 1px solid #aabcfe;
border-bottom: 1px solid #aabcfe;
color: #669;
}
tr:nth-child(odd) { background-color:#eee; }
tr:nth-child(even) { background-color:#fff; }
'+
N'
Blocking Alert
' +
N'
WaitInSeconds |
BlockingSessionId |
BlockingUser
|
BlockingSQL
|
WhyBlocked
|
BlockedSessionId |
BlockedUser
|
BlockedSQL
|
DatabaseName
|
Programname
|
'
+
CAST ( (
SELECT td = CAST(WaitInSeconds AS VARCHAR(100)),'',
td = CAST(BlockingSessionId AS VARCHAR(100)),'',
td = CAST(BlockingUser AS VARCHAR(100)),'',
td = CAST(BlockingSQL AS VARCHAR(100)),'',
td = CAST(WhyBlocked AS VARCHAR(100)),'',
td = CAST(BlockedSessionId AS VARCHAR(100)),'',
td = CAST(BlockedUser AS VARCHAR(100)),'',
td = CAST(BlockedSQL AS VARCHAR(100)),'',
td = CAST(DatabaseName AS VARCHAR(100)),'',
td = CAST(Programname AS VARCHAR(100))
FROM #backupmonitoring
FOR XML PATH('tr'), TYPE
) AS NVARCHAR(MAX) ) +
N'
'
+
N'
Please contact DBA team to resolve this Blocking
issue
'
EXEC msdb.dbo.sp_send_dbmail
@profile_name='db_profile name',
@recipients='xxxxxxx',
--@copy_recipients
='xxxxxx',
@subject = @subject1,
@body = @tableHTML1,
@body_format =
'HTML' ;
End
else
print 'No Blocking Alert Email'
Drop table #backupmonitoring
End
No comments:
Post a Comment