Freigeben über


Behandeln von problemen mit Datenbank-E-Mail

Dieser Artikel enthält Methoden zur Problembehandlung Datenbank-E-Mail. Wenn das Problem bei der ersten Problembehandlung nicht behoben wurde, verwenden Sie die erweiterte Problembehandlung.

Erste Datenbank-E-Mail Problembehandlung

Im Folgenden finden Sie grundlegende Schritte zur Problembehandlung:

  1. Überprüfen Sie die ansichten Datenbank-E-Mail log und sysmail (sysmail_event_log) auf E-Mails, die bereits gesendet wurden oder versucht haben, mit DatabaseMail.exezu senden.
  2. Senden sie eine Test-E-Mail. Wenn die Test-E-Mail erfolgreich gesendet wurde, konzentrieren Sie sich auf die Details der Nachrichten, die nicht gesendet werden. Wenn die Test-E-Mail nicht gesendet wird, konzentrieren Sie sich auf die Problembehandlung der Test-E-Mail, und ignorieren Sie die zuvor nicht erfolgreich gesendeten E-Mails.
  3. Wenn Sie vermuten, dass die SMTP-Servereinstellungen falsch sind oder ein Problem mit dem Konto vorliegt, das zum Senden der E-Mail verwendet wird, verwenden Sie PowerShell, um eine Test-E-Mail zu senden.
  4. Wenn Sie die E-Mail nicht mithilfe von PowerShell senden können, handelt es sich wahrscheinlich um ein SMTP-Konfigurationsproblem, und ein SMTP-Administrator wird benötigt.

Sie können die folgenden Schritte für die erste Datenbank-E-Mail Problembehandlung verwenden.

Msdb sysmail-Systemsichten

Bevor Sie sich die detaillierten Schritte ansehen, finden Sie hier eine kurze Zusammenfassung der relevanten Datenbank-E-Mail Systemansichten.

  1. Die relevanteste Protokollierung erfolgt in der sysmail-Systemsicht msdb . Sie können diese Ansichten direkt in Ihrer Umgebung abfragen.

    Name Typ Beschreibung
    sysmail_allitems Anzeigen Listen alle Nachrichten, die an Datenbank-E-Mail übermittelt werden.
    sysmail_event_log Anzeigen Listen Meldungen zum Verhalten des Datenbank-E-Mail externen Programms.
    sysmail_faileditems Anzeigen Informationen zu Nachrichten, die Datenbank-E-Mail nicht senden konnten.
    sysmail_mailattachments Anzeigen Informationen zu Anlagen für Datenbank-E-Mail Nachrichten.
    sysmail_sentitems Anzeigen Informationen zu Nachrichten, die mithilfe von Datenbank-E-Mail gesendet wurden.
    sysmail_unsentitems Anzeigen Informationen zu Nachrichten, die Datenbank-E-Mail gerade zu senden versucht.
  2. Einige Fehler werden im Ereignisprotokoll der Windows-Anwendung protokolliert.

Schritt 1: Überprüfen sysmail_event_log Ansicht

Diese Systemansicht ist der Ausgangspunkt für die Behandlung aller Datenbank-E-Mail Probleme.

Suchen Sie bei der Problembehandlung Datenbank-E-Mail in der sysmail_event_log Ansicht nach Ereignissen, die sich auf E-Mail-Fehler beziehen. Einige Nachrichten (z. B. der Fehler des Datenbank-E-Mail externen Programms) sind nicht bestimmten E-Mails zugeordnet.

Sysmail_event_logenthält eine Zeile für jede Windows- oder SQL Server Nachricht, die vom Datenbank-E-Mail System zurückgegeben wird. Wählen Sie in SQL Server Management Studio (SSMS) die Option Verwaltung aus, klicken Sie mit der rechten Maustaste auf Datenbank-E-Mail, und wählen Sie Datenbank-E-Mail Protokoll anzeigen aus, um das Datenbank-E-Mail Protokoll wie folgt zu überprüfen:

Screenshot: Datenbank-E-Mail Protokollelement anzeigen im Menü Datenbank-E-Mail.

Führen Sie die folgende Abfrage für aus sysmail_event_log:

SELECT er.log_id AS [LogID],
  er.event_type AS [EventType],
  er.log_date AS [LogDate],
  er.description AS [Description],
  er.process_id AS [ProcessID],
  er.mailitem_id AS [MailItemID],
  er.account_id AS [AccountID],
  er.last_mod_date AS [LastModifiedDate],
  er.last_mod_user AS [LastModifiedUser]
FROM msdb.dbo.sysmail_event_log er
ORDER BY [LogDate] DESC

Die event_type Spalte kann die folgenden Werte aufweisen:

  • Fehler
  • Warnungen
  • Information
  • Erfolgreich

Um nur die erforderlichen Ereignistypen anzuzeigen, verwenden Sie die WHERE -Klausel zum Filtern.

Überprüfen des bestimmten fehlerhaften E-Mail-Elements

Um nach Fehlern zu suchen, die sich auf bestimmte E-Mails beziehen, suchen Sie die mailitem_id der fehlerhaften E-Mail in der sysmail_faileditems Ansicht, und suchen Sie dann in sysmail_event_lognach Nachrichten, die sich auf mailitem_id beziehen.

SELECT er.log_id AS [LogID], 
    er.event_type AS [EventType], 
    er.log_date AS [LogDate], 
    er.description AS [Description], 
    er.process_id AS [ProcessID], 
    er.mailitem_id AS [MailItemID], 
    er.account_id AS [AccountID], 
    er.last_mod_date AS [LastModifiedDate], 
    er.last_mod_user AS [LastModifiedUser],
    fi.send_request_user,
    fi.send_request_date,
    fi.recipients, fi.subject, fi.body
FROM msdb.dbo.sysmail_event_log er 
    LEFT JOIN msdb.dbo.sysmail_faileditems fi
ON er.mailitem_id = fi.mailitem_id
ORDER BY [LogDate] DESC

Wenn ein Fehler von sp_send_dbmailzurückgegeben wird, wird die E-Mail nicht an das Datenbank-E-Mail System übermittelt, und der Fehler wird nicht in der sysmail_event_log Ansicht angezeigt. Sie sollten die Ablaufverfolgung des Profilers auf Anweisungsebene erfassen und den aufgetretenen Fehler beheben.

Wenn einzelne Kontoübermittlungsversuche fehlschlagen, werden Datenbank-E-Mail die Fehlermeldungen bei Wiederholungsversuchen so lange zurückhalten, bis die Zustellung des E-Mail-Elements erfolgreich war oder fehlschlägt. Wenn die Übermittlung am Ende erfolgreich ist, werden alle akkumulierten Fehler als separate Warnungen protokolliert, einschließlich account_id. Dies kann auch dann zu einer Warnung führen, wenn die E-Mail gesendet wurde. Wenn die Übermittlung am Ende fehlschlägt, werden alle vorherigen Warnungen als eine Fehlermeldung ohne protokolliert, account_id da alle Konten fehlgeschlagen sind.

Probleme, die möglicherweise in sysmail_event_log protokolliert werden

Die folgenden Probleme können in sysmail_event_logprotokolliert werden:

  • Fehler der DatabaseMail.exe beim Herstellen einer Verbindung mit SQL Server.

    Wenn das externe Programm nicht in den msdb-Tabellen protokollieren kann, protokolliert das Programm Fehler im Ereignisprotokoll der Windows-Anwendung.

  • Fehler im Zusammenhang mit dem SMTP-Server.

    • Fehler beim Kontaktieren des SMTP-Servers.
    • Fehler bei der Authentifizierung beim SMTP-Server.
    • Der SMTP-Server lehnt die E-Mail-Nachricht ab.
  • Ausnahmen in DatabaseMail.exe.

Wenn keine Probleme mit Datenbank-E-Mail externen ausführbaren Datei auftreten, wechseln Sie zu den Sysmail-Systemansichten. Um nach Fehlern zu suchen, die sich auf bestimmte E-Mails beziehen, suchen Sie die mailitem_id der fehlerhaften E-Mail in der sysmail_faileditems Ansicht, und suchen Sie dann in sysmail_event_lognach Nachrichten, die sich auf mailitem_id beziehen. Wenn ein Fehler von sp_send_dbmailzurückgegeben wird, wird die E-Mail nicht an das Datenbank-E-Mail System übermittelt, und der Fehler wird nicht in der sysmail_event_log Ansicht angezeigt.

Schritt 2: Überprüfen der ansichten sysmail_unsentitems, sysmail_sentitems und sysmail_faileditems

Sie können diese Ansichten auf Probleme mit bestimmten E-Mails überprüfen, um festzustellen, ob Datenbank-E-Mails gesendet werden, in der Warteschlange hängen bleiben oder nicht gesendet werden können.

Interne Tabellen in der msdb-Datenbank enthalten die E-Mail-Nachrichten und Anlagen, die von Datenbank-E-Mail gesendet werden, zusammen mit ihren aktuellen status. Datenbank-E-Mail aktualisiert diese Tabellen, wenn die Nachrichten verarbeitet werden.

Sysmail_mailitems table ist die Basistabelle für die anderen Sysmail-Ansichten. Die sysmail_allitems Ansicht basiert auf der Tabelle und ist eine Obermenge dieser Ansichten.

Hinweis

Wenn Sie die msdb-Produktionsdatenbank sichern und auf einem anderen Testsystem als Benutzerdatenbank wiederherstellen, können Sie die sysmail-Systemsichten in der wiederhergestellten Sicherung neu erstellen. Die Ansichtsdefinitionen in der wiederhergestellten Sicherung verweisen auf die msdb-Datenbank auf dem System, auf dem Sie die Sicherung wiederhergestellt haben. Sehen Sie sich das Skript zum erneuten Erstellen von Sysmail-Ansichten in msdb des Kunden im Abschnitt Msdb-Sicherung an.

Sysmail_unsentitems

Diese Ansicht enthält eine Zeile für jede Datenbank-E-Mail Nachricht, deren status nicht gesendet oder wiederholt wird.

Verwenden Sie diese Ansicht, wenn Sie sehen möchten, wie viele Nachrichten darauf warten, gesendet zu werden, und wie lange sie sich in der E-Mail-Warteschlange befinden. Im Allgemeinen ist die Anzahl der nicht gesendeten Nachrichten gering. Sie können bei normalen Vorgängen benchmarken, um eine angemessene Anzahl von Nachrichten in der Nachrichtenwarteschlange für normale Vorgänge zu ermitteln.

Sie können auch E-Mails einchecken sysmail_unsentitems , wenn Probleme mit den Service Broker-Objekten in msdb vorliegen. Wenn die ExternalMailQueue Warteschlange oder InternalMailQueue deaktiviert ist oder Probleme mit der Route auftreten, bleibt die E-Mail möglicherweise in sysmail_unsentitmes.

Nicht gesendete oder wiederholte Nachrichten befinden sich weiterhin in der E-Mail-Warteschlange und können jederzeit gesendet werden. Nachrichten können aus den folgenden Gründen nicht gesendete status haben:

  • Die Nachricht ist neu. Obwohl die Nachricht in der E-Mail-Warteschlange platziert wurde, arbeitet Datenbank-E-Mail an anderen Nachrichten und hat diese Nachricht noch nicht erreicht.
  • Das Datenbank-E-Mail externen Programm wird nicht ausgeführt, und es wird keine E-Mail gesendet.

Nachrichten können aus den folgenden Gründen status werden:

  • Datenbank-E-Mail versucht, die E-Mail zu senden, konnte aber keine Verbindung mit dem SMTP-E-Mail-Server herstellen. Datenbank-E-Mail versucht weiterhin, die Nachricht mithilfe anderer Datenbank-E-Mail Konten zu senden, die dem Profil zugewiesen sind, von dem die Nachricht gesendet wurde. Wenn kein Konto die E-Mail senden kann, wartet Datenbank-E-Mail auf die Für den Account Retry Delay Parameter konfigurierte Zeit und versucht dann erneut, die Nachricht zu senden. Datenbank-E-Mail verwendet den Parameter, um zu bestimmen, wie oft versucht wird, die Nachricht zu senden. Wenn Datenbank-E-Mail versucht, die Nachricht zu senden, bleibt die Nachricht der wiederholte status.
  • Datenbank-E-Mail stellt eine Verbindung mit dem SMTP-Server her, aber es tritt ein Fehler auf. Der smtp-Fehlercode, der vom SMTP-Server zurückgegeben wird, und alle zugehörigen Fehlermeldungen können für die weitere Problembehandlung verwendet werden.

Sysmail_faileditems

Wenn Sie wissen, dass die E-Mail nicht gesendet werden konnte, können Sie direkt abfragen sysmail_faileditems . Weitere Informationen zum Abfragen sysmail_faileditems und Filtern nach bestimmten Nachrichten nach Empfänger finden Sie unter Überprüfen des Status von E-Mail-Nachrichten, die mit Datenbank-E-Mail gesendet werden.

Führen Sie die folgenden Skripts aus, um die status von E-Mail-Nachrichten zu überprüfen, die mit Datenbank-E-Mail gesendet werden:

-- Show the subject, the time that the mail item row was last  
-- modified, and the log information.  
-- Join sysmail_faileditems to sysmail_event_log   
-- on the mailitem_id column.  
-- In the WHERE clause list items where danw was in the recipients,  
-- copy_recipients, or blind_copy_recipients.  
-- These are the items that would have been sent to Jane@contoso.com
 
SELECT items.subject, items.last_mod_date, l.description 
FROM dbo.sysmail_faileditems AS items  
INNER JOIN dbo.sysmail_event_log AS l ON items.mailitem_id = l.mailitem_id  
WHERE items.recipients LIKE '%Jane%'    
    OR items.copy_recipients LIKE '%Jane%'   
    OR items.blind_copy_recipients LIKE '%Jane%'  
GO  

Sysmail_sentitems

Wenn Sie den Zeitpunkt ermitteln möchten, zu dem die letzte E-Mail erfolgreich gesendet wurde, können Sie wie folgt abfragen sysmail_sentitems und sortieren sent_date :

SELECT ssi.sent_date, * 
FROM msdb.dbo.sysmail_sentitems ssi
ORDER BY ssi.sent_date DESC

Wenn bestimmte Arten von E-Mails erfolgreich gesendet werden, andere jedoch nicht, hilft Ihnen diese Ansicht möglicherweise, die Unterschiede herauszufinden.

Schritt 3: Überprüfen sysmail_mailattachments Ansicht

Diese Ansicht enthält eine Zeile für jede Anlage, die an Datenbank-E-Mail übermittelt wird. Verwenden Sie diese Ansicht, wenn Sie Informationen zu Datenbank-E-Mail Anlagen benötigen.

Wenn Sie Probleme beim Senden von E-Mails mit Anlagen haben, aber einige E-Mails mit Anlagen erfolgreich gesendet werden, hilft Ihnen diese Ansicht möglicherweise, die Unterschiede herauszufinden.

Schritt 4: Überprüfen Datenbank-E-Mail Konfiguration für SMTP-Server

Ein weiterer Schritt, um Datenbank-E-Mail Probleme zu beheben, besteht darin, die Datenbank-E-Mail Konfiguration für den SMTP-Server und das Konto zu überprüfen, das zum Senden von Datenbank-E-Mail verwendet wird.

Weitere Informationen zum Konfigurieren von Datenbank-E-Mail finden Sie unter Konfigurieren von Datenbank-E-Mail.

Konfigurieren von Datenbank-E-Mail

Führen Sie die folgenden Schritte aus, um Datenbank-E-Mail zu konfigurieren:

  1. Öffnen Sie SSMS, wählen Sie Verwaltung aus, klicken Sie mit der rechten Maustaste auf Datenbank-E-Mail, und wählen Sie Datenbank-E-Mail konfigurieren aus.

    Screenshot: Datenbank-E-Mail Protokollelement konfigurieren im Menü Datenbank-E-Mail

  2. Wählen Sie Datenbank-E-Mail Konten und Profile verwalten>Weiter aus.

  3. Wenn Sie über ein Konto verfügen, wählen Sie Anzeigen, Ändern oder Löschen eines vorhandenen Kontos aus, und wählen Sie Weiter aus. Wählen Sie andernfalls Neues Konto erstellen aus. Der folgende Screenshot zeigt die Kontoeinstellungen, die zum Herstellen einer Verbindung mit dem SMTP-Server und zum Senden von Datenbank-E-Mail verwendet werden.

    Screenshot: Verwalten eines vorhandenen Kontos im Konfigurations-Assistenten für Datenbank-E-Mail

Achten Sie besonders auf:

  • Servername und Portnummer. Der Servername muss ein vollqualifizierter Domänenname sein, und die Portnummer muss korrekt sein. Im Allgemeinen ist der SMTP-Standardport 25, aber Sie müssen die aktuelle SMTP-Konfiguration überprüfen.

  • SSL. Überprüfen Sie, ob für den SMTP-Server SSL (Secure Sockets Layer) oder Transport Layer Security (TLS) erforderlich ist.

  • SMTP-Authentifizierung. Verwenden Sie die Windows-Authentifizierung des Datenbank-Engine-Diensts, die Standardauthentifizierung mit einem angegebenen Domänenkonto oder die anonyme Authentifizierung? Sie müssen überprüfen, was der SMTP-Server in Ihrer eigenen Umgebung zulässt. Wenn ein Domänenkonto angegeben ist (entweder Dienstkonto oder Standardauthentifizierung), muss es über die Berechtigungen auf dem SMTP-Server verfügen.

Sie können die Konfiguration verwenden, um eine Test-E-Mail mit PowerShell zu senden. Weitere Informationen finden Sie unter Senden einer Test-E-Mail mit PowerShell.

Überprüfen Datenbank-E-Mail Systemparameter

Führen Sie die folgenden Schritte aus, um die Systemparameter zu überprüfen:

  1. Öffnen Sie SSMS, wählen Sie Verwaltung aus, klicken Sie mit der rechten Maustaste auf Datenbank-E-Mail, und wählen Sie Datenbank-E-Mail konfigurieren aus.

  2. Wählen Sie Systemparameter anzeigen oder ändern aus.

Der folgende Screenshot zeigt die Standardwerte für die Systemparameter. Beachten Sie eindeutige Systemparameter, und bestimmen Sie, ob sie mit dem Problem in Zusammenhang stehen, das Sie behandeln.

Screenshot: Konfigurieren von Systemparametern im Konfigurations-Assistenten für Datenbank-E-Mail

Schritt 5: Senden einer Test-E-Mail

In diesem Abschnitt erfahren Sie, wie Sie eine Test-Datenbank-E-Mail mithilfe von SSMS und PowerShell senden.

Senden einer Test-E-Mail mit Datenbank-E-Mail

Durch das Senden einer Test-E-Mail können Sie versuchen, das aufgetretene Problem zu reproduzieren und zu überprüfen, ob Datenbank-E-Mail gesendet werden können.

Um eine Test-Datenbank-E-Mail zu senden, wählen Sie Verwaltung aus, klicken Sie mit der rechten Maustaste auf Datenbank-E-Mail, und wählen Sie Test-E-Mail senden... aus.

Screenshot der Option

Nachdem Sie die Test-E-Mail gesendet haben, überprüfen Sie die Datenbank-E-Mail Protokoll- und Sysmail-Ansichten.

  • Wenn die Test-E-Mail nicht erfolgreich gesendet wurde, verwenden Sie dieses Dokument, um zu beheben, warum sie nicht gesendet wird.
  • Wenn die Test-E-Mail erfolgreich gesendet wurde, aber weiterhin Probleme mit anderen E-Mails bestehen, die nicht gesendet werden, konzentrieren Sie sich auf die Details der E-Mail-Nachrichten, die nicht gesendet werden. Überprüfen Sie den tatsächlichen sp_send_dbmail Befehl, der ausgeführt wird. Wenn Sie nicht über den Transact-SQL-Befehl verfügen, erfassen Sie eine XEvent-Ablaufverfolgung mithilfe sql_batch_completed von - und sql_batch_started -Befehlen, und sehen Sie sich die batch_text Spalte an.

Senden einer Test-E-Mail mit PowerShell

Mithilfe eines externen Prozesses können Sie Datenbank-E-Mail von der Problembehandlung ausschließen und die Kontokonfiguration testen. Verwenden Sie beispielsweise PowerShell, um eine Test-E-Mail zu senden. Wenn Sie eine Test-E-Mail nicht mithilfe von PowerShell senden können, deutet dies darauf hin, dass es sich nicht um ein Datenbank-E-Mail Problem handelt.

Wenn die von PowerShell gesendete E-Mail mit den gleichen SMTP-Servereinstellungen und -Anmeldeinformationen fehlschlägt, kann dies darauf hindeuten, dass das Problem auf dem SMTP-Server liegt.

  • Ändern Sie die folgenden Parameter entsprechend Ihrer Umgebung, und führen Sie dann das folgende Skript aus:

    $EmailFrom = "dbmail@contoso.com"
    $EmailPass = "Y0reP@ssw0rd"
    $EmailTo = "email_alias@contoso.com"
    $Port = 587
    $Subject = "Test From PowerShell"
    $Body = "Did this work?"
    $SMTPServer = "smtp.contoso.com"
    
    $SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, $Port)
    $SMTPClient.EnableSsl = $true
    $SMTPClient.Credentials = New-Object System.Net.NetworkCredential($EmailFrom, $EmailPass);
    $SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body) 
    
  • Wenn Ihr SMTP-Server die anonyme Authentifizierung zulässt, verwenden Sie Den Standardport 25, und ssl ist nicht erforderlich. Führen Sie folgendes Skript aus:

    $EmailFrom = "dbmail@contoso.com"
    $EmailTo = "email_alias@contoso.com"
    $Port = 25
    $Subject = "Test From PowerShell (Anonymous Auth, no SSL)"
    $Body = "Did this work?"
    $SMTPServer = "smtp.contoso.com"
    
    $SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, $Port)
    $SMTPClient.EnableSsl = $true
    $SMTPClient.Credentials = New-Object System.Net.NetworkCredential($EmailFrom, $EmailPass);
    $SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body) 
    

Schritt 6: Überprüfen der Sysmail Service Broker-Objekte

Probleme mit den Service Broker-Objekten in msdb können zu nicht erfolgreichen Vorgängen von Datenbank-E-Mail führen. Ein häufiges Problem besteht darin, dass eine der Service Broker-Warteschlangen (ExternalMailQueue und InternalMailQueue) deaktiviert ist. Dieses Problem kann durch eine nicht verarbeitbare Nachricht verursacht werden, die in Service Broker nicht erfolgreich gesendet werden kann. Beispiel: falsch formatiertes XML. Wenn eine Nachricht nach fünf Versuchen nicht gesendet werden kann, wird sie als "giftig" betrachtet, und die Warteschlange wird deaktiviert, bis die nicht verarbeitbare Nachricht entfernt wird. Durch das erneute Aktivieren der Warteschlange wird das Problem nicht behoben, da sich die nicht verarbeitbare Nachricht noch in der Warteschlange befindet und die Fehlersequenz einfach wiederholt wird. Weitere Informationen zu nicht verarbeitbaren Nachrichten finden Sie unter Behandlung von nicht verarbeitbaren Nachrichten.

Eines der anderen Service Broker-Objekte (z Message Type. B. , Contract, Serviceund Route) ist möglicherweise ebenfalls deaktiviert oder fehlt. Die Service Broker-Warteschlangen verfügen über eine Aktivierungsprozedur, die der Warteschlange zugeordnet ist, sodass dies ein möglicher Fehlerpunkt ist. Sie können die activation_procedure Spalte in msdb.sys.service_queuesüberprüfen und dann mit sp_helptext überprüfen, ob Probleme vorliegen.

Führen Sie die folgende Abfrage aus, und überprüfen Sie dann den Inhalt der zweiten Spalte der Abfrageergebnisse.

SELECT CONVERT(VARCHAR(32),name) Name, 'exec sp_helptext ''' + activation_procedure + '''' ActivationProc_Code 
FROM msdb.sys.service_queues

Um festzustellen, ob Probleme mit den Service Broker-Objekten vorliegen, ist es besser, die Objekte mit einer funktionierenden Datenbank-E-Mail-Konfiguration zu vergleichen. Hier sind die Objekte, mit denen Sie vergleichen sollten:

  • Message Types
    • {//www.microsoft.com/databasemail/messages} Sendmail
    • {//www.microsoft.com/databasemail/messages} SendMailStatus
  • Contracts
    • www.microsoft.com/databasemail/contracts/SendMail/v1.0
  • Queues
    • dbo.ExternalMailQueue
    • dbo.InternalMailQueue
  • Services
    • ExternalMailService
    • InternalMailService
  • Routes

Problembehandlung für erweiterte Datenbank-E-Mail

Die erweiterte Problembehandlung gilt für die folgenden Szenarien:

  • Wenn Sie sich das Datenbank-E-Mail Protokoll ansehen, stürzt Datenbank-E-Mail ab, und die Ursache wird nicht vollständig erklärt. Sie sehen, dass der DatabaseMail-Prozess gestartet sofort von einer Ausnahmemeldung gefolgt wird, und dann wird der DatabaseMail-Prozess heruntergefahren angezeigt.
  • Datenbank-E-Mail wird nicht erfolgreich gestartet. Sie sehen nicht, dass der DatabaseMail-Prozess in der sysmail_event_log Ansicht gestartet wurde.
  • Die erste Problembehandlung hilft Ihnen nicht bei der Behebung des Problems.

Sie können die folgenden Methoden für erweiterte Datenbank-E-Mail Problembehandlung verwenden.

Die Sammlungen für die erweiterte Problembehandlung

Um die Probleme zu beheben, benötigen Sie möglicherweise eine oder mehrere dieser Sammlungen.

Methode 1: Sichern der msdb-Datenbank

Es kann hilfreich sein, die Sysmail-Ansichten in einer Umgebung abzufragen, die von der Produktion getrennt ist. In einigen Fällen können Sie die msdb-Datenbank sichern und dann auf einem anderen instance wiederherstellen. Die Sysmail-Sichten werden alle mit Verweis auf msdb definiert, sodass die Sichten auch bei Abfragen in der wiederhergestellten msdb-Sicherung auf die msdb-Systemdatenbank in Ihrem instance verweisen. Um sysmail-Sichten aus der msdb-Produktionsumgebung neu zu erstellen, erstellen Sie die sysmail-Ansichten in der Benutzerdatenbank mit dem folgenden Skript neu.

/* sysmail_allitems */

USE [msdb_customer]
GO

PRINT 'Creating view sysmail_allitems in msdb backup from customer...'
GO
IF (EXISTS (SELECT *
            FROM [msdb_customer].dbo.sysobjects
            WHERE (NAME = N'sysmail_allitems')
              AND (TYPE = 'V')))
  DROP VIEW sysmail_allitems
GO

CREATE VIEW sysmail_allitems
AS
SELECT mailitem_id, profile_id, recipients, copy_recipients, blind_copy_recipients, subject, body, body_format, importance, sensitivity, file_attachments,
       attachment_encoding, query, execute_query_database, attach_query_result_as_file, query_result_header, query_result_width, query_result_separator,
       exclude_query_output, append_query_error, send_request_date, send_request_user, sent_account_id,
       CASE sent_status 
          WHEN 0 THEN 'unsent' 
          WHEN 1 THEN 'sent' 
          WHEN 3 THEN 'retrying' 
          ELSE 'failed' 
       END AS sent_status,
       sent_date, last_mod_date, last_mod_user       
FROM [msdb_customer].dbo.sysmail_mailitems 
WHERE (send_request_user = SUSER_SNAME()) OR (ISNULL(IS_SRVROLEMEMBER(N'sysadmin'), 0) = 1) 

GO

/* sysmail_sentitems */

USE [msdb_customer]
GO

PRINT 'Creating view sysmail_sentitems in msdb backup from customer...'
GO
IF (EXISTS (SELECT *
            FROM [msdb_customer].dbo.sysobjects
            WHERE (NAME = N'sysmail_sentitems')
              AND (TYPE = 'V')))
  DROP VIEW sysmail_sentitems
GO

CREATE VIEW sysmail_sentitems
AS
SELECT * FROM [msdb_customer].dbo.sysmail_allitems WHERE sent_status = 'sent'

GO

/* sysmail_unsentitems */

USE [msdb_customer]
GO

PRINT 'Creating view sysmail_unsentitems in msdb backup from customer...'
GO
IF (EXISTS (SELECT *
            FROM [msdb_customer].dbo.sysobjects
            WHERE (NAME = N'sysmail_unsentitems')
              AND (TYPE = 'V')))
  DROP VIEW sysmail_unsentitems
GO

CREATE VIEW sysmail_unsentitems
AS
SELECT * FROM [msdb_customer].dbo.sysmail_allitems WHERE (sent_status = 'unsent' OR sent_status = 'retrying')

GO

/* sysmail_faileditems */

USE [msdb_customer]
GO

PRINT 'Creating view sysmail_faileditems in msdb backup from customer...'
GO
IF (EXISTS (SELECT *
            FROM [msdb_customer].dbo.sysobjects
            WHERE (NAME = N'sysmail_faileditems')
              AND (TYPE = 'V')))
  DROP VIEW sysmail_faileditems
GO

CREATE VIEW sysmail_faileditems
AS
SELECT * FROM [msdb_customer].dbo.sysmail_allitems WHERE sent_status = 'failed'

GO

/* sysmail_event_log */
USE [msdb_customer]
GO
PRINT 'Creating view sysmail_event_log in msdb backup from customer...'
GO
IF (EXISTS (SELECT *
            FROM [msdb_customer].dbo.sysobjects
            WHERE (NAME = N'sysmail_event_log')
              AND (TYPE = 'V')))
  DROP VIEW sysmail_event_log
GO
CREATE VIEW sysmail_event_log
AS
SELECT log_id,
       CASE event_type 
          WHEN 0 THEN 'success' 
          WHEN 1 THEN 'information' 
          WHEN 2 THEN 'warning' 
          ELSE 'error' 
       END as event_type,
       log_date, description, process_id, sl.mailitem_id, account_id, sl.last_mod_date, sl.last_mod_user
FROM [msdb_customer].[dbo].[sysmail_log]  sl
WHERE (ISNULL(IS_SRVROLEMEMBER(N'sysadmin'), 0) = 1) OR 
      (EXISTS ( SELECT mailitem_id FROM [msdb_customer].[dbo].[sysmail_allitems] ai WHERE sl.mailitem_id = ai.mailitem_id ))

GO

Weitere Informationen zu Sysmail-Ansichten finden Sie im Abschnitt sysmail-Systemsichten .

Methode 2: Überprüfen des Windows-Anwendungsereignisprotokolls

Wenn das externe DatabaseMail.exe Programm nicht in der msdb-Tabelle protokollieren kann, protokolliert das Programm den Fehler im Ereignisprotokoll der Windows-Anwendung. Wenn DatabaseMail.exe eine Ausnahme findet, wird die Ausnahme außerdem protokolliert. Obwohl der Ausnahmestapel in der Regel identisch ist, überprüfen Sie das Ereignisprotokoll, um festzustellen, ob andere Stapelinformationen vorhanden sind.

Manchmal stellen Sie bei der Problembehandlung eines DatabaseMail.exe Absturz möglicherweise fest, dass die Protokollierung darauf hindeutet, dass ein Windows-Fehlerberichtsabbild wie folgt erstellt wurde:

<datetime stamp>,Information,0,1001,Windows Error Reporting,Viewpoint.contoso.com,"Fault bucket , type 0
Event Name: APPCRASH
Response: Not available
Cab Id: 0
Problem signature:
P1: DatabaseMail.exe
P2: 11.0.2100.60
P3: 4f35e1a1
P4: KERNELBASE.dll
P5: 6.3.9600.18725
P6: 59380775
P7: c0000142
P8: 00000000000ece60
P9: 
P10: 
Attached files:
These files may be available here:
C:\ProgramData\Microsoft\Windows\WER\ReportQueue\AppCrash_DatabaseMail.exe_deaadc12935831f6bbfe9bdcb0cbf864374426c1_807e7507_337982fd
Analysis symbol: 
Rechecking for solution: 0
Report Id: <Report Id>
Report Status: 4100
Hashed bucket:"

Sie können alle Dateien abrufen, die AppCrash_DatabaseMail.exe_* in der anzeigen. \WER\ReportQueue-Pfad . Vorschläge zur Speicherabbildanalyse finden Sie im Abschnitt ProcDump-Analyse .

Methode 3: Sammeln und Analysieren von XEvent oder SQL Server Trace

Sie können eine Ablaufverfolgung der Transact-SQL-Befehle erfassen, die auf dem System ausgeführt werden, um zu ermitteln, ob bei ihnen ein Fehler auftritt.

Konfigurieren des PSSDiag-Tools

Sie können PSSDiag verwenden, um das XEvent oder SQL Server Ablaufverfolgung unter der Vorlage Allgemeine Leistung zu erfassen. Wie im folgenden Screenshot gezeigt, wählen Sie einige zusätzliche Ereignisse aus, insbesondere alle Brokerereignisse.

Screenshot des Pssdiag-Tools, in dem alle Brokerereignisse auf der Registerkarte

Analysieren der Xevent- oder SQL-Ablaufverfolgung

Wenn ein Datenbank-E-Mail gesendet wird, werden in einer Xevent- oder Profiler-Erfassung in der Regel fünf verschiedene Sitzungen (SPIDs) angezeigt.

  • sp_send_dbmail: Nachdem Sie die Transact-SQL-Anweisung ausgeführt haben, werden die Service Broker-Ereignisse angezeigt, die verwendet werden, um die Nachrichten in der ExternalMailQueue Warteschlange zu platzieren.

  • Service Broker-Aktivierung zum Senden von Nachrichten an den SMTP-Server über DatabaseMail.exe. Der Anwendungsname lautet "Microsoft SQL Server Service Broker Activation".

  • Datenbank-E-Mail Externes Programm: Dies ist das externe Datenbank-E-Mail Programm, das Nachrichten aus der ExternalMailQueue Warteschlange empfängt und Nachrichten vorbereitet, die an den SMTP-Server gesendet werden sollen. Der Anwendungsname lautet "DatabaseMail - DatabaseMail - ID<PID>".

  • Datenbank-E-Mail Externes Programm: Dies ist eine weitere Verbindung von Datenbank-E-Mail. Nachdem die erste Verbindung die vorhandenen Nachrichten in der ExternalMailQueue Warteschlange verarbeitet hat, wird die Verbindung erstellt, um zu lauschen, dass weitere Nachrichten in der Warteschlange platziert werden. Wenn keine weiteren Nachrichten in der Warteschlange vorhanden sind, wird diese Verbindung vonDatabaseMail.exe beendet und geschlossen.

  • Service Broker-Aktivierung zum Empfangen von Antwortnachrichten vom SMTP-Server über DatabaseMail.exe. Die sysmail-Tabellen werden aktualisiert, um die Ergebnisse gesendeter E-Mails zu protokollieren.

Sie können das erwartete Verhalten nur erkennen, indem Sie viele der Ablaufverfolgungen anzeigen. Die beste Möglichkeit, die Unterschiede zu erkennen, besteht darin, Ihre Ablaufverfolgung mit der der erfolgreich gesendeten Datenbank-E-Mails zu vergleichen. Wenn Sie manchmal eine Datenbank-E-Mail senden können, vergleichen Sie die Ablaufverfolgung mit einer erfolgreichen Ablaufverfolgung, sehen Sie sich den Unterschied an, und suchen Sie nach Fehlern, die von den SPIDs gemeldet werden. Wenn Sie keine Datenbank-E-Mail senden können, vergleichen Sie die Ablaufverfolgung mit der Ablaufverfolgung, die erfolgreich in Ihrer Testumgebung gesendet wurde.

Methode 4: Erfassen und Analysieren von Prozessmonitorereignissen

Process Monitor (Procmon) ist Teil der Windows Sysinternals-Suite.

Der Prozessmonitor erzeugt eine laute Erfassung. Um nichts zu verpassen, ist es besser, Filter auf die Daten anzuwenden, nachdem sie erfasst wurden, anstatt während des Erfassungsprozesses. In der Regel können Sie die Erfassung auf eine Reproduktion des Datenbank-E-Mail Problems ausrichten, sodass die erfassten Daten insgesamt nicht zu groß wären.

Erfassen von Datei-, Registrierungs-, Netzwerk-, Prozess- und Threadereignissen

Wenn Sie procmon.exestarten, beginnt die Erfassung von Daten sofort. Die GRAFISCHE Benutzeroberfläche ist einfach. Sie müssen die Erfassung von Ereignissen beenden, bis Sie bereit sind, das Problem zu reproduzieren. Wählen Sie Dateierfassungsereignisse>(STRG+E) aus, um das Menüelement zu deaktivieren und die Ereignissammlung zu beenden. Wählen Sie das Radierersymbol aus, oder drücken Sie STRG+X, um die bereits erfassten Ereignisse zu löschen:

Screenshot des Procmon-Tools, das zeigt, dass alle Ereignisse gelöscht sind.

Wenn Sie bereit sind, das Datenbank-E-Mail Problem zu reproduzieren, führen Sie die folgenden Schritte aus:

  1. Wählen Sie Dateierfassungsereignisse>(STRG+E) aus, um mit der Erfassung von Ereignissen zu beginnen.
  2. Versuchen Sie, die Datenbank-E-Mail zu senden, um das Problem zu reproduzieren.
  3. Wählen Sie Dateierfassungsereignisse>(STRG+E) aus, um die Erfassung von Ereignissen zu beenden.
  4. Speichern Sie die Datei als *. PML.

Analysieren der Ablaufverfolgung des Prozessmonitors

Nachdem Sie die erhalten haben. PML-Datei, öffnen Sie sie erneut mithilfe des Prozessmonitors. Filtern Sie zunächst die Datei nach den DatabaseMail.exe - und sqlservr.exe-Prozessen . Wählen Sie dann Filterfilter > ... aus, oder klicken Sie auf das Filtersymbol, um das Filtermenü zu öffnen.

Wählen Sie unter Prozessname die Optionsqlservr.exe und DatabaseMail.exeaus, und fügen Sie dann die folgenden Einträge hinzu:

Screenshot des Procmon-Tools, das zeigt, database.exe gefiltert wird.

Genau wie bei SQL XEvent oder der Ablaufverfolgungserfassung ist nicht sofort ersichtlich, wonach sie suchen sollten. In der Regel besteht die beste Möglichkeit zum Starten der Analyse darin, Ihre Ablaufverfolgung mit einer Procmon-Erfassung für eine erfolgreich gesendete Datenbank-E-Mail zu vergleichen. Im Idealfall vergleichen Sie die Ablaufverfolgung mit einer erfolgreich gesendeten E-Mail aus derselben Umgebung, in der das Problem auftritt. Wenn jedoch keine Datenbank-E-Mail in der spezifischen Umgebung erfolgreich gesendet wurde, vergleichen Sie die Ablaufverfolgung mit einer erfolgreich gesendeten E-Mail in einer anderen Umgebung.

Wenn DatabaseMail.exe eine DLL nicht laden oder die DatabaseMail.exe.config Datei nicht finden kann, ist die Analyse nützlich.

Methode 5: Erfassen und Analysieren des Ausnahmeabbilds mithilfe des ProcDump-Tools

ProcDump ist auch Teil der Windows Sysinternals-Suite.

ProcDump ist nützlich, wenn Sie versuchen, ein Speicherabbild des DatabaseMail.exe externen Programms zu erfassen. In der Regel verwenden Sie ProcDump für die Problembehandlung, wenn DatabaseMail.exe auf eine nicht behandelte Ausnahme stößt.

Konfigurieren von ProcDump

Um ProcDump so zu konfigurieren, dass ein Speicherabbild von DatabaseMail.exe erfasst wird, wenn eine ausnahme nicht behandelt wird, öffnen Sie zunächst eine Eingabeaufforderung mit Administratorrechten. Aktivieren Sie dann ProcDump, um das Speicherabbild des DatabaseMail.exe Prozesses mit dem folgenden Befehl zu erfassen:

c:\Sysinternals> procdump -ma -t DatabaseMail.exe -w e2

Im Befehlsfenster wird die folgende Ausgabe angezeigt:

ProcDump v9.0 - Sysinternals process dump utility
Copyright (C) 2009-2017 Mark Russinovich and Andrew Richards
Sysinternals - www.sysinternals.com
 
Waiting for process named DatabaseMail.exe...

Reproduzieren Sie dann das Problem. Das Speicherabbild wird im selben Ordner erstellt, in dem Sie ProcDump.exeausgeführt haben.

Analysieren des Ausnahmeabbilds

Suchen Sie den Ausnahmedatensatz, und untersuchen Sie die Aufrufliste, die zu der Ausnahme führt.

  1. Öffnen Sie die Speicherabbilddatei in WinDbg (Debugtools für Windows herunterladen – WinDbg – Windows-Treiber).
  2. Wechseln Sie mit .ecxr dem Befehl oder !analyze -v zum Ausnahmedatensatz.

Wenn Sie über den Stapel verfügen, beginnen Sie mit der Suche nach bekannten Problemen für eine übereinstimmende Aufrufliste. Wenn Sie weitere Hilfe benötigen, wenden Sie sich an das CSS-Team.

Methode 6: Verwenden des Zeitreisedebuggingtools

Time Travel Debugging (TTD)-Erfassung ist in der Regel der letzte Ausweg für schwierige Probleme. Sie können den WinDbg-Vorschaudebugger verwenden, um ihn abzurufen. Umfassende Anweisungen und Informationen zu TTD finden Sie unter Time Travel Debugging zur Funktionsweise und Analyse. Wenn Sie an diesem Punkt sind, müssen Sie sich an das CSS-Team wenden. Dieser Abschnitt enthält jedoch Anweisungen zum Erfassen der TTD bei Bedarf.

Konfigurieren von TTD

Aus verschiedenen Gründen kann die TTD-Erfassung von DatabaseMail.exe etwas schwierig sein. Erstens wird DatabaseMail.exe nicht unbegrenzt als Dienst ausgeführt, sondern von SQL Server (sqlservr.exe) Prozess aufgerufen. Daher können Sie es nicht anfügen, aber Sie müssen TTD mithilfe des -onLaunch Parameters konfigurieren, um die Erfassung zu starten, wenn DatabaseMail.exe gestartet wird. Da DatabaseMail.exe zweitens von einem anderen Prozess aufgerufen wird, müssen Sie die untergeordneten Debugprozesse verwenden.