Erstellen eines Auftrags des SQL Server-Agents zum Archivieren von Datenbank-E-Mail-Nachrichten und Ereignisprotokollen
Gilt für: SQL Server Azure SQL Managed Instance
Kopien von Datenbank-E-Mail-Nachrichten und deren Anlagen werden zusammen mit dem Datenbank-E-Mail-Ereignisprotokoll in msdb -Tabellen gespeichert. Sie sollten die Größe der Tabellen regelmäßig reduzieren und Nachrichten und Ereignisse archivieren, die nicht mehr benötigt werden. Die folgenden Prozeduren erstellen einen Auftrag des SQL Server-Agents, um diesen Prozess zu automatisieren.
Vorbereitungen: , Voraussetzungen, Empfehlungen, Berechtigungen
Archivieren von Datenbank-E-Mail-Nachrichten und -Protokollen mithilfe von: SQL Server-Agent
Vorbereitungen
Voraussetzungen
Die neuen Tabellen zum Speichern der Archivdaten können sich in einer speziellen Archivdatenbank befinden. Alternativ können die Zeilen in eine Textdatei exportiert werden.
Empfehlungen
Für die Verwendung in einer Produktionsumgebung sollten Sie eine zusätzliche Fehlerprüfung einfügen und eine E-Mail-Nachricht an Operatoren senden, wenn beim Auftrag ein Fehler auftritt.
Berechtigungen
Sie müssen Mitglied der festen Serverrolle sysadmin sein, um die in diesem Thema beschriebenen gespeicherten Prozeduren auszuführen.
Übersicht über den Prozess
Die erste Prozedur erstellt den Auftrag "Datenbank-E-Mail archivieren" in den folgenden Schritten:
Kopieren Sie alle Nachrichten aus den Datenbank-E-Mail-Tabellen in eine neue Tabelle, die nach dem vorhergehenden Monat im Format DBMailArchive_<year_month> benannt wird.
Kopieren Sie die zu den im ersten Schritt kopierten Nachrichten gehörenden Anlagen aus den Datenbank-E-Mail-Tabellen in eine neue Tabelle, die nach dem vorhergehenden Monat im Format DBMailArchive_Attachments_<year_month> benannt wird.
Kopieren Sie die zu den im ersten Schritt kopierten Nachrichten gehörenden Ereignisse aus dem Datenbank-E-Mail-Ereignisprotokoll aus den Datenbank-E-Mail-Tabellen in eine neue Tabelle, die nach dem vorhergehenden Monat im Format DBMailArchive_Log_<year_month> benannt wird.
Löschen Sie die Datensätze der übertragenen E-Mail-Elemente aus den Datenbank-E-Mail-Tabellen.
Löschen Sie die zu den übertragenen E-Mail-Elementen gehörenden Ereignisse aus dem Datenbank-E-Mail-Ereignisprotokoll.
Planen Sie die regelmäßige Ausführung des Auftrags.
So erstellen Sie einen Auftrag für den SQL Server-Agent
Erweitern Sie im Objekt-Explorer den Knoten SQL Server-Agent, klicken Sie mit der rechten Maustaste auf Jobs, und klicken Sie dann auf Neuer Job.
Geben Sie im Dialogfeld Neuer Auftrag im Feld Name den Namen Datenbank-E-Mail archivierenein.
Bestätigen Sie im Feld Besitzer , dass der Besitzer Mitglied der festen Serverrolle sysadmin ist.
Klicken Sie im Feld Kategorie auf Datenbankwartung.
Geben Sie im Feld Beschreibung als Beschreibung Datenbank-E-Mail-Nachrichten archivierenein, und klicken Sie dann auf Schritte.
So erstellen Sie einen Schritt zum Archivieren der Datenbank-E-Mail-Nachrichten
Klicken Sie auf der Seite Schritte auf Neu.
Geben Sie im Feld Schrittname den Namen Datenbank-E-Mail-Elemente kopierenein.
Klicken Sie im Feld Typ auf Transact-SQL-Skript (T-SQL).
Klicken Sie im Feld Datenbank auf msdb.
Geben Sie im Feld Befehl die folgende Anweisung zum Erstellen einer Tabelle ein, die nach dem vorhergehenden Monat benannt wird und Zeilen enthält, die aus der Zeit vor Beginn des aktuellen Monats stammen:
DECLARE @LastMonth nvarchar(12); DECLARE @CopyDate nvarchar(20) ; DECLARE @CreateTable nvarchar(250) ; SET @LastMonth = (SELECT CAST(DATEPART(yyyy,GETDATE()) AS CHAR(4)) + '_' + CAST(DATEPART(mm,GETDATE())-1 AS varchar(2))) ; SET @CopyDate = (SELECT CAST(CONVERT(char(8), CURRENT_TIMESTAMP- DATEPART(dd,GETDATE()-1), 112) AS datetime)) SET @CreateTable = 'SELECT * INTO msdb.dbo.[DBMailArchive_' + @LastMonth + '] FROM sysmail_allitems WHERE send_request_date < ''' + @CopyDate +''''; EXEC sp_executesql @CreateTable ;
Klicken Sie auf OK , um den Schritt zu speichern.
So erstellen Sie einen Schritt zum Archivieren der Datenbank-E-Mail-Anlagen
Klicken Sie auf der Seite Schritte auf Neu.
Geben Sie im Feld Schrittname den Namen Datenbank-E-Mail-Anlagen kopierenein.
Klicken Sie im Feld Typ auf Transact-SQL-Skript (T-SQL).
Klicken Sie im Feld Datenbank auf msdb.
Geben Sie im Feld Befehl die folgende Anweisung zum Erstellen einer Tabelle mit Anlagen ein, die nach dem vorhergehenden Monat benannt wird und die Anlagen zu den im vorhergehenden Schritt übertragenen Nachrichten enthält:
DECLARE @LastMonth nvarchar(12); DECLARE @CopyDate nvarchar(20) ; DECLARE @CreateTable nvarchar(250) ; SET @LastMonth = (SELECT CAST(DATEPART(yyyy,GETDATE()) AS CHAR(4)) + '_' + CAST(DATEPART(mm,GETDATE())-1 AS varchar(2))) ; SET @CopyDate = (SELECT CAST(CONVERT(char(8), CURRENT_TIMESTAMP- DATEPART(dd,GETDATE()-1), 112) AS datetime)) SET @CreateTable = 'SELECT * INTO msdb.dbo.[DBMailArchive_Attachments_' + @LastMonth + '] FROM sysmail_attachments WHERE mailitem_id in (SELECT DISTINCT mailitem_id FROM [DBMailArchive_' + @LastMonth + '] )'; EXEC sp_executesql @CreateTable ;
Klicken Sie auf OK , um den Schritt zu speichern.
So erstellen Sie einen Schritt zum Archivieren des Datenbank-E-Mail-Protokolls
Klicken Sie auf der Seite Schritte auf Neu.
Geben Sie im Feld Schrittname den Namen Datenbank-E-Mail-Protokoll kopierenein.
Klicken Sie im Feld Typ auf Transact-SQL-Skript (T-SQL).
Klicken Sie im Feld Datenbank auf msdb.
Geben Sie im Feld Befehl die folgende Anweisung zum Erstellen einer Protokolltabelle ein, die nach dem vorhergehenden Monat benannt wird und die Protokolleinträge zu den in einem vorhergehenden Schritt übertragenen Nachrichten enthält:
DECLARE @LastMonth nvarchar(12); DECLARE @CopyDate nvarchar(20) ; DECLARE @CreateTable nvarchar(250) ; SET @LastMonth = (SELECT CAST(DATEPART(yyyy,GETDATE()) AS CHAR(4)) + '_' + CAST(DATEPART(mm,GETDATE())-1 AS varchar(2))) ; SET @CopyDate = (SELECT CAST(CONVERT(char(8), CURRENT_TIMESTAMP- DATEPART(dd,GETDATE()-1), 112) AS datetime)) SET @CreateTable = 'SELECT * INTO msdb.dbo.[DBMailArchive_Log_' + @LastMonth + '] FROM sysmail_Event_Log WHERE mailitem_id in (SELECT DISTINCT mailitem_id FROM [DBMailArchive_' + @LastMonth + '] )'; EXEC sp_executesql @CreateTable ;
Klicken Sie auf OK , um den Schritt zu speichern.
So erstellen Sie einen Schritt zum Entfernen der archivierten Zeilen aus der Datenbank-E-Mail
Klicken Sie auf der Seite Schritte auf Neu.
Geben Sie im Feld Schrittname den Namen Zeilen aus Datenbank-E-Mail entfernenein.
Klicken Sie im Feld Typ auf Transact-SQL-Skript (T-SQL).
Klicken Sie im Feld Datenbank auf msdb.
Geben Sie im Feld Befehl die folgende Anweisung ein, um Zeilen aus den Datenbank-E-Mail-Tabellen zu entfernen, die älter als der aktuelle Monat sind:
DECLARE @CopyDate nvarchar(20) ; SET @CopyDate = (SELECT CAST(CONVERT(char(8), CURRENT_TIMESTAMP- DATEPART(dd,GETDATE()-1), 112) AS datetime)) ; EXECUTE msdb.dbo.sysmail_delete_mailitems_sp @sent_before = @CopyDate ;
Klicken Sie auf OK , um den Schritt zu speichern.
So erstellen Sie einen Schritt zum Entfernen der archivierten Elemente aus dem Datenbank-E-Mail-Ereignisprotokoll
Klicken Sie auf der Seite Schritte auf Neu.
Geben Sie im Feld Schrittname den Namen Zeilen aus dem Datenbank-E-Mail-Protokoll entfernenein.
Klicken Sie im Feld Typ auf Transact-SQL-Skript (T-SQL).
Geben Sie im Feld Befehl die folgende Anweisung ein, um Zeilen aus dem Datenbank-E-Mail-Ereignisprotokoll zu entfernen, die älter als der aktuelle Monat sind:
DECLARE @CopyDate nvarchar(20) ; SET @CopyDate = (SELECT CAST(CONVERT(char(8), CURRENT_TIMESTAMP- DATEPART(dd,GETDATE()-1), 112) AS datetime)) ; EXECUTE msdb.dbo.sysmail_delete_log_sp @logged_before = @CopyDate ;
Klicken Sie auf OK , um den Schritt zu speichern.
So planen Sie die regelmäßige Ausführung des Auftrags
Klicken Sie im Dialogfeld Neuer Auftrag auf Zeitpläne.
Klicken Sie auf der Seite Zeitpläne auf Neu.
Geben Sie im Feld Name den Namen Datenbank-E-Mail archivierenein.
Klicken Sie im Feld Zeitplantyp auf Wiederholt.
Wählen Sie im Bereich Häufigkeit die Optionen zum regelmäßigen Ausführen des Auftrags, z. B. am ersten Tag eines jeden Monats, aus.
Klicken Sie im Bereich Häufigkeit pro Tag auf Wird einmal um <Uhrzeit> ausgeführt.
Überprüfen Sie, ob die anderen Optionen wie gewünscht konfiguriert sind, und klicken Sie dann auf OK , um den Zeitplan zu speichern.
Klicken Sie auf OK , um den Auftrag zu speichern.