Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 aufbewahrt. 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.
Voraussetzungen
Verwenden Sie ZUM Ausführen von T-SQL-Befehlen auf Ihrer SQL Server-Instanz SQL Server Management Studio (SSMS), die MSSQL-Erweiterung für Visual Studio Code, sqlcmd oder Ihr bevorzugtes T-SQL-Abfragetool.
Empfehlungen
Erwägen Sie die Fehlerüberprüfung, und überwachen Sie diesen Auftrag, um eine E-Mail-Nachricht an Operatoren zu senden, wenn dieser Archivauftrag fehlschlägt.
Optional können Sie archivierte Datenbank-E-Mail-Daten in eine benutzerdefinierte Archivdatenbank außerhalb von msdb
oder aus SQL Server exportieren.
Berechtigungen
Sie müssen Mitglied der festen Serverrolle sysadmin sein, um die in diesem Thema beschriebenen gespeicherten Prozeduren auszuführen.
Erstellen eines Archivdatenbank-E-Mail-Auftrags
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 im Format
DBMailArchive__<year_month>
nach dem vorherigen Monat benannt ist.Kopieren Sie die Anlagen im Zusammenhang mit den Nachrichten, die im ersten Schritt kopiert wurden, aus den Datenbank-E-Mail-Tabellen in eine neue Tabelle, die nach dem vorherigen Monat im Format
DBMailArchive_Attachments_<year_month>
benannt ist.Kopieren Sie die Ereignisse aus dem Datenbank-E-Mail-Ereignisprotokoll, die mit den im ersten Schritt kopierten Nachrichten verknüpft sind, aus den Datenbank-E-Mail-Tabellen in eine neue Tabelle, die nach dem vorherigen Monat im Format
DBMailArchive_Log_<year_month>
benannt ist.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.
Erstellen eines Auftrags für SQL Server-Agent
In den folgenden Schritten wird hierzu SQL Server Management Studio (SSMS) verwendet: Laden Sie die neueste Version von SSMS unter aka.ms/ssms herunter.
Stellen Sie eine Verbindung mit der SQL Server-Instanz her.
Erweitern Sie im Objekt-Explorer den SQL Server-Agent, klicken Sie mit der rechten Maustaste auf "Aufträge", und wählen Sie dann " Neuer Auftrag" aus.
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.
Wählen Sie die Kategorie im Feld Datenbankwartung aus.
Geben Sie im Feld "Beschreibung " "Archivdatenbank-E-Mail-Nachrichten" ein, und wählen Sie dann "Schritte" aus.
Jobschritt erstellen, um Datenbank-E-Mail-Nachrichten zu archivieren
Wählen Sie auf der Seite "Schritte " die Option "Neu" aus.
Geben Sie im Feld Schrittname den Namen Datenbank-E-Mail-Elemente kopierenein.
Klicken Sie im Feld Typ auf Transact-SQL-Skript (T-SQL).
Wählen Sie im Feld "Datenbank " die Option
msdb
aus.Geben Sie im Feld "Command " die folgende T-SQL-Anweisung ein, um eine Tabelle zu erstellen, die nach dem vorherigen Monat benannt ist und Zeilen enthält, die älter als der Anfang des aktuellen Monats sind.
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 ;
Wählen Sie "OK" aus, um den Schritt zu speichern.
Erstellen eines Schrittes im Auftrag zum Archivieren der Datenbank-Mail-Anhänge
Wählen Sie auf der Seite "Schritte " die Option "Neu" aus.
Geben Sie im Feld Schrittname den Namen Datenbank-E-Mail-Anlagen kopierenein.
Klicken Sie im Feld Typ auf Transact-SQL-Skript (T-SQL).
Wählen Sie im Feld "Datenbank " die Option
msdb
aus.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 ;
Wählen Sie "OK" aus, um den Schritt zu speichern.
Erstellen Sie einen Auftragsschritt zum Archivieren des Datenbank-E-Mail-Protokolls
Wählen Sie auf der Seite "Schritte " die Option "Neu" aus.
Geben Sie im Feld Schrittname den Namen Datenbank-E-Mail-Protokoll kopierenein.
Klicken Sie im Feld Typ auf Transact-SQL-Skript (T-SQL).
Wählen Sie im Feld "Datenbank " die Option
msdb
aus.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 ;
Wählen Sie "OK" aus, um den Schritt zu speichern.
Erstellen eines Auftragsschritts zum Entfernen der archivierten Zeilen aus Datenbank-E-Mail
Wählen Sie auf der Seite "Schritte " die Option "Neu" aus.
Geben Sie im Feld Schrittname den Namen Zeilen aus Datenbank-E-Mail entfernenein.
Klicken Sie im Feld Typ auf Transact-SQL-Skript (T-SQL).
Wählen Sie im Feld "Datenbank " die Option
msdb
aus.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 ;
Wählen Sie "OK" aus, um den Schritt zu speichern.
Erstellen eines Auftragsschritts zum Entfernen der archivierten Elemente aus dem Datenbank-E-Mail-Ereignisprotokoll
Wählen Sie auf der Seite "Schritte " die Option "Neu" aus.
Geben Sie im Feld Schrittname den Text Zeilen aus dem Datenbank-E-Mail-Ereignisprotokoll entfernen ein.
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 ;
Wählen Sie "OK" aus, um den Schritt zu speichern.
Planen der Ausführung des Auftrags in regelmäßigen Abständen
Wählen Sie im Dialogfeld "Neuer Auftrag " die Option "Zeitpläne" aus.
Wählen Sie auf der Seite "Zeitpläne " die Option "Neu" aus.
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.
Vergewissern Sie sich, dass die anderen Optionen wie gewünscht konfiguriert sind, und wählen Sie dann "OK " aus, um den Zeitplan zu speichern.
Wählen Sie OK aus, um den Auftrag zu speichern.