繁体   English   中英

当来自2个不同服务器的2个SELECT COUNT语句不相等时,如何发送电子邮件警报?

[英]How to send email alert when 2 SELECT COUNT statements from 2 different servers is not equal?

我目前有两台必须始终彼此同步的服务器。 为了监视此情况,我有一个查询正在使用中以检查它们是否相等。 这是查询:

SELECT COUNT (distinct filename) from DB.dbo.Table (nolock)
WHERE SentWhen > '2017-07-17 00:00:00'

关于监视何时丢失同步文件,我遇到了问题。 我需要的是一个脚本或作业,当两个服务器的查询结果不相等或它们的差不等于0时将发送电子邮件警报。我们将不胜感激。

这是解决这个问题的一种方法。 虽然我仍然对此查询感到困惑。

if
(SELECT COUNT (distinct filename) from DB.dbo.Table (nolock)
WHERE SentWhen > '2017-07-17 00:00:00') 
<> 
(SELECT COUNT (distinct filename) from DB2.dbo.Table (nolock)
WHERE SentWhen > '2017-07-17 00:00:00')
begin
...do something like send an email with sp_send_dbmail...
end

但是,正如我所说,我不会认为这是可靠的,尤其是对于您的NOLOCK提示。 如果经常写入这些数据库,则可能会发生种族状况,bandband发挥作用等。但是,如果您相信根据该查询将它们声明为“同步”的方法,那么您将以这种方式发送电子邮件..

@scsimon感谢您为我的问题提供一些见解! 由于我不是DBA,因此我确实无法调整数据库的设置,因此我要做的是创建查询,该查询需要检查传入两个服务器的不同文件之间的差异。

(SELECT (SELECT COUNT (Distinct FileName)
FROM [Server].[Database].[dbo].[Table] with (nolock)
WHERE CONVERT (varchar (19), SentWhen) > 'SpecifiedDate') 
- 
(SELECT COUNT (Distinct FileName)
FROM [OtherServer].[OtherDatabase].[dbo].[OtherTable] with (nolock)
WHERE CONVERT (varchar (19), SentWhen) > 'SpecifiedDate')  AS [Difference])

还有一个查询,它将为我提供每个服务器的当前文件计数。

SELECT PrimarySite = (SELECT (SELECT COUNT (Distinct FileName)
FROM [Server].[Database].[dbo].[Table] with (nolock)
WHERE CONVERT (varchar (19), SentWhen) > 'SpecifiedDate')

SELECT SecondarySite = (SELECT (SELECT COUNT (Distinct FileName)
FROM [Server].[Database].[dbo].[Table] with (nolock)
WHERE CONVERT (varchar (19), SentWhen) > 'SpecifiedDate') 

之后,我制作了一个批处理脚本,将执行这两个查询(它们将另存为不同的文件),并将结果放入单独的TXT文件中。 这是脚本:

@echo off
sqlcmd -E -S Server\Database -i 
C:\Users\MyUser\Desktop\FilesComparison\FileDiff.sql -h -1 > 
C:\Users\MyUser\Desktop\FilesComparison\FileDiff.txt
set /p raw=< C:\Users\MyUser\Desktop\FilesComparison\FileDiff.txt
set /a value=raw
sqlcmd -E -S Server\Database -i 
C:\Users\MyUser\Desktop\FilesComparison\FileCount.sql > 
C:\Users\MyUser\Desktop\FilesComparison\FileCount.txt

IF %value% NEQ 0 (
    wscript C:\Users\MyUser\Desktop\FilesComparison\Notification.vbs
) ELSE (
    echo No discrepancy between the two sites.
)

该批处理脚本的作用是执行两个查询并将其结果放入TXT文件中。 对于FileDiff.txt,我必须删除列标题和空格,以避免执行IF语句时出错。 如果两个服务器之间的差异不等于0,它将触发VBscript发送电子邮件警报。 当然,VBscript的作用是发送电子邮件通知,指出服务器的不同文件之间存在差异,并将解析批处理脚本正在写入结果的TXT文件上每个服务器的不同文件的当前计数。

Option Explicit 

Dim arrLines, objShell, objFSO, strFiles, NumberOfFiles, objSubFolder, 
objFile, objReader, intAgeInMinutes, strDir, ToAddress, FromAddress, 
wshShell, strData, fso, count, src, folder, file, dateStamp, lday, lmonth, 
lyear, logdate, objFsoLog, logOutput, objFolder, filemodif, Message, 
Subject, cdoBasic

'Define file to scan
Const cBaseFile = "C:\Users\MyUser\Desktop\FilesComparison\FileCount.txt"

'Constants for I/O
Const ForReading = 1

'Make sure the file exists
Set objFSO = CreateObject("Scripting.FileSystemObject")
If Not objFSO.FileExists(cBaseFile) Then
   Wscript.Echo "ERROR: file not found [" & cBaseFile & "]"
   Wscript.Quit
End If

Set objReader = objFSO.OpenTextFile(cBaseFile, ForReading)
strData = objReader.ReadAll
objReader.Close

'Split file data into an array breaking on end of lines
arrLines = Split(strData, vbCrLf)

'Initialize the email notification
ToAddress = "Recipients of email notification"  
FromAddress = "Alert_FileCount@noreply.com"  'Sender (noreply) address

'Initialize the source server
Set wshShell = CreateObject( "WScript.Shell" )


Sub emailSendCDOSYS()  
Dim Mailer  
Set Mailer=CreateObject("CDO.Message")  
Message = "===============================================" & VbCrLf  
Message = Message & "The File Count is not equal between two servers!" & VbCrLf  
Message = Message & "Date/Time: "& now() &"" & VbCrLf  
Message = Message & "===============================================" & 
VbCrLf & VbCrLf   
Message = Message & "Here is the current file count for:" & VbCrLf & VbCrLf
Message = Message & arrLines(0) & VbCrLf
Message = Message & arrLines(1) & VbCrLf
Message = Message & arrLines(2) & VbCrLf
Message = Message & VbCrLf
Message = Message & arrLines(3) & VbCrLf
Message = Message & arrLines(4) & VbCrLf
Message = Message & arrLines(5) & VbCrLf & VbCrLf
Message = Message & "Please do the following:" & VbCrLf
Message = Message & VbCrLf & "Step 1:" & VbCrLf
Message = Message & VbCrLf & "Step 2:" & VbCrLf
Message = Message & VbCrLf & "Step 3:" & VbCrLf

Subject = " File Count Discrepancy "
Mailer.TextBody = Message  
Mailer.Subject = Subject  
Mailer.To = ToAddress  
Mailer.From = FromAddress  

Mailer.Configuration.Fields.Item _ 
("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2  

'set the SMTP server 
Mailer.Configuration.Fields.Item _ 
("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.server.com" 

'SMTP port 
Mailer.Configuration.Fields.Item _ 
("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25  

Mailer.Configuration.Fields.Update 
Mailer.Send  
set Mailer = Nothing  
End Sub 


Call emailSendCDOSYS

然后,我制作了一个PowerShell脚本以在后台循环执行批处理脚本。

我花了很长时间来回应这个主题,因为过去几个月有很多事情要做。 我发布此信息是为了防备像我这样的人可能需要解决此问题。 我仍然没有足够的声誉来公开显示我的投票,但我投票给你答案。 再次感谢!

很久以前,我们曾遇到过类似的问题,即当金额(来自2个表)不同时发送电子邮件,我们已解决了该问题。 因此,我为您重新创建我们的解决方案:

1)。 登录服务器。

2)。 创建电子邮件配置

3)。 像这样写SP

create procedure sendMail 
as
begin
if server1.count <> server2.count
begin
EXEC msdb.dbo.sp_send_dbmail  
@profile_name = 'ProfileName',  
@recipients = 'client@gmail.com',  
@body = 'Server Alert',  
@subject = 'Server Alert' ;
end

4)。 创建新的维护计划。 查找并拖放Execute T-SQL语句Task ,形成Tools

5)。双击任务。 和写,

use DBname
exec sendMail --what you created in step 2

6)。 然后根据您的时间安排这份工作。

7)。 第一次手动运行。

此后,计数不匹配时,您会收到一封警报邮件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM