Zu den wichtigsten Aufgaben des Monitoring gehört die Prüfung, ob alle Datenbanken eines SQL Server aktuell gesichert sind. Viele Werkzeuge fragen dazu die Backup-Software ab. Im Falle des SQL Server geht dies aber auch flexibler und unabhängig von der konkreten Sicherungs-Software: Sofern diese nämlich die mitgelieferte Backup-Schnittstelle verwendet, weiß SQL Server, wann die Sicherung stattgefunden hat. Die meisten Sicherungsprogramme erfüllen diese Voraussetzung.
Das folgende Skript verbindet sich mit dem lokalen SQL Server und fragt die Sicherungsstatus aller Datenbanken ab. Liegt die Sicherung weniger als 24 Stunden zurück, so gilt die Prüfung als bestanden. Wie die meisten Monitoring-Skripte gibt auch dieses den Exitcode 0 zurück, wenn alles in Ordnung ist. Der Code 1 weist auf einen Fehler hin.
Das Skript nutzt die SQL-Syntax des SQL Server, um die Abfrage auszuführen. Folgender SQL-Code ist dazu einsetzbar:
-- Define desired backup interval in hours
DECLARE @BackupInterval int
SET @BackupInterval = 24
SET NOCOUNT ON
SELECT database_name AS 'Database'
, type AS BackupType
, MAX(backup_start_date) AS Start
, MAX(backup_finish_date) AS Finish
, (DATEDIFF(s, MAX(backup_start_date), MAX(backup_finish_date))) AS DurationSec
, (DATEDIFF(hh, MAX(backup_finish_date), GETDATE())) AS HoursAgo
, CASE WHEN (DATEDIFF(hh, MAX(backup_finish_date), GETDATE())) > @BackupInterval THEN 'Critical' ELSE 'OK' END AS BackupStatus
FROM msdb..backupset
GROUP BY database_name, type
ORDER BY database_name
Um diesen mehrzeiligen Code innerhalb einer einzigen Batchdatei an das SQL-Server-Werkzeug sqlcmd.exe verfüttern zu können, bedient sich die Batchdatei eines Tricks: Sie erzeugt eine temporäre SQL-Eingabedatei mit dem Code, ruft sqlcmd.exe mit dieser Datei auf und prüft das Ergebnis. Dadurch muss nicht mehr als eine einzelne Batchdatei an das Monitoring-Tool übergeben werden.
@echo off rem Sind alle Datenbanken auf SQL Server aktuell gesichert? rem Nils Kaczenski, WITstor GmbH, 20.2.2012 rem Das Skript verbindet sich mit dem lokalen SQL Server und fragt den Backup-Status aller Datenbanken ab rem SQL-Eingabedatei entfernen, falls vorhanden SET SQL=%TEMP%\CheckSQL.sql IF EXIST %SQL% DEL %SQL% rem SQL-Eingabedatei erzeugen echo -- Define desired backup interval in hours>>%SQL% echo DECLARE @BackupInterval int>>%SQL% echo SET @BackupInterval = 24>>%SQL% echo SET NOCOUNT ON>>%SQL% echo SELECT database_name AS 'Database'>>%SQL% echo , type AS BackupType>>%SQL% echo , MAX(backup_start_date) AS Start>>%SQL% echo , MAX(backup_finish_date) AS Finish >>%SQL% echo , (DATEDIFF(s, MAX(backup_start_date), MAX(backup_finish_date))) AS DurationSec >>%SQL%echo , (DATEDIFF(hh, MAX(backup_finish_date), GETDATE())) AS HoursAgo>>%SQL% echo , CASE WHEN (DATEDIFF(hh, MAX(backup_finish_date), GETDATE())) ^> @BackupInterval THEN 'Critical' ELSE 'OK' END AS BackupStatus>>%SQL%echo FROM msdb..backupset>>%SQL% echo GROUP BY database_name, type>>%SQL% echo ORDER BY database_name>>%SQL% rem SQL-Check ausfuehren sqlcmd -E -W -h-1 -i %SQL% | find /I "ok" >nul
Und hier ist der Download dieses Skripts:
Check-SQLServer-Backup-aktuell (2,7 KiB, 2.040-mal heruntergeladen, letzte Änderung am 22. Mai 2012)
http://faq-o-matic.net/?p=3938