SQLServer-Agent per Script einrichten

Welche Konfiguration ist überhaupt vorzunehmen?

Es gibt einige Basisfunktionalitäten, die ich auf allen Servern aktiviert habe. Diese finden sich in den Eigenschaften des SQLServer-Agents, auf verschiedenen Seiten der Konfiguration wieder.

  • (Erweitert) - Bedingung für 'CPU im Leerlauf' definieren
  • (Warnungssystem) - Mailsitzung
  • (Verlauf) - Aktuelle Länge des Auftragsverlaufsprotokolls

Bedingung für 'CPU im Leerlauf' definieren

Wenn diese Bedingung definiert ist, können bestimmte Jobs situationsabhängig gestartet werden. Diese laufen unter sogenannten Leerlaufzeitplänen. Hiermit können Zeiten ausgenutzt werden, die wenig Aktivität zeigen, so dass bestimmte Aktionen ohne merkbaren Einfluss auf die Performance ausgeführt werden können, wenn niemand sonst den Server beansprucht.

Mailsitzung

Die hier definierte Mailsitzung wird verwendet um Operatoren im Bedarfsfall über den Ausgang eines Jobs zu benachrichtigen, oder auch bei Auftreten bestimmter Warnungen eine Mail zu versenden. Hierüber wird nicht das Konto definiert, welches in T-SQL für die Versendung von EMails verwendet wird.

Aktuelle Länge des Auftragsverlaufsprotokolls

Für jeden Auftrag wird eine Historie des Verlaufs mitgeschrieben. Diese kann man sich im Kontextmenü 'Verlauf anzeigen' auflisten lassen. Wieviele Zeilen pro Auftrag sichtbar sind, hängt auch von der Anzahl der Aufträge im System und deren Häufigkeit zusammen. Gibt es viele Aufträge und laufen einige Aufträge sehr häufig (z. B. LogShipping), so wird die Gesamtanzahl des Auftragsverlaufs schnell erreicht. Dort finden sich dann oft nur noch die Informationen zu den häufigen Aufträgen, während die Informationen zu den selteneren Aufträgen schon wieder aus der Historie entfernt wurden. Deshalb sollte man zum einen die Anzahl pro Auftrag auf einen sinnvollen Wert setzen, aber auch die Gesamtanzahl entsprechend gross wählen. Diese könnte man durch das Produkt aus Anzahl Aufträge und Maximale Zeilenanzahl pro Auftrag ermitteln.
Auf die Option 'Agentverlauf automatisch entfernen' möchte ich an dieser Stelle nur kurz hinweisen. Sie arbeitet nicht so, wie man es vielleicht erwarten könnte. Hier habe ich dies etwas umfangreicher beschrieben.

Wie kann ich die Konfiguration ohne die GUI durchführen?

Bei der Analyse dieser Möglichkeit habe ich mit dem Profiler mitgeschnitten, was das Management Studio an Befehlen absetzt. Das Ergebnis zeigt den Aufruf von undokumentierten Prozeduren, welche ich in meinen Projekten nicht einsetze. Aber bei dieser äußerst begrenzten Anwendung der Serverinstallation, die sowieso von Version zu Version überarbeitet werden muss, habe ich auch keine Hemmungen undokumentierte Prozeduren zu verwenden.

Im folgenden werden also aus der msdb die System-Prozedur sp_set_sqlagent_properties und aus der master die erweiterte gespeicherte Prozedur xp_instance_regwrite verwendet. Zu der ersten kann man sich den Source in der msdb anschauen und wird feststellen, dass dort im wesentlichen nur weitere Aufrufe von xp_instance_regwrite gekapselt sind.

Bedingung für 'CPU im Leerlauf' definieren

Hier ist werden die Default-Einstellungen verwendet und demzufolge nur das Kennzeichen gesetzt, dass diese Bedingung gesetzt ist. Der Default sieht vor, das Leerlauf eintritt, wenn die Maschine für mindestens 600 Sekunden im Durchschnitt weniger als 10% CPU-Nutzung registriert.

/* Setze die Bedingung für CPU im Leerlauf */
USE [msdb]
GO
EXEC msdb.dbo.sp_set_sqlagent_properties @cpu_poller_enabled=1
GO

Mailsitzung

Setze die Bedingung, dass Datenbank-E-Mail verwendet wird und wähle ein Mail-Profil aus. Dies muss allerdings schon vorher bei der Einrichtung der Datenbank-E-Mail definiert worden sein.

/* Setze die EMail-Einstellungen */
EXEC master.dbo.xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'SOFTWARE\Microsoft\MSSQLServer\SQLServerAgent'
, N'UseDatabaseMail', N'REG_DWORD', 1
GO
EXEC master.dbo.xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'SOFTWARE\Microsoft\MSSQLServer\SQLServerAgent'
, N'DatabaseMailProfile', N'REG_SZ', N'MeinMailProfil'
GO

Aktuelle Länge des Auftragsverlaufsprotokolls

Hier gebe ich Werte vor, die für den Betrieb mit 20 bis 100 Aufträgen problemlos funktionieren sollten. Diese sind ggf. anzupassen, wenn sich im Betrieb später herausstellen sollte, dass einige Aufträge weniger Historie zeigen, als gewünscht.

/* Setze die Einstellungen fuer das Warnungssystem */
USE [msdb]
GO
EXEC msdb.dbo.sp_set_sqlagent_properties @jobhistory_max_rows=10000,
@jobhistory_max_rows_per_job=500
GO

Schlussbemerkung

Wenn man diesen kleinen Umweg über nicht dokumentierte Prozeduren geht, kann man eine Lücke in seinen T-SQL Einrichtungsskripten schliessen. Diese trat vorher bei der Einrichtung eines neuen SQLServers auf, und hierfür musste die GUI bemüht werden. Weitere Konfigurationen lassen sich einmalig mit dem Profiler mitschneiden und hier integrieren.