Vergessene Jobs: syspolicy_purge_job

Ich werde in nächster Zeit mal etwas über die Jobs zusammentragen, die entweder keiner richtig kennt, oder die man erst noch selber anlegen muss. Heute starten wir mal mit syspolicy_purge_job. Jeder kennt ihn, keiner hinterfragt die Hintergründe oder wagt etwas an den Einstellungen zu ändern.

Der erste Kontakt

Viele werden sich denken: "Der Job wird ja schon für irgendwas gut sein. Immerhin legt Microsoft den Auftrag ja bereits bei der Installation an." "Purge" hört sich auch erst mal gut an. Da wird also etwas aufgeräumt. "Syspolicy" hat man vielleicht auch schon mal gehört. Könnte was mit den Richtlinien zu tun haben. Dieses Policy Based Management wurde bereits mit der Version 2008 eingeführt.

Die Arbeitsweise

Ich habe leider keinen Artikel von Microsoft gefunden, der die Arbeitsweise wirklich beschreibt. Aber aus verschiedenen blog-Einträgen und KB-Artikeln kann man sich dieses als Essenz rausziehen:

  • Die Historie der Richtlinienauswertungen wird in der msdb abgelegt.
  • Die Bereinigung dieser Einträge wird durch diesen Job erledigt.
  • Hier werden auch per PowerShell etwaige Phantom-Einträge vom System-Health bereinigt.
  • Die Aufbewahrungsfrist der Einträge ist über die Eigenschaften der Richtlinienverwaltung zu konfigurieren.
  • Die Standard-Aufbewahrungsfrist ist unendlich.
  • Der Job läuft jede Nacht um 2:00 Uhr.

Mit einer Aufbewahrungsfrist von unendlich wird dieser Job also einigermaßen zweckfrei. Damit erklärt sich auch die Laufzeit des zweiten Steps mit 0 Sekunden. Hier wird eine Stored Procedure aufgerufen (msdb.dbo.sp_syspolicy_purge_history). Dort drin erfolgt dann auch der Zugriff auf die Konfiguration und das eigentliche Löschen der Daten aus den beiden Tabellen

  • syspolicy_policy_execution_history_details_internal
  • syspolicy_policy_execution_history_internal

Spätestens jetzt sollte man sich einmal anschauen, wie viele Daten denn da so rum liegen:

SELECT COUNT(*), MIN(end_date) AS Anfang
FROM msdb.dbo.syspolicy_policy_execution_history_internal;

Wer keine Richtlinien verwendet, wird dort auch keine Einträge finden. Für alle anderen sollte die Konfiguration dieses Jobs interessant sein.

Die Konfiguration

Für die Einstellung der Aufbewahrungsfrist gibt es den Wert HistoryRetentionInDays. Auch in der deutschen GUI wird man diese Bezeichnung finden. Es gibt die Möglichkeit diesen Wert über T-SQL einzustellen:

EXEC msdb.dbo.sp_syspolicy_set_config_history_retention @value = 60;

Oder über die GUI:

Im ersten Schritt wählt man die Eigenschaften der Richtlinienverwaltung und im zweiten Schritt ändert man den Wert auf 60 ab. Ich habe mich für 60 Tage entschieden, damit auch für die nicht so häufig ausgeführten Richtlinien noch eine gewisse Historie erhalten bleibt.

Die aktuelle Konfiguration kann man mit folgendem Statement auslesen:

SELECT name, current_value
FROM msdb.dbo.syspolicy_configuration;

Weitere Informationen

Falls man den Job nicht (mehr) hat, kann man ihn neu erzeugen. Von Microsoft gibt es dazu eine Anleitung in diesem älteren Artikel zu Problemen beim syspolicy_purge_job mit SQL Server 2008.