Behandeln von Problemen mit Datenbank-E-Mail
Dieser Artikel enthält Methoden zur Problembehandlung Datenbank-E-Mail Probleme. Wenn Das Problem bei der anfänglichen Problembehandlung nicht behoben wurde, verwenden Sie die erweiterte Problembehandlung.
Anfängliche Datenbank-E-Mail Problembehandlung
Im Folgenden finden Sie grundlegende Schritte zur Problembehandlung:
- Überprüfen Sie die ansichten Datenbank-E-Mail log and sysmail (
sysmail_event_log
) for mails that have already been sent or attempted to send by using DatabaseMail.exe. - Senden Sie eine Test-E-Mail. Wenn die Test-E-Mail erfolgreich gesendet wurde, konzentrieren Sie sich auf die Details der nicht gesendeten Nachrichten. Wenn die Test-E-Mail nicht gesendet wird, konzentrieren Sie sich auf die Problembehandlung der Test-E-Mails, und ignorieren Sie die E-Mails, die zuvor nicht gesendet wurden.
- 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.
- Wenn Sie die E-Mail nicht mithilfe von PowerShell senden können, handelt es sich wahrscheinlich um ein SMTP-Konfigurationsproblem, und ein SMTP-Administrator ist erforderlich.
Sie können die folgenden Schritte für die anfängliche Datenbank-E-Mail Problembehandlung verwenden.
Msdb sysmail-Systemansichten
Bevor Sie sich die detaillierten Schritte ansehen, finden Sie hier eine kurze Zusammenfassung der relevanten Datenbank-E-Mail Systemansichten.
Die relevanteste Protokollierung erfolgt in der Msdb Sysmail-Systemansicht. Sie können diese Ansichten direkt in Ihrer Umgebung abfragen.
Name Typ Beschreibung sysmail_allitems Ansicht Listet alle Nachrichten auf, die an Datenbank-E-Mail übermittelt werden. sysmail_event_log Ansicht Listet Nachrichten über das Verhalten des Datenbank-E-Mail externen Programms auf. sysmail_faileditems Ansicht Informationen zu Nachrichten, die Datenbank-E-Mail nicht senden konnten. sysmail_mailattachments Ansicht Informationen über Anlagen von Datenbank-E-Mail-Nachrichten. sysmail_sentitems Ansicht Informationen zu Nachrichten, die mithilfe von Datenbank-E-Mail gesendet wurden. sysmail_unsentitems Ansicht Informationen zu Nachrichten, die Datenbank-E-Mail derzeit senden möchten. 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 Problembehandlung aller Datenbank-E-Mail Probleme.
Durchsuchen Sie bei der Problembehandlung Datenbank-E-Mail die sysmail_event_log
Ansicht nach Ereignissen, die sich auf E-Mail-Fehler beziehen. Einige Nachrichten (z. B. fehler des Datenbank-E-Mail externen Programms) sind nicht bestimmten E-Mails zugeordnet.
Sysmail_event_log
enthä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:
Führen Sie die folgende Abfrage 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
Verwenden Sie zum Filtern die WHERE
Klausel, um nur die erforderlichen Ereignistypen anzuzeigen.
Überprüfen des spezifischen fehlgeschlagenen E-Mail-Elements
Um nach Fehlern zu suchen, die sich auf bestimmte E-Mails beziehen, suchen Sie in der sysmail_faileditems
Ansicht nach mailitem_id
den fehlgeschlagenen E-Mails, und suchen Sie dann nach Nachrichten, die sich auf mailitem_id
sysmail_event_log
diese 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 zurückgegeben sp_send_dbmail
wird, wird die E-Mail nicht an das Datenbank-E-Mail System übermittelt, und der Fehler wird in der sysmail_event_log
Ansicht nicht angezeigt. Sie sollten die Profilerablaufverfolgung auf Anweisungsebene erfassen und den aufgetretenen Fehler beheben.
Wenn einzelne Kontozustellungsversuche fehlschlagen, hält Datenbank-E-Mail die Fehlermeldungen während wiederholungsversuchen, bis die Zustellung der E-Mail-Elemente erfolgreich war oder fehlschlägt. Wenn die Übermittlung am Ende erfolgreich ist, werden alle gesammelten 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 protokolliert, da account_id
alle Konten fehlgeschlagen sind.
Probleme, die in sysmail_event_log protokolliert werden können
Die folgenden Probleme können protokolliert sysmail_event_log
werden:
Fehler von DatabaseMail.exe , eine Verbindung mit SQL Server herzustellen.
Wenn sich das externe Programm nicht bei den msdb-Tabellen protokollieren kann, protokolliert das Programm Fehler im Ereignisprotokoll der Windows-Anwendung.
Dem SMTP-Server zugeordnete Fehler.
- Fehler beim Herstellen einer Verbindung mit dem SMTP-Server.
- Fehler bei der Authentifizierung beim SMTP-Server.
- DER SMTP-Server lehnt die E-Mail-Nachricht ab.
Ausnahmen in DatabaseMail.exe.
Wenn es keine Probleme mit Datenbank-E-Mail externen ausführbaren Datei gibt, wechseln Sie zu den Sysmail-Systemansichten. Um nach Fehlern zu suchen, die sich auf bestimmte E-Mails beziehen, suchen Sie in der sysmail_faileditems
Ansicht nach mailitem_id
den fehlgeschlagenen E-Mails, und suchen Sie dann nach Nachrichten, die sich auf mailitem_id
sysmail_event_log
diese beziehen. Wenn ein Fehler zurückgegeben sp_send_dbmail
wird, wird die E-Mail nicht an das Datenbank-E-Mail System übermittelt, und der Fehler wird in der sysmail_event_log
Ansicht nicht angezeigt.
Schritt 2: Überprüfen sysmail_unsentitems, sysmail_sentitems und sysmail_faileditems Ansichten
Sie können diese Ansichten auf Probleme mit bestimmten E-Mails überprüfen, um festzustellen, ob Datenbank-E-Mails gesendet, in der Warteschlange hängen bleiben oder nicht gesendet werden.
Interne Tabellen in der msdb-Datenbank enthalten die E-Mail-Nachrichten und Anlagen, die von Datenbank-E-Mail gesendet werden, zusammen mit ihrem aktuellen Status. Datenbank-E-Mail aktualisiert diese Tabellen, wenn die Nachrichten verarbeitet werden.
Sysmail_mailitems
Tabelle ist die Basistabelle für die anderen Sysmail-Ansichten. Die sysmail_allitems
Ansicht basiert auf der Tabelle und ist eine Obermenge dieser Ansichten.
Notiz
Wenn Sie die Msdb-Produktionsdatenbank sichern und ein anderes Testsystem als Benutzerdatenbank wiederherstellen, können Sie die Sysmail-Systemansichten in der wiederhergestellten Sicherung erneut erstellen. Die Ansichtsdefinitionen in der wiederhergestellten Sicherung verweisen auf die msdb-Datenbank auf dem System, in dem Sie die Sicherung wiederhergestellt haben. Sehen Sie sich das Skript an, um sysmail-Ansichten im Msdb-Sicherungsabschnitt des Kunden neu zu erstellen.
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 Sicht, um anzuzeigen, wie viele Nachrichten darauf warten, gesendet zu werden, und seit wann diese sich in der E-Mail-Warteschlange befinden. Im Allgemeinen ist die Anzahl der nicht gesendeten Nachrichten klein. Sie können bei normalen Vorgängen einen Benchmark durchführen, um eine angemessene Anzahl von Nachrichten in der Nachrichtenwarteschlange für normale Vorgänge zu ermitteln.
Sie können auch E-Mails sysmail_unsentitems
einchecken, wenn Probleme mit den Service Broker-Objekten in msdb auftreten. Wenn die ExternalMailQueue
Warteschlange deaktiviert ist oder InternalMailQueue
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 den Status "Nicht senden" aus den folgenden Gründen haben:
- Die Nachricht ist neu. Obwohl die Nachricht in die E-Mail-Warteschlange gesetzt wurde, arbeitet Datenbank-E-Mail an anderen Nachrichten und hat diese Nachricht noch nicht erreicht.
- Das externe Programm Datenbank-E-Mail wird nicht ausgeführt, und es wird keine E-Mail gesendet.
Nachrichten können den Wiederholungsstatus aus den folgenden Gründen haben:
- Datenbank-E-Mail versucht, die E-Mail zu senden, konnte sich aber nicht an den SMTP-E-Mail-Server wenden. Datenbank-E-Mail versuchen weiterhin, die Nachricht mithilfe anderer Datenbank-E-Mail Konten zu senden, die dem Profil zugewiesen sind, das die Nachricht gesendet hat. Wenn kein Konto die E-Mail senden kann, wartet Datenbank-E-Mail auf die Zeitspanne, die für den
Account Retry Delay
Parameter konfiguriert ist, und versuchen Sie 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 Wiederholungsstatus. - Datenbank-E-Mail eine Verbindung mit dem SMTP-Server herstellt, tritt jedoch ein Fehler auf. Der SMTP-Fehlercode, der vom SMTP-Server zurückgegeben wird, und jede zugehörige Fehlermeldung kann zur weiteren 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 bestimmter Nachrichten nach Empfängern finden Sie unter Überprüfen des Status von E-Mail-Nachrichten, die mit Datenbank-E-Mail gesendet wurden.
Führen Sie die folgenden Skripts aus, um den Status von E-Mail-Nachrichten zu überprüfen, die mithilfe von 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 des erfolgreichen Sendens der letzten E-Mail finden möchten, können Sie wie folgt abfragen sysmail_sentitems
und bestellen 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, kann diese Ansicht Ihnen helfen, die Unterschiede zu ermitteln.
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, kann diese Ansicht Ihnen helfen, die Unterschiede zu ermitteln.
Schritt 4: Überprüfen Datenbank-E-Mail Konfiguration für SMTP-Server
Ein weiterer Schritt zur Lösung Datenbank-E-Mail Probleme besteht darin, die Datenbank-E-Mail Konfiguration für 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 des Datenbank-E-Mail-Features
Führen Sie die schritte aus, um Datenbank-E-Mail zu konfigurieren:
Ö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.
Wählen Sie "Datenbank-E-Mail Konten und Profile verwalten>" aus.
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, andernfalls wählen Sie "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.
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 Standard-SMTP-Port 25, Sie müssen jedoch die aktuelle SMTP-Konfiguration überprüfen.
SSL. Überprüfen Sie, ob der SMTP-Server SSL (Secure Sockets Layer) oder TLS (Transport Layer Security) erfordert.
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, siehe Senden einer Test-E-Mail mit PowerShell.
Überprüfen Datenbank-E-Mail Systemparameter
Führen Sie die Schritte aus, um die Systemparameter zu überprüfen:
Ö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.
Wählen Sie " Anzeigen" oder "Systemparameter ändern" aus.
Der folgende Screenshot zeigt die Standardwerte für die Systemparameter. Beachten Sie alle eindeutigen Systemparameter, und bestimmen Sie, ob sie mit dem Problem in Zusammenhang stehen, das Sie beheben möchten.
Schritt 5: Senden einer Test-E-Mail
In diesem Abschnitt können Sie mithilfe von SSMS und PowerShell einen Test Datenbank-E-Mail senden.
Senden einer Test-E-Mail mit Datenbank-E-Mail
Wenn Sie eine Test-E-Mail senden, können Sie versuchen, das Problem zu reproduzieren, das Sie haben, und um zu überprüfen, ob Datenbank-E-Mail gesendet werden können.
Um einen 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.
Überprüfen Sie nach dem Senden der Test-E-Mail die Datenbank-E-Mail Protokoll- und Sysmail-Ansichten.
- Wenn die Test-E-Mail nicht erfolgreich gesendet wurde, verwenden Sie dieses Dokument, um Probleme zu beheben, warum sie nicht gesendet werden.
- Wenn die Test-E-Mail erfolgreich gesendet wird, es aber weiterhin Probleme mit anderen E-Mails gibt, 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, sammeln Sie eine XEvent-Ablaufverfolgung mithilfesql_batch_completed
von Befehlen undsql_batch_started
Befehlen, und sehen Sie sich diebatch_text
Spalte an.
Senden einer Test-E-Mail mit PowerShell
Mithilfe eines externen Prozesses können Sie Datenbank-E-Mail aus 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, weist sie darauf hin, dass es sich nicht um ein Datenbank-E-Mail Problem handelt.
Wenn die von PowerShell gesendete E-Mail mit denselben SMTP-Servereinstellungen und -anmeldeinformationen fehlschlägt, kann es darauf hindeuten, dass sich das Problem auf dem SMTP-Server befindet.
Ändern Sie die folgenden Parameter gemäß 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 anonyme Authentifizierung zulässt, verwenden Sie Standardport 25, und es ist kein SSL 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 erfolglosen 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 Giftnachricht verursacht werden, die nicht erfolgreich im Service Broker gesendet werden kann. Beispiel: falsch formatierter XML-Code. Wenn eine Nachricht nach fünf Versuchen nicht gesendet werden kann, wird sie als "Gift" betrachtet, und die Warteschlange wird deaktiviert, bis die Giftnachricht entfernt wird. Durch erneutes Aktivieren der Warteschlange wird das Problem nicht behoben, da sich die Giftnachricht noch in der Warteschlange befindet und die Fehlersequenz nur wiederholt wird. Weitere Informationen zur Giftnachricht finden Sie unter "Gift Message Handling".
Eines der anderen Service Broker-Objekte (z Message Type
. B. , Contract
, Service
und Route
) kann auch deaktiviert oder fehlen. Die Dienstbrokerwarteschlangen verfügen über eine Aktivierungsprozedur, die der Warteschlange zugeordnet ist, sodass es sich um einen möglichen Fehlerpunkt handelt. Sie können die activation_procedure
Spalte einchecken msdb.sys.service_queues
und dann verwenden sp_helptext
, um zu überprüfen, ob Probleme auftreten.
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 auftreten, 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
Erweiterte Datenbank-E-Mail Problembehandlung
Die erweiterte Problembehandlung gilt für die folgenden Szenarien:
- Wenn Sie das Datenbank-E-Mail Protokoll betrachten, stürzt Datenbank-E-Mail ab, und die Ursache wird nicht vollständig erläutert. Sie sehen, dass der DatabaseMail-Prozess gestartet wird, folgt sofort einer Ausnahmemeldung, und anschließend wird der DatabaseMail-Prozess heruntergefahren .
- Datenbank-E-Mail wird nicht erfolgreich gestartet. Der DatabaseMail-Prozess wird in der
sysmail_event_log
Ansicht nicht gestartet. - Die anfängliche Problembehandlung hilft Ihnen nicht, das Problem zu beheben.
Sie können die folgenden Methoden für erweiterte Datenbank-E-Mail Problembehandlung verwenden.
Die Sammlungen zur erweiterten Problembehandlung
Um die Probleme zu lösen, benötigen Sie möglicherweise eine oder mehrere dieser Sammlungen.
- Sicherung von msdb
- Ereignisprotokoll
- XEvent- oder SQL Server-Ablaufverfolgung
- Prozessmonitor (Procmon)
- ProcDump
- Zeitreisedebugging
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 in einer anderen Instanz wiederherstellen. Die Sysmail-Ansichten werden alle mit Verweis auf msdb definiert, sodass die Ansichten auch beim Abfragen in der wiederhergestellten msdb-Sicherung auf die msdb-Systemdatenbank in Ihrer Instanz verweisen. Um sysmail-Ansichten aus der Produktions-msdb neu zu erstellen, erstellen Sie die Sysmail-Ansichten in der Benutzerdatenbank mithilfe des folgenden Skripts erneut.
/* 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-Systemansichten ".
Methode 2: Überprüfen des Windows-Anwendungsereignisprotokolls
Wenn sich das externe DatabaseMail.exe-Programm nicht bei der Msdb-Tabelle protokollieren kann, protokolliert das Programm den Fehler im Ereignisprotokoll der Windows-Anwendung. Wenn DatabaseMail.exe Ausnahme auftritt, wird auch die Ausnahme 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 Absturzes möglicherweise fest, dass die Protokollierung angibt, 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 ..-Datei anzeigen. \WER\ReportQueue-Pfad . Informationen zu Dumpanalysevorschlägen finden Sie im Abschnitt "ProcDump Analysis ".
Methode 3: Sammeln und Analysieren der XEvent- oder SQL Server-Ablaufverfolgung
Sie können eine Ablaufverfolgung der Transact-SQL-Befehle sammeln, die auf dem System ausgeführt werden, um festzustellen, ob eine der Befehle fehlschlägt.
Konfigurieren des PSSDiag-Tools
Sie können PSSDiag verwenden, um die 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.
Analysieren der Xevent- oder SQL-Ablaufverfolgung
Wenn eine Datenbank-E-Mail gesendet wird, werden in der Regel fünf verschiedene Sitzungen (SPIDs) in einer Xevent- oder Profiler-Erfassung angezeigt.
sp_send_dbmail: Nachdem Sie die Transact-SQL-Anweisung ausgeführt haben, werden die Service Broker-Ereignisse angezeigt, mit denen die Nachrichten in die
ExternalMailQueue
Warteschlange gesetzt werden.Dienstbrokeraktivierung 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. 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 weitere Nachrichten zu überwachen, die in der Warteschlange platziert werden sollen. Wenn keine anderen Nachrichten in der Warteschlange vorhanden sind, beendet DatabaseMail.exe diese Verbindung und schließt diese Verbindung.Dienstbrokeraktivierung für den Empfang von Antwortnachrichten vom SMTP-Server über DatabaseMail.exe. Es aktualisiert die Sysmail-Tabellen, um Ergebnisse von gesendeten E-Mails zu protokollieren.
Sie können das erwartete Verhalten nur kennen, indem Sie viele der Ablaufverfolgungen anzeigen. Die beste Möglichkeit, die Unterschiede zu kennen, besteht darin, Ihre Ablaufverfolgung mit dem einer der erfolgreich gesendeten Datenbank-E-Mail s zu vergleichen. Wenn Sie manchmal eine Datenbank-E-Mail senden können, vergleichen Sie die Ablaufverfolgung mit einer erfolgreichen Ablaufverfolgung, sehen Sie den Unterschied, und überprüfen 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 in Ihrer Testumgebung erfolgreich gesendet wurde.
Methode 4: Erfassen und Analysieren von Prozessüberwachungsereignissen
Process Monitor (Procmon) ist Teil der Windows Sysinternals-Suite.
Prozessmonitor erzeugt eine laute Aufnahme. Um nichts zu verpassen, ist es besser, Filter auf die Daten anzuwenden, nachdem sie erfasst wurden, anstatt während des Aufnahmevorgangs. In der Regel können Sie die Erfassung auf ein Repro des Datenbank-E-Mail Problems ausrichten, sodass die erfassten Gesamtdaten nicht zu groß wären.
Erfassen von Datei-, Registrierungs-, Netzwerk-, Prozess- und Threadereignissen
Wenn Sie procmon.exe starten, beginnt sie sofort mit der Erfassung von Daten. Die GUI 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:
Wenn Sie bereit sind, das Problem Datenbank-E-Mail zu reproduzieren, führen Sie die folgenden Schritte aus:
- Wählen Sie "Dateierfassungsereignisse>" (STRG+E) aus, um mit der Erfassung von Ereignissen zu beginnen.
- Versuchen Sie, die Datenbank-E-Mail zu senden, um das Problem zu reproduzieren.
- Wählen Sie Dateierfassungsereignisse>(STRG+E) aus, um die Erfassung von Ereignissen zu beenden.
- Speichern Sie die Datei als *. PML.
Analysieren der Prozessüberwachungsablaufverfolgung
Nachdem Sie die . PML-Datei, öffnen Sie sie erneut mithilfe des Prozessmonitors. Filtern Sie zunächst die Datei nach den prozessen DatabaseMail.exe und sqlservr.exe . Wählen Sie dann "Filterfilter > " aus, oder klicken Sie auf das Filtersymbol, um das Filtermenü zu öffnen.
Wählen Sie für "Prozessname" sqlservr.exe und DatabaseMail.exe aus, und fügen Sie dann die folgenden Einträge hinzu:
Genau wie bei der SQL XEvent- oder Trace-Erfassung ist es nicht sofort offensichtlich, wonach gesucht werden soll. In der Regel besteht die beste Methode zum Starten der Analyse darin, Ihre Ablaufverfolgung mit einer Procmon-Erfassung für eine erfolgreich gesendete Datenbank-E-Mail zu vergleichen. Vergleichen Sie die Ablaufverfolgung idealerweise 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 wird, vergleichen Sie die Ablaufverfolgung mit einer erfolgreich gesendeten E-Mail in einer anderen Umgebung.
Wenn DatabaseMail.exe eine DLL nicht laden oder die Datei DatabaseMail.exe.config nicht finden kann, ist die Analyse nützlich.
Methode 5: Sammeln 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 externen programms DatabaseMail.exe zu erfassen. In der Regel verwenden Sie ProcDump für die Problembehandlung, wenn DatabaseMail.exe auf eine unbehandelte Ausnahme stoßen.
Konfigurieren von ProcDump
Um ProcDump so zu konfigurieren, dass ein Abbild von DatabaseMail.exe erfasst wird, wenn eine ausnahme nicht behandelt wird, öffnen Sie zuerst eine Eingabeaufforderung mit Administratorrechten. Aktivieren Sie dann ProcDump, um das Abbild des DatabaseMail.exe Prozesses mithilfe des folgenden Befehls 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 Dump wird im selben Ordner erstellt, in dem Sie ProcDump.exe ausgeführt haben.
Analysieren des Ausnahmeabbilds
Suchen Sie den Ausnahmedatensatz, und überprüfen Sie den Aufrufstapel, der zu der Ausnahme führt.
- Öffnen Sie die Speicherabbilddatei in WinDbg (Download Debugging Tools für Windows - WinDbg - Windows-Treiber).
- Wechseln Sie mithilfe des Befehls oder
!analyze -v
des.ecxr
Befehls zum Ausnahmedatensatz.
Wenn Sie über den Stapel verfügen, suchen Sie nach bekannten Problemen für einen übereinstimmenden Aufrufstapel. Wenn Sie weitere Hilfe benötigen, wenden Sie sich an das CSS-Team.
Methode 6: Verwenden des Tools "Time Travel Debugging"
Die TtD-Erfassung (Time Travel Debugging) ist in der Regel die letzte Möglichkeit 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 zur Analyse. Wenn Sie zu diesem Punkt gelangen, 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 mehreren Gründen kann die TTD-Erfassung von DatabaseMail.exe ein bisschen schwierig sein. Erstens wird DatabaseMail.exe nicht unbegrenzt als Dienst ausgeführt, sondern wird von SQL Server (sqlservr.exe) prozess aufgerufen. Daher können Sie sie nicht anfügen, aber Sie müssen TTD konfigurieren, indem Sie den -onLaunch
Parameter verwenden, um sie zu erfassen, wenn DatabaseMail.exe gestartet wird. Zweitens, da DatabaseMail.exe von einem anderen Prozess aufgerufen wird, müssen Sie die untergeordneten Debugprozesse verwenden.