我目前有两台服务器必须始终彼此同步。为了监控这个,我有一个查询,我用它来检查它们是否相等。这是查询:
SELECT COUNT (distinct filename) from DB.dbo.Table (nolock)
WHERE SentWhen > '2017-07-17 00:00:00'
当我们已经错过了同步文件时,我遇到了有关监控的问题。我需要的是一个脚本或工作,当两个服务器的查询结果不相等或者它们的差异不等于0时,它将发送电子邮件警报。任何帮助都将不胜感激。
答案 0 :(得分: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
暗示等方面。如果经常写这些数据库,可能会发生种族问题,带宽可能会发挥作用等等......但如果你相信你的方法将它们声明为同步&#34;根据该查询,这是您发送电子邮件的方式..
答案 1 :(得分:0)
@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 :(得分:0)
很久以前,我们也有类似的问题,当数量(来自2个表格)不同时发送电子邮件,我们就解决了。所以我为你重新创建我们的解决方案:
1)。登录服务器。
2)。 Create Email configuration
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)。创建新的维护计划。查找并拖放执行T-SQL语句任务,从工具
5)。双击任务。写,
use DBname
exec sendMail --what you created in step 2
6)。然后按照你的时间安排这份工作。
7)。第一次手动运行。
此后,当计数不匹配时,您会收到提醒邮件。