Sql Server监控发布订阅复制Replication、subscription的报错、延迟时间、未发送的命令行数量

监控要点
1、采集distribution.dbo.MSrepl_commands显示的复制的命令行数量
2、采集distribution.dbo.MSdistribution_status显示的未发送的命令行数量
3、采集distribution.dbo.sp_replmonitorhelpsubscription显示的延迟时间
4、采集distribution库中MSlogreader_history、MSdistribution_history、MSsnapshot_history、MSrepl_errors、sysreplicationalerts五表显示的报错信息

当复制的命令行数量超过某个阀值 或 未发送的命令行数量超过某个阀值 或 延迟时间超过某个阀值 或 有报错信息就报警

–代码如下

USE [DBA]
GO
SET QUOTED_IDENTIFIER ON
GO


/****** Crate Date: 2021-10-28  ******/
/****** Author:  Lukes.Liao ******/

CREATE PROCEDURE [dba].[usp_Check_replicaton_undelivery_lantency]
as begin
declare @ReplCmd_count int 
declare @UndeliveryCmd_count int 
declare @Delivery_latency int 
declare @error_count1 int 
declare @error_count2 int
declare @error_count3 int 
declare @error_count4 int
declare @error_count5 int 

--distribution.dbo.MSrepl_commands rows and sizes
IF OBJECT_ID('tempdb..#replication_tempTbl') IS NOT NULL
BEGIN
	DROP TABLE #replication_tempTbl
END

CREATE TABLE #replication_tempTbl
(
	table_name VARCHAR(30)
	,row_count BIGINT
	,reserved_space VARCHAR(30)
	,data_space VARCHAR(30)
	,index_size VARCHAR(30)
	,unused_space VARCHAR(30)
)
INSERT INTO #replication_tempTbl
EXEC Wondadb3.distribution..sp_spaceused 'MSrepl_commands'
SELECT @ReplCmd_count=row_count FROM #replication_tempTbl




--replicaton undelivery cmds
select @UndeliveryCmd_count=max(UndelivCmdsInDistDB) from wondadb3.[distribution].[dbo].MSdistribution_status with(nolock)




--replicaton latency
IF OBJECT_ID('tempdb..#replication_tempTb2') is not null
BEGIN
	Drop table #replication_tempTb2
END

CREATE TABLE #replication_tempTb2
(
status int,	
warning int,	
subscriber VARCHAR(100),	
subscriber_db VARCHAR(100),	
publisher_db VARCHAR(100),	
publication	VARCHAR(100), 
publication_type int,
subtype int,	
latency	int,
latencythreshold int,	
agentnotrunning	int,
agentnotrunningthreshold int,	
timetoexpiration int,	
expirationthreshold int,	
last_distsync datetime, 	
distribution_agentname VARCHAR(100),	
mergeagentname VARCHAR(100),	
mergesubscriptionfriendlyname VARCHAR(100),	
mergeagentlocation	VARCHAR(100),
mergeconnectiontype	int,
mergePerformance int,	
mergerunspeed float,	
mergerunduration int,	
monitorranking int,	
distributionagentjobid binary(16),
mergeagentjobid binary(16),	
distributionagentid	int,
distributionagentprofileid	int,
mergeagentid int,	
mergeagentprofileid	int,
logreaderagentname VARCHAR(100),	
publisher VARCHAR(100)
)

exec Wondadb3.distribution.dbo.sp_replmonitorhelpsubscription @publisher_db ='wondb',@publication_type=0
insert into #replication_tempTb2  
exec Wondadb3.distribution.dbo.sp_replmonitorhelpsubscription @publisher_db ='wondb',@publication_type=0
select @Delivery_latency=max(latency) from #replication_tempTb2 where latency>0  and subscriber='DBPROD131A'



--the lastest 1 hour errors
select @error_count1=count(*) from Wondadb3.[distribution].[dbo].[MSlogreader_history] where error_id != 0 AND [time] >= DATEADD(HOUR, -1, GETDATE()) 
select @error_count2=count(*) from Wondadb3.[distribution].[dbo].[MSdistribution_history] WHERE error_id != 0 AND [time] >= DATEADD(HOUR, -1, GETDATE())  
select @error_count3=count(*) from Wondadb3.[distribution].[dbo].[MSsnapshot_history] WHERE error_id != 0 AND [time] >= DATEADD(HOUR, -1, GETDATE())  
select @error_count4=count(*) from Wondadb3.[distribution].[dbo].MSrepl_errors where error_code!='' and [time] >= DATEADD(HOUR, -1, GETDATE())  
select @error_count5=count(*) from Wondadb3.msdb.dbo.sysreplicationalerts where error_id != 0 AND [time] >= DATEADD(HOUR, -1, GETDATE()) 





--If achieve threshhold then send email
if(@ReplCmd_count>50000000 or @UndeliveryCmd_count>300000 or @Delivery_latency>3600 or @error_count1>0 or @error_count2>0 or @error_count3>0 or @error_count4>0 or @error_count5>0)
begin

DECLARE @Body NVARCHAR(MAX)

--Email Body Part1
SET @Body =
'<html>
<body style="font-family:Arial">
    <tr>
		<b>MSrepl_commands count>50000000 or Undelivery_commands count>300000 or Delivery_latency>3600 or errors will trigger to send this email,DBAS please have a look</b>
	</tr>
	<br> </br>
	<br> </br>
    <tr>
		<b>MSrepl_commands Table Information:</b>
	</tr>
<table style="font-family:Arial; border-collapse: collapse">
	<thead style="font-size:14px; color:#FFF">
		<tr>
			<th style="background:#0074D9; border:1px solid #ddd; padding:6px 10px">Table_name</th>
			<th style="background:#0074D9; border:1px solid #ddd; padding:6px 10px">Row_count</th>
			<th style="background:#0074D9; border:1px solid #ddd; padding:6px 10px">Reserved_space</th>
			<th style="background:#0074D9; border:1px solid #ddd; padding:6px 10px">Unused_space</th>
		</tr>
	</thead>
	<tbody style="font-size:12px; color:#666">
'

SELECT
	@Body +=
'	<tr>
		<td style="border:1px solid #ddd; padding:6px 10px">' + table_name + '</td>
		<td style="border:1px solid #ddd; padding:6px 10px">' + CONVERT(varchar(50),row_count) + '</td> 
		<td style="border:1px solid #ddd; padding:6px 10px">' + reserved_space + '</td> 
		<td style="border:1px solid #ddd; padding:6px 10px">' + unused_space + '</td> 
    </tr>
'
from #replication_tempTbl

SET @Body += 
'	</tbody>
</table>
</body>
</html>'



--Email Body Part2
SET @Body += 
'<html>
<body style="font-family:Arial">
    <br> </br>
    <tr>
		<b>Undelivery Commands Information:</b>
	</tr>
<table style="font-family:Arial; border-collapse: collapse">
	<thead style="font-size:14px; color:#FFF">
		<tr>
			<th style="background:#0074D9; border:1px solid #ddd; padding:6px 10px">Publication_name</th>
			<th style="background:#0074D9; border:1px solid #ddd; padding:6px 10px">Publisher_db</th>
			<th style="background:#0074D9; border:1px solid #ddd; padding:6px 10px">Table_name</th>
			<th style="background:#0074D9; border:1px solid #ddd; padding:6px 10px">UndelivCmds_count</th>
            <th style="background:#0074D9; border:1px solid #ddd; padding:6px 10px">Subscrip_agent_name</th>
		</tr>
	</thead>
	<tbody style="font-size:12px; color:#666">
'

select top 10
	@Body +=
'	<tr>
		<td style="border:1px solid #ddd; padding:6px 10px">' + b.publication + '</td>
		<td style="border:1px solid #ddd; padding:6px 10px">' + b.publisher_db + '</td> 
		<td style="border:1px solid #ddd; padding:6px 10px">' + c.article + '</td> 
		<td style="border:1px solid #ddd; padding:6px 10px">' + CONVERT(varchar(50),a.UndelivCmdsInDistDB) + '</td> 
        <td style="border:1px solid #ddd; padding:6px 10px">' + b.name + '</td> 
    </tr>
'
from Wondadb3.[distribution].[dbo].MSdistribution_status a with(nolock)  
inner join Wondadb3.[distribution].[dbo].MSdistribution_agents b with(nolock) on a.agent_id=b.id
inner join Wondadb3.[distribution].[dbo].MSarticles c with(nolock) on a.article_id=c.article_id and 
b.publisher_db=c.publisher_db and a.UndelivCmdsInDistDB>0 
order by UndelivCmdsInDistDB desc

SET @Body += 
'	</tbody>
</table>
</body>
</html>'



--Email Body Part3
SET @Body += 
'<html>
<body style="font-family:Arial">
    <br> </br>
    <tr>
		<b colspan="4">Latency Information:</b>
	</tr>
<table style="font-family:Arial; border-collapse: collapse">
	<thead style="font-size:14px; color:#FFF">
		<tr>
			<th style="background:#0074D9; border:1px solid #ddd; padding:6px 10px">Publisher_db</th>
			<th style="background:#0074D9; border:1px solid #ddd; padding:6px 10px">Publication_name</th>
			<th style="background:#0074D9; border:1px solid #ddd; padding:6px 10px">Subscriber_server</th>
			<th style="background:#0074D9; border:1px solid #ddd; padding:6px 10px">Subscriber_db</th>
            <th style="background:#0074D9; border:1px solid #ddd; padding:6px 10px">Latency_seconds</th>
		</tr>
	</thead>
	<tbody style="font-size:12px; color:#666">
'

select top 10 
	@Body +=
'	<tr>
		<td style="border:1px solid #ddd; padding:6px 10px">' + publisher_db + '</td>
		<td style="border:1px solid #ddd; padding:6px 10px">' + publication + '</td> 
		<td style="border:1px solid #ddd; padding:6px 10px">' + subscriber + '</td> 
		<td style="border:1px solid #ddd; padding:6px 10px">' + subscriber_db + '</td> 
        <td style="border:1px solid #ddd; padding:6px 10px">' + CONVERT(varchar(50),latency) + '</td> 
    </tr>
'
from #replication_tempTb2 where latency>0 
and subscriber='DBPROD131A' order by latency desc

SET @Body += 
'	</tbody>
</table>
</body>
</html>'


--Email Body Part4
SET @Body += 
'<html>
<body style="font-family:Arial">
    <br> </br>
    <tr>
		<b colspan="4">MSlogreader_history Error:</b>
	</tr>
<table style="font-family:Arial; border-collapse: collapse">
	<thead style="font-size:14px; color:#FFF">
		<tr>
			<th style="background:#0074D9; border:1px solid #ddd; padding:6px 10px">Publisher_db</th>
			<th style="background:#0074D9; border:1px solid #ddd; padding:6px 10px">Time</th>
			<th style="background:#0074D9; border:1px solid #ddd; padding:6px 10px">Comments</th>
		</tr>
	</thead>
	<tbody style="font-size:12px; color:#666">
'

select top 3 
	@Body +=
'	<tr>
		<td style="border:1px solid #ddd; padding:6px 10px">' + b.publisher_db + '</td>
		<td style="border:1px solid #ddd; padding:6px 10px">' + CONVERT(varchar(50),a.time) + '</td> 
        <td style="border:1px solid #ddd; padding:6px 10px">' + a.comments + '</td> 
    </tr>
'
from Wondadb3.[distribution].[dbo].[MSlogreader_history] a  inner join Wondadb3.distribution.dbo.MSlogreader_agents b
on a.agent_id=b.id and  a.error_id != 0 AND a.[time] >= DATEADD(HOUR, -1, GETDATE()) order by a.time desc

SET @Body += 
'	</tbody>
</table>
</body>
</html>'


--Email Body Part5
SET @Body += 
'<html>
<body style="font-family:Arial">
    <br> </br>
    <tr>
		<b colspan="4">MSdistribution_history Error:</b>
	</tr>
<table style="font-family:Arial; border-collapse: collapse">
	<thead style="font-size:14px; color:#FFF">
		<tr>
			<th style="background:#0074D9; border:1px solid #ddd; padding:6px 10px">Publication</th>
			<th style="background:#0074D9; border:1px solid #ddd; padding:6px 10px">Time</th>
			<th style="background:#0074D9; border:1px solid #ddd; padding:6px 10px">Comments</th>
		</tr>
	</thead>
	<tbody style="font-size:12px; color:#666">
'

select top 3 
	@Body +=
'	<tr>
		<td style="border:1px solid #ddd; padding:6px 10px">' + b.publication + '</td>
		<td style="border:1px solid #ddd; padding:6px 10px">' + CONVERT(varchar(50),a.time) + '</td> 
        <td style="border:1px solid #ddd; padding:6px 10px">' + a.comments + '</td> 
    </tr>
'
from Wondadb3.[distribution].[dbo].[MSdistribution_history] a inner join Wondadb3.distribution.dbo.MSdistribution_agents b
on a.agent_id=b.id and a.error_id != 0 AND a.[time] >= DATEADD(HOUR, -1, GETDATE())  order by a.time desc

SET @Body += 
'	</tbody>
</table>
</body>
</html>'


--Email Body Part6
SET @Body += 
'<html>
<body style="font-family:Arial">
    <br> </br>
    <tr>
		<b colspan="4">MSsnapshot_history Error:</b>
	</tr>
<table style="font-family:Arial; border-collapse: collapse">
	<thead style="font-size:14px; color:#FFF">
		<tr>
			<th style="background:#0074D9; border:1px solid #ddd; padding:6px 10px">Publisher_db</th>
                        <th style="background:#0074D9; border:1px solid #ddd; padding:6px 10px">Publication</th>
			<th style="background:#0074D9; border:1px solid #ddd; padding:6px 10px">Time</th>
			<th style="background:#0074D9; border:1px solid #ddd; padding:6px 10px">Comments</th>
		</tr>
	</thead>
	<tbody style="font-size:12px; color:#666">
'

select top 3 
	@Body +=
'	<tr>
		<td style="border:1px solid #ddd; padding:6px 10px">' + b.publisher_db + '</td>
                <td style="border:1px solid #ddd; padding:6px 10px">' + b.publication + '</td>
		<td style="border:1px solid #ddd; padding:6px 10px">' + CONVERT(varchar(50),a.time) + '</td> 
                <td style="border:1px solid #ddd; padding:6px 10px">' + a.comments + '</td> 
    </tr>
'
from Wondadb3.[distribution].[dbo].[MSsnapshot_history] a inner join distribution.dbo.MSsnapshot_agents b
on a.agent_id=b.id and  a.error_id != 0 AND a.[time] >= DATEADD(HOUR, -1, GETDATE())  order by a.time desc

SET @Body += 
'	</tbody>
</table>
</body>
</html>'


--Email Body Part7
SET @Body += 
'<html>
<body style="font-family:Arial">
    <br> </br>
    <tr>
		<b colspan="4">MSrepl_errors Error:</b>
	</tr>
<table style="font-family:Arial; border-collapse: collapse">
	<thead style="font-size:14px; color:#FFF">
		<tr>
			<th style="background:#0074D9; border:1px solid #ddd; padding:6px 10px">Time</th>
			<th style="background:#0074D9; border:1px solid #ddd; padding:6px 10px">Error_text</th>
		</tr>
	</thead>
	<tbody style="font-size:12px; color:#666">
'

select top 3 
	@Body +=
'	<tr>
		<td style="border:1px solid #ddd; padding:6px 10px">' + CONVERT(varchar(50),time) + '</td> 
        <td style="border:1px solid #ddd; padding:6px 10px">' + error_text + '</td> 
    </tr>
'
from Wondadb3.[distribution].[dbo].MSrepl_errors where error_code!='' and [time] >= DATEADD(HOUR, -1, GETDATE())  order by time desc

SET @Body += 
'	</tbody>
</table>
</body>
</html>'


--Email Body Part8
SET @Body += 
'<html>
<body style="font-family:Arial">
    <br> </br>
    <tr>
		<b colspan="4">Sysreplicationalerts Error:</b>
	</tr>
<table style="font-family:Arial; border-collapse: collapse">
	<thead style="font-size:14px; color:#FFF">
		<tr>
			<th style="background:#0074D9; border:1px solid #ddd; padding:6px 10px">Publisher_db</th>
			<th style="background:#0074D9; border:1px solid #ddd; padding:6px 10px">Publication</th>
			<th style="background:#0074D9; border:1px solid #ddd; padding:6px 10px">Subscriber</th>
			<th style="background:#0074D9; border:1px solid #ddd; padding:6px 10px">Subscriber_db</th>
			<th style="background:#0074D9; border:1px solid #ddd; padding:6px 10px">Time</th>
			<th style="background:#0074D9; border:1px solid #ddd; padding:6px 10px">Error_text</th>
		</tr>
	</thead>
	<tbody style="font-size:12px; color:#666">
'

select top 3 
	@Body +=
'	<tr>
		<td style="border:1px solid #ddd; padding:6px 10px">' + publisher_db + '</td> 
        <td style="border:1px solid #ddd; padding:6px 10px">' + publication + '</td>
		<td style="border:1px solid #ddd; padding:6px 10px">' + subscriber + '</td> 
		<td style="border:1px solid #ddd; padding:6px 10px">' + subscriber_db + '</td>
		<td style="border:1px solid #ddd; padding:6px 10px">' + CONVERT(varchar(50),time) + '</td> 
		<td style="border:1px solid #ddd; padding:6px 10px">' + alert_error_text + '</td>  
    </tr>
'
from Wondadb3.msdb.dbo.sysreplicationalerts where error_id != 0 AND [time] >= DATEADD(HOUR, -1, GETDATE()) order by time desc

SET @Body += 
'	</tbody>
</table>
</body>
</html>'



PRINT @Body


EXECUTE msdb.dbo.sp_send_dbmail
	@subject = N'Wondadb3 Replication to Dbprod131A Issue Alert',
	@recipients = N'[email protected]',
	@body = @Body,
	@body_format = N'HTML';

end
end
GO

猜你喜欢

转载自blog.csdn.net/lusklusklusk/article/details/121039427