Vergessene Jobs: eMails bereinigen

Wer so wie ich regelmäßig eMails über den SQL Server verschickt und da auch immer noch einiges an Daten mit dazu packt, wird bald ein gewisses Wachstum der msdb feststellen. Es gibt mehrere Möglichkeiten, dem entgegen zu wirken.

Die Ursache

Kopien von Datenbank-E-Mail-Nachrichten und deren Anlagen werden zusammen mit dem Datenbank-E-Mail-Ereignisprotokoll in msdb-Tabellen gespeichert. Das betrifft dann vor allem diese Tabellen in der msdb:

  • dbo.sysmail_mailitems
  • dbo.sysmail_attachments

schaut man sich mal die Daten im Überblick an und auch den verwendeten Platz, wird man feststellen, dass da einiges zusammen kommen kann:

SELECT MIN(sent_date) AS Anfang, COUNT(*) AS Anzahl
FROM dbo.sysmail_mailitems;

SELECT MIN(last_mod_date) AS Anfang, COUNT(*) AS Anzahl
FROM dbo.sysmail_attachments;

EXEC sp_spaceused 'dbo.sysmail_mailitems';
EXEC sp_spaceused 'dbo.sysmail_attachments';

Die Bereinigung

Microsoft stellt uns hierfür direkt zwei Stored Procedures zur Verfügung:

  • sysmail_delete_mailitems_sp
  • sysmail_delete_log_sp

Wie in der Dokumentation nachzulesen, löscht sysmail_delete_mailitems_sp E-Mail-Nachrichten dauerhaft aus den internen Tabellen der Datenbank-E-Mail, wohingegen sysmail_delete_log_sp Ereignisse aus dem Datenbank-E-Mail-Protokoll löscht.

Beide Prozeduren kann man mit einem Datum versorgen und so z. B. alle Einträge löschen kann, die älter als 100 Tage sind:

DECLARE @DeleteBeforeDate DATETIME;
SELECT @DeleteBeforeDate = DATEADD(d,-100, GETDATE());
EXEC msdb..sysmail_delete_mailitems_sp @sent_before = @DeleteBeforeDate;
EXEC msdb..sysmail_delete_log_sp @logged_before = @DeleteBeforeDate;

Am besten erstellt man sich einen SQL Server Agent Auftrag und lässt diese Bereinigung dann einmal in der Woche laufen.

Zusatzinfos

Wer diese Einträge noch woanders archivieren will, bevor er sie löscht, kann auf diese Anleitung zum erstellen eines Auftrags des SQL Server-Agents zum Archivieren von Datenbank-E-Mail-Nachrichten und Ereignisprotokollen zurück greifen.