Backups auf dem SQL Server überwachen

20. Mai 2016

Wenn man Access als Frontend für eine Datenbank auf dem SQL Server verwendet, hat man dort Jobs für Backup, Integritätsprüfung etc. eingerichtet (Wartungsplan, Task im SQL Server Agent).

Nun stellt sich die Frage, wie man den Verlauf dieser Jobs überwacht. 

Man kann sich dazu Mails vom SQL Server schicken lassen. Langjährige Erfahrung zeigt allerdings:

  • Lässt man sich die Mail im Fehlerfall schicken, begibt man sich auf dünnes Eis, denn es gibt immer mal wieder Probleme mit der Mail-Konfiguration auf dem SQL Server, und so fällt die Sicherung möglicherweise unbemerkt aus.
  • Lässt man sich die Mail auch im Erfolgsfall schicken, verliert man - wenn man für mehrere Datenbanken verantwortlich ist - schnell den Überblick.

Ich mache es deshalb so, dass ich den Backup und ggf. weitere Jobs direkt in Access überwache.

Eine View liefert mir dazu die Infos über den Status der letzten Ausführungen:

SELECT [jobs].[job_id] AS [JobID], [jobs].[name] AS [JobName], 
    CASE WHEN [jobshistory].[run_date] IS NULL OR [jobshistory].[run_time] IS NULL THEN NULL ELSE CAST(CAST([jobshistory].[run_date] AS CHAR(8)) + ' ' + STUFF(STUFF(RIGHT('000000' + CAST([jobshistory].[run_time] AS VARCHAR(6)), 6), 3, 0, ':'), 6, 0, ':') AS DATETIME)  END AS [LastRunDateTime], 
    CASE [jobshistory].[run_status] WHEN 0 THEN 'Failed' WHEN 1 THEN 'Succeeded' WHEN 2 THEN 'Retry' WHEN 3 THEN 'Canceled' WHEN 4 THEN 'Running' END AS [LastRunStatus], 
    STUFF(STUFF(RIGHT('000000' + CAST([jobshistory].[run_duration] AS VARCHAR(6)), 6), 3, 0, ':'), 6, 0, ':') AS [LastRunDuration (HH:MM:SS)], [jobshistory].[message] AS [LastRunStatusMessage], 
    CASE [jobschedules].[NextRunDate] WHEN 0 THEN NULL ELSE CAST(CAST([jobschedules].[NextRunDate] AS CHAR(8)) + ' ' + STUFF(STUFF(RIGHT('000000' + CAST([jobschedules].[NextRunTime] AS VARCHAR(6)), 6), 3, 0, ':'), 6, 0, ':') AS DATETIME) END AS [NextRunDateTime]
FROM  [msdb].[dbo].[sysjobs] AS [jobs] LEFT JOIN
    (SELECT [job_id], MIN([next_run_date]) AS [NextRunDate], MIN([next_run_time]) AS [NextRunTime] 
       FROM [msdb].[dbo].[sysjobschedules]
       GROUP BY [job_id]) AS [jobschedules] ON [jobs].[job_id] = [jobschedules].[job_id] LEFT JOIN
              (SELECT [job_id], [run_date], [run_time], [run_status], [run_duration], [message], ROW_NUMBER() OVER (PARTITION BY [job_id]
                   ORDER BY [run_date] DESC, [run_time] DESC) AS RowNumber
FROM  [msdb].[dbo].[sysjobhistory] WHERE [step_id] = 0) 
AS [jobshistory] ON [jobs].[job_id] = [jobshistory].[job_id] AND [jobshistory].[RowNumber] = 1

Der Benutzer benötigt Leseberechtigung auf den Tabellen sysjobs, sysjobschedules und sysjobhistory in der Systemdatenbank msdb.

Das sieht wüst aus (habe ich mir aus dem Internet zusammengesucht), aber das Ergebnis ist eine ganz übersichtliche Tabelle.

In Access kann ich die Jobs, die überwacht werden sollen, über den JobName erkennen:

 SQL = "SELECT JobName, LastRunDateTime, LastRunStatus " _
      & "FROM ListJobInformation_View " _
      & "WHERE ((JobName LIKE '*XXX*') " _
      & "   AND ((LastRunStatus IS NULL) " _
      & "       OR (LastRunStatus <> 'Succeeded')))" 

In meiner Access-Datenbank habe ich eine Funktion, welche die kritischen Jobs prüft und ggf. » eine Mail an mich versendet.

Diese Funktion wird ganz nach Belieben mehrmals am Tag aufgerufen. Dazu habe ich zum Beispiel ein Formular "Timer", das immer im Hintergrund geöffnet ist, und einen Eintrag "LastCheck" in einer globalen Tabelle.

Benachrichtigung per E-Mail

Wenn man den Verlauf der Backup-Jobs auf dem SQL Server von Access aus überwacht, braucht man natürlich als Administrator eine Möglichkeit, sich im Fehlerfall per E-Mail benachrichtigen zu lassen.

» Mehr Infos zu E-Mails aus Access