This next script can be used to check if Full and Transaction Log backups are made within the last two days. Databases are read from a CSV file. I use a slightly modified version which reads databases from a registration database.
# ******************************************************************** # Scriptnaam: CHECKBACKUP.PS1 # Geschreven_door: Tim van Kooten Niekerk # Versie: 20110811A # Info: Check if backup is made within last two days... # ******************************************************************** # Global config settings... [string]$sServerInstanceFile = ".ServerInstance.csv" [string]$sSMTPServer1 = "smtp-server-name" [string]$sToAddress1 = "email-adsress" # Global objects... $oNETIP = [System.Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties() # Register Snapins... $oPSSnapinRegResult = PSSnapin SqlServerCmdletSnapin* -registered if ($oPSSnapinRegResult) { $oPSSnapinResult = PSSnapin $oPSSnapinRegResult.Name if (-not $oPSSnapinResult) { Add-PSSnapin $oPSSnapinRegResult.Name } } else { break } # Functions and Procedures... function fSendMail([string]$sSMTPSrvrName, [string]$sFrom, [string]$sTo, [string]$sSubject, [string]$sBody, [string]$sAttFileName) { if (($sSMTPSrvrName) -and ($sFrom) -and ($sTo) -and $sSubject) { # Declare mail objects... $oMessage = new-object Net.Mail.MailMessage $oSMTP = new-object Net.Mail.SmtpClient($sSMTPSrvrName) # Pass values to object... $oMessage.From = $sFrom $oMessage.To.Add($sTo) $oMessage.Subject = $sSubject if ($sBody) { $oMessage.Body = $sBody } # Add attachment... if ($sAttFileName) { $oAttachment = new-object Net.Mail.Attachment($sAttFileName) $oMessage.Attachments.Add($oAttachment) } $oSMTP.Send($oMessage) if ($? -eq "True") { return "INFO: Email has been sent." } else { return "ERROR: Error sending e-mail." } } else { return "ERROR: Argument(s) missing. [fSendMail `"SMTPServerName`" `"From`" `"To`" `"Subject`" (`"Body`") (`"AttachFileName`")]" } } function fSQLCmd([string]$sInstance, [string]$sQuery, [string]$sDatabase) { if ($sDatabase) { [string]$sQuery = "Invoke-SqlCmd -ServerInstance " + $sInstance + " -Database " + $sDatabase + " -QueryTimeout 30 -Query `"" ` + $sQuery + "`" ; if (`$? -eq `$false) { @{`"ERROR0`" = `$error[0]}; @{`"ERROR1`" = `$error[1]} }" } else { [string]$sQuery = "Invoke-SqlCmd -ServerInstance " + $sInstance + " -QueryTimeout 30 -Query `"" + $sQuery + "`" ; ` if (`$? -eq `$false) { @{`"ERROR0`" = `$error[0]}; @{`"ERROR1`" = `$error[1]} }" } return Invoke-Expression $sQuery } # Start Main script... [int]$iCounter = 0 Import-Csv $($sServerInstanceFile) -header ("instance", "checkfull", "checktl") | foreach { # Skip header... if (($iCounter -ne 0) -and ($_.instance)) { $oResult1 = $null $oResult2 = $null # Run Queries on servers... if ($_.checkfull -eq 1) { [string]$sQuery1 = "/* ##### Begin T-SQL Query... ##### */ ` SELECT sys.databases.name AS NoRecentFullBackup ` FROM sys.databases ` WHERE sys.databases.name NOT IN ` (SELECT DISTINCT sys.databases.name from sys.databases ` INNER JOIN msdb..backupset ON sys.databases.name = msdb..backupset.database_name ` WHERE ((msdb..backupset.type = 'D' OR msdb..backupset.type = 'I') ` AND msdb..backupset.is_copy_only = 0 ` AND msdb..backupset.backup_start_date > (GetDate() -2))) ` AND sys.databases.state = 0 ` AND sys.databases.name 'tempdb' ` /* ##### Einde T-SQL Query... ##### */" # Forceer in een object zodat we altijd kunnen tellen... [Object[]]($oResult1) = fSQLCmd $($_.instance) $sQuery1 "master" } if ($_.checktl -eq 1) { [string]$sQuery2 = "/* ##### Begin T-SQL Query... ##### */ ` SELECT sys.databases.name AS NoRecentTLBackup ` FROM sys.databases ` WHERE sys.databases.name NOT IN ` (SELECT DISTINCT sys.databases.name from sys.databases ` INNER JOIN msdb..backupset ON sys.databases.name = msdb..backupset.database_name ` WHERE (msdb..backupset.type = 'L' AND msdb..backupset.backup_start_date > (GetDate() -2))) ` AND sys.databases.recovery_model != 3 and sys.databases.state = 0 ` /* ##### Einde T-SQL Query... ##### */" # Forceer in een object zodat we altijd kunnen tellen... [Object[]]($oResult2) = fSQLCmd $($_.instance) $sQuery2 "master" } # Zodra er rows worden geteld een e-mail samenstellen... if (($oResult1.Count -gt 0) -or ($oResult2.Count -gt 0)) { $oResult1 = $oResult1 | Out-String $oResult2 = $oResult2 | Out-String [string]$sFromAddress1 = "noreply@" + $oNETIP.HostName + "." + $oNETIP.DomainName [string]$sBody1 = $oResult1 + $oResult2 [string]$sSubject1 = $($_.instance.Replace("", "_")) + ":Database backup older than 2 days..." fSendMail $sSMTPServer1 $sFromAddress1 $sToAddress1 $sSubject1 $sBody1 } } $iCounter++ } # ********************************************************************
CSV File format:
instance,checkfull,checktl SERVERA,1,1 SERVERBINS1,1,1 SERVERC,1,1