Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Dit artikel bevat methoden voor het oplossen van problemen met Database Mail. Als de eerste probleemoplossing uw probleem niet heeft opgelost, gebruikt u geavanceerde probleemoplossing.
Problemen met database-e-mail oplossen
Hier volgen de basisstappen voor probleemoplossing:
- Controleer het Database Mail-logboek- en sysmailweergaven (
sysmail_event_log) voor e-mailberichten die al zijn verzonden of die zijn verzonden met behulp van DatabaseMail.exe. - Een testmail verzenden. Als de testmail is verzonden, richt u zich op de details van de berichten die niet worden verzonden. Als de testmail niet wordt verzonden, richt u zich op het oplossen van problemen met de testmail en negeert u de e-mailberichten die niet eerder zijn verzonden.
- Als u vermoedt dat de SMTP-serverinstellingen onjuist zijn of er een probleem is met het account dat wordt gebruikt om de e-mail te verzenden, gebruikt u PowerShell om een testmail te verzenden.
- Als u de e-mail niet verzendt met behulp van PowerShell, is het waarschijnlijk een PROBLEEM met de SMTP-configuratie en is een SMTP-beheerder nodig.
U kunt de volgende stappen gebruiken voor het oplossen van problemen met Database Mail.
Msdb sysmail-systeemweergaven
Voordat u de gedetailleerde stappen bekijkt, vindt u hier een beknopt overzicht van de relevante database-mailsysteemweergaven.
De meest relevante logboekregistratie vindt plaats in de systeemweergave msdb sysmail. U kunt deze weergaven rechtstreeks in uw omgeving opvragen.
Name Type Description sysmail_allitems Weergave Geeft een lijst weer van alle berichten die worden verzonden naar Database Mail. sysmail_event_log Weergave Bevat berichten over het gedrag van het externe programma Database Mail. sysmail_faileditems Weergave Informatie over berichten die Database Mail niet kan verzenden. sysmail_mailattachments Weergave Informatie over bijlagen bij Database Mail-berichten. sysmail_sentitems Weergave Informatie over berichten die zijn verzonden via Database Mail. sysmail_unsentitems Weergave Informatie over berichten die Database Mail momenteel probeert te verzenden. Sommige fouten worden vastgelegd in het gebeurtenislogboek van de Windows-toepassing.
Stap 1: De weergave sysmail_event_log controleren
Deze systeemweergave is het startpunt voor het oplossen van alle database-mailproblemen.
Bij het oplossen van problemen met Database Mail zoekt u in de sysmail_event_log weergave naar gebeurtenissen die betrekking hebben op e-mailfouten. Sommige berichten (zoals de fout van het externe programma Database Mail) zijn niet gekoppeld aan specifieke e-mailberichten.
Sysmail_event_log bevat één rij voor elk Windows- of SQL Server-bericht dat wordt geretourneerd door het Database Mail-systeem. Selecteer Beheer in SQL Server Management Studio (SSMS), klik met de rechtermuisknop op Database Mail en selecteer Database Mail-logboek weergeven om het Database Mail-logboek als volgt te controleren:
Voer de volgende query uit om: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
De event_type kolom kan de volgende waarden hebben:
- Fouten
- Waarschuwingen
- Gegevens
- Geslaagd
Als u alleen de vereiste gebeurtenistypen wilt weergeven, gebruikt u de WHERE component om te filteren.
Het specifieke mislukte e-mailitem controleren
Als u wilt zoeken naar fouten die betrekking hebben op specifieke e-mailberichten, zoekt u de mailitem_id mislukte e-mail in de sysmail_faileditems weergave op en zoekt u vervolgens naar berichten die zijn gerelateerd aan mailitem_id in 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],
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
Wanneer een fout wordt geretourneerd vanuit sp_send_dbmail, wordt de e-mail niet verzonden naar het Database Mail-systeem en wordt de fout niet weergegeven in de sysmail_event_log weergave. U moet profilertracering op instructieniveau verzamelen en de fout oplossen die u tegenkomt.
Wanneer de bezorging van afzonderlijke accounts mislukt, worden de foutberichten tijdens nieuwe pogingen in Database Mail opgeslagen totdat de bezorging van e-mailitems is geslaagd of mislukt. Als de levering uiteindelijk slaagt, worden alle samengevoegde fouten geregistreerd als afzonderlijke waarschuwingen, waaronder account_id. Het kan een waarschuwing veroorzaken, zelfs als het e-mailbericht is verzonden. Als de bezorging uiteindelijk mislukt, worden alle eerdere waarschuwingen geregistreerd als één foutbericht zonder dat account_id alle accounts zijn mislukt.
Problemen die kunnen worden aangemeld sysmail_event_log
De volgende problemen kunnen worden aangemeld sysmail_event_log:
Fout bij DatabaseMail.exe om verbinding te maken met SQL Server.
Als het externe programma zich niet kan aanmelden bij de msdb-tabellen , worden fouten in het gebeurtenislogboek van de Windows-toepassing vastgelegd.
Fouten die zijn gekoppeld aan de SMTP-server.
- Kan geen contact opnemen met de SMTP-server.
- Kan niet verifiëren met de SMTP-server.
- Smtp-server weigert het e-mailbericht.
Uitzonderingen in DatabaseMail.exe.
Als er geen problemen zijn met het externe uitvoerbare bestand van Database Mail, gaat u naar de sysmail-systeemweergaven. Als u wilt zoeken naar fouten die betrekking hebben op specifieke e-mailberichten, zoekt u de mailitem_id mislukte e-mail in de sysmail_faileditems weergave op en zoekt u vervolgens naar berichten die zijn gerelateerd aan mailitem_id in sysmail_event_log. Wanneer een fout wordt geretourneerd vanuit sp_send_dbmail, wordt de e-mail niet verzonden naar het Database Mail-systeem en wordt de fout niet weergegeven in de sysmail_event_log weergave.
Stap 2: De weergaven sysmail_unsentitems, sysmail_sentitems en sysmail_faileditems controleren
U kunt deze weergaven controleren op problemen met specifieke e-mailberichten om te zien of database-e-mailberichten worden verzonden, in de wachtrij blijven hangen of niet kunnen worden verzonden.
Interne tabellen in de msdb-database bevatten de e-mailberichten en bijlagen die vanuit Database Mail worden verzonden, samen met hun huidige status. Database Mail werkt deze tabellen bij wanneer de berichten worden verwerkt.
Sysmail_mailitems tabel is de basistabel voor de andere sysmail-weergaven. De sysmail_allitems weergave is gebaseerd op de tabel en is een superset van deze weergaven.
Notitie
Als u een back-up maakt van de msdb-productiedatabase en herstelt naar een ander testsysteem als een gebruikersdatabase, kunt u de sysmail-systeemweergaven opnieuw maken in de herstelde back-up. De weergavedefinities in de herstelde back-up verwijzen naar de msdb-database op het systeem waar u de back-up hebt hersteld. Zie het script voor het opnieuw maken van sysmail-weergaven in klant msdb in de sectie Msdb-back-up .
Sysmail_unsentitems
Deze weergave bevat één rij voor elk Database Mail-bericht waarvan de status niet wordt verzonden of opnieuw wordt geprobeerd.
Gebruik deze weergave als u wilt zien hoeveel berichten er moeten worden verzonden en hoe lang ze in de wachtrij staan. Over het algemeen is het aantal niet-verzonden berichten klein. U kunt benchmarken tijdens normale bewerkingen om een redelijk aantal berichten in de berichtenwachtrij te bepalen voor normale bewerkingen.
U kunt ook e-mailberichten inchecken sysmail_unsentitems als er problemen zijn met de Service Broker-objecten in msdb. Als de ExternalMailQueue of InternalMailQueue wachtrij is uitgeschakeld of er problemen zijn met de route, kan de e-mail binnenblijven sysmail_unsentitmes.
Berichten die niet worden verzonden of opnieuw proberen, bevinden zich nog steeds in de wachtrij en kunnen op elk gewenst moment worden verzonden. Berichten kunnen om de volgende redenen de niet-verzonden status hebben:
- Het bericht is nieuw. Hoewel het bericht is geplaatst in de e-mailwachtrij, werkt Database Mail aan andere berichten en is dit bericht nog niet bereikt.
- Het externe programma Database Mail wordt niet uitgevoerd en er wordt geen e-mail verzonden.
Berichten kunnen om de volgende redenen de status voor opnieuw proberen hebben:
- Database Mail heeft geprobeerd de e-mail te verzenden, maar kan geen contact opnemen met de SMTP-e-mailserver. Database Mail blijft proberen het bericht te verzenden met andere Database Mail-accounts die zijn toegewezen aan het profiel dat het bericht heeft verzonden. Als er geen account de e-mail kan verzenden, wacht Database Mail op de tijd die is geconfigureerd voor de
Account Retry Delayparameter en probeert het bericht opnieuw te verzenden. Database Mail gebruikt de parameter om te bepalen hoe vaak het bericht wordt verzonden. Wanneer Database Mail het bericht probeert te verzenden, blijft het bericht de status van het opnieuw proberen . - Database Mail maakt verbinding met SMTP-server, maar er treedt een fout op. De SMTP-foutcode die wordt geretourneerd door de SMTP-server en elk bijbehorend foutbericht kan worden gebruikt voor verdere probleemoplossing.
Sysmail_faileditems
Als u weet dat het e-mailbericht niet kan worden verzonden, kunt u rechtstreeks een query uitvoeren sysmail_faileditems . Zie De status van e-mailberichten controleren die zijn verzonden met database-e-mail voor meer informatie over het opvragen sysmail_faileditems en filteren van specifieke berichten per geadresseerde.
Voer de volgende scripts uit om de status van e-mailberichten te controleren die via Database Mail worden verzonden:
-- 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
Als u het tijdstip wilt vinden waarop het laatste e-mailbericht is verzonden, kunt u als volgt een query uitvoeren sysmail_sentitems en sorteren sent_date :
SELECT ssi.sent_date, *
FROM msdb.dbo.sysmail_sentitems ssi
ORDER BY ssi.sent_date DESC
Als bepaalde typen e-mailberichten met succes worden verzonden, maar andere niet, kan deze weergave u helpen de verschillen te achterhalen.
Stap 3: de weergave sysmail_mailattachments controleren
Deze weergave bevat één rij voor elke bijlage die wordt verzonden naar Database Mail. Gebruik deze weergave wanneer u informatie nodig hebt over Database Mail-bijlagen.
Als u problemen ondervindt bij het verzenden van e-mailberichten met bijlagen, maar sommige e-mailberichten met bijlagen zijn verzonden, kan deze weergave u helpen de verschillen te achterhalen.
Stap 4: Database Mail-configuratie voor SMTP-server controleren
Een andere stap voor het oplossen van problemen met Database Mail is het controleren van de database-mailconfiguratie voor de SMTP-server en het account dat wordt gebruikt voor het verzenden van Database Mail.
Zie Database Mail configureren voor meer informatie over het configureren van Database Mail.
Database Mail configureren
Volg de stappen om Database Mail te configureren:
Open SSMS, selecteer Beheer, klik met de rechtermuisknop op Database Mail en selecteer Database-e-mail configureren.
Selecteer Database-e-mailaccounts en -profielen>beheren Volgende.
Als u een account hebt, selecteert u Een bestaand account weergeven, wijzigen of verwijderen en selecteert u Volgende, anders maakt u een nieuw account. In de volgende schermopname ziet u de accountinstellingen die worden gebruikt om verbinding te maken met de SMTP-server en database-e-mail te verzenden.
Let vooral op:
Servernaam en poortnummer. De servernaam moet een volledig gekwalificeerde domeinnaam zijn en het poortnummer moet nauwkeurig zijn. Over het algemeen is de standaard SMTP-poort 25, maar u moet de huidige SMTP-configuratie controleren.
SSL. Controleer of voor de SMTP-server SSL (Secure Sockets Layer) of Transport Layer Security (TLS) is vereist.
SMTP-verificatie. Gebruikt u de Windows-verificatie van de Database Engine-service, basisverificatie met een domeinaccount opgegeven of anonieme verificatie? U moet controleren wat de SMTP-server toestaat in uw eigen omgeving. Als een domeinaccount is opgegeven (serviceaccount of basisverificatie), moet het de machtigingen hebben op de SMTP-server.
U kunt de configuratie gebruiken om een testmail te verzenden met PowerShell. Zie Een test-e-mail verzenden met PowerShell.
Database Mail-systeemparameters controleren
Volg de stappen om de systeemparameters te controleren:
Open SSMS, selecteer Beheer, klik met de rechtermuisknop op Database Mail en selecteer Database-e-mail configureren.
Selecteer Systeemparameters weergeven of wijzigen.
In de volgende schermopname ziet u de standaardwaarden voor de systeemparameters. Let op eventuele unieke systeemparameters en bepaal of deze zijn gerelateerd aan het probleem dat u wilt oplossen.
Stap 5: Een testmail verzenden
Deze sectie helpt u bij het verzenden van een testDatabase Mail met behulp van SSMS en PowerShell.
Een test-e-mail verzenden met Database Mail
Door een test-e-mail te verzenden, kunt u proberen het probleem te reproduceren dat u ondervindt en om te controleren of database-e-mail kan worden verzonden.
Als u een testdatabase-e-mail wilt verzenden, selecteert u Beheer, klikt u met de rechtermuisknop op Database Mail en selecteert u Test-e-mail verzenden....
Nadat u de testmail hebt verzonden, controleert u het Database Mail-logboek en sysmail-weergaven.
- Als de testmail niet is verzonden, gebruikt u dit document om problemen op te lossen waarom het niet wordt verzonden.
- Als de testmail is verzonden, maar er nog steeds problemen zijn met andere e-mailberichten die niet worden verzonden, richt u zich op de details van de e-mailberichten die niet worden verzonden. Controleer de werkelijke
sp_send_dbmailopdracht die wordt uitgevoerd. Als u de Transact-SQL-opdracht niet hebt, verzamelt u een XEvent-trace met behulp vansql_batch_completedensql_batch_startedopdrachten en bekijkt u debatch_textkolom.
Een test-e-mail verzenden met PowerShell
Met behulp van een extern proces kunt u Database Mail uitsluiten van de probleemoplossing en de accountconfiguratie testen. Gebruik bijvoorbeeld PowerShell om een testmail te verzenden. Als u geen test-e-mail verzendt met powerShell, geeft dit aan dat het geen database-e-mailprobleem is.
Als de e-mail die vanuit PowerShell wordt verzonden, mislukt met dezelfde SMTP-serverinstellingen en -referenties, kan dit erop wijzen dat het probleem zich op de SMTP-server bevindt.
Wijzig de volgende parameters op basis van uw omgeving en voer vervolgens het volgende script uit:
$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)Als uw SMTP-server anonieme verificatie toestaat, gebruikt u standaardpoort 25 en hebt u geen SSL nodig. Voer het volgende script uit:
$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)
Stap 6: De sysmail Service Broker-objecten controleren
Problemen met de Service Broker-objecten in msdb kunnen leiden tot een mislukte bewerking van Database Mail. Een veelvoorkomend probleem is dat een van de Service Broker-wachtrijen (ExternalMailQueue en InternalMailQueue) is uitgeschakeld. Dit probleem kan worden veroorzaakt door een gifbericht dat niet kan worden verzonden in Service Broker. Bijvoorbeeld ongeldige XML. Als een bericht na vijf pogingen niet kan worden verzonden, wordt het beschouwd als 'gif' en wordt de wachtrij uitgeschakeld totdat het gifbericht wordt verwijderd. Als u de wachtrij opnieuw inschakelt, wordt het probleem niet opgelost omdat het gifbericht zich nog in de wachtrij bevindt en de foutvolgorde gewoon wordt herhaald. Zie Afhandeling van gifberichten voor meer informatie over gifberichten.
Een van de andere Service Broker-objecten (zoals Message Type, Contract, Serviceen Route) kan ook worden uitgeschakeld of ontbreken. De Service Broker-wachtrijen hebben een activeringsprocedure die is gekoppeld aan de wachtrij, dus het is een mogelijk storingspunt. U kunt de activation_procedure kolom inchecken msdb.sys.service_queuesen vervolgens gebruiken sp_helptext om te controleren of er problemen zijn.
Voer de volgende query uit en controleer vervolgens de inhoud van de tweede kolom van de queryresultaten.
SELECT CONVERT(VARCHAR(32),name) Name, 'exec sp_helptext ''' + activation_procedure + '''' ActivationProc_Code
FROM msdb.sys.service_queues
Om te bepalen of er problemen zijn met de Service Broker-objecten, is het beter om de objecten te vergelijken met een werkende Database Mail-configuratie. Dit zijn de objecten die u moet vergelijken met:
Message Types- {//www.microsoft.com/databasemail/messages}SendMail
- {//www.microsoft.com/databasemail/messages}SendMailStatus
Contracts- www.microsoft.com/databasemail/contracts/SendMail/v1.0
Queuesdbo.ExternalMailQueuedbo.InternalMailQueue
ServicesExternalMailServiceInternalMailService
Routes
Problemen met Advanced Database Mail oplossen
Geavanceerde probleemoplossing is van toepassing op de volgende scenario's:
- Wanneer u het Database Mail-logboek bekijkt, loopt Database Mail vast en wordt de oorzaak niet volledig uitgelegd. U ziet dat het DatabaseMail-proces wordt gestart , direct wordt gevolgd door een uitzonderingsbericht, waarna het DatabaseMail-proces wordt afgesloten, wordt weergegeven.
- Database Mail kan niet worden gestart. Het DatabaseMail-proces wordt niet gestart in de
sysmail_event_logweergave. - De eerste probleemoplossing helpt u niet om het probleem op te lossen.
U kunt de volgende methoden gebruiken voor geavanceerde problemen met Database Mail.
De verzamelingen voor geavanceerde probleemoplossing
U hebt mogelijk een of meer van deze verzamelingen nodig om de problemen op te lossen.
- Back-up van msdb
- Gebeurtenislogboek
- XEvent of SQL Server Trace
- Procesmonitor (Procmon)
- ProcDump
- Foutopsporing voor tijdreizen
Methode 1: Een back-up maken van de msdb-database
Het kan handig zijn om query's uit te voeren op de sysmail-weergaven in een omgeving die losstaat van productie. In sommige gevallen kunt u een back-up maken van de msdb-database en vervolgens herstellen naar een ander exemplaar. De sysmail-weergaven zijn allemaal gedefinieerd met verwijzing naar msdb, dus zelfs wanneer er query's worden uitgevoerd in de herstelde msdb-back-up , verwijzen de weergaven naar de msdb-systeemdatabase in uw exemplaar. Als u sysmail-weergaven opnieuw wilt maken vanuit de productie msdb, maakt u de sysmail-weergaven opnieuw in de gebruikersdatabase met behulp van het volgende script.
/* 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
Zie de sectie sysmail-systeemweergaven voor meer informatie over sysmail-weergaven .
Methode 2: Het gebeurtenislogboek van de Windows-toepassing controleren
Als het externe DatabaseMail.exe programma niet kan worden aangemeld bij de msdb-tabel , wordt de fout in het gebeurtenislogboek van de Windows-toepassing vastgelegd. Als DatabaseMail.exe uitzondering tegenkomt, wordt de uitzondering ook geregistreerd. Hoewel de uitzonderingsstack doorgaans identiek is, controleert u het gebeurtenislogboek om te zien of er andere stackgegevens bestaan.
Wanneer u problemen met een DatabaseMail.exe crash oplost, kan het gebeuren dat logboekregistratie aangeeft dat er als volgt een Windows-foutrapportdump is gemaakt:
<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:"
U kunt alle bestanden ophalen die AppCrash_DatabaseMail.exe_* weergeven in de .. \WER\ReportQueue pad. Zie de sectie ProcDump Analysis voor dumpanalysesuggesties.
Methode 3: XEvent of SQL Server Trace verzamelen en analyseren
U kunt een tracering verzamelen van de Transact-SQL-opdrachten die op het systeem worden uitgevoerd om te zien of een van deze opdrachten mislukt.
PSSDiag-hulpprogramma configureren
U kunt PSSDiag gebruiken om de XEvent- of SQL Server-tracering te verzamelen onder de sjabloon Algemene prestaties. Zoals wordt weergegeven in de volgende schermopname, selecteert u enkele extra gebeurtenissen, met name alle broker-gebeurtenissen.
De Xevent- of SQL-trace analyseren
Wanneer een Database Mail wordt verzonden, ziet u meestal vijf verschillende sessies (SPID's) in een Xevent- of Profiler-opname.
sp_send_dbmail: Nadat u de Transact-SQL-instructie hebt uitgevoerd, ziet u de Service Broker-gebeurtenissen die worden gebruikt om de berichten in de
ExternalMailQueuewachtrij te plaatsen.Service Broker-activering voor het verzenden van berichten naar de SMTP-server via DatabaseMail.exe. De naam van de toepassing is 'Activering van Microsoft SQL Server Service Broker'.
Extern database mailprogramma: dit is het externe Database Mail-programma dat berichten uit de
ExternalMailQueuewachtrij ontvangt en berichten voorbereidt die naar de SMTP-server moeten worden verzonden. De naam van de toepassing is 'DatabaseMail - DatabaseMail - Id<PID>'.Extern database mailprogramma: dit is een andere verbinding vanuit Database Mail. Nadat de eerste verbinding de bestaande berichten in de
ExternalMailQueuewachtrij heeft verwerkt, wordt de verbinding gemaakt om te luisteren naar extra berichten die in de wachtrij moeten worden geplaatst. Als er geen andere berichten in de wachtrij staan, wordt deze verbinding beëindigd en gesloten DatabaseMail.exe .Service Broker-activering voor het ontvangen van antwoordberichten van smtp-server via DatabaseMail.exe. Hiermee worden de sysmail-tabellen bijgewerkt om de resultaten van verzonden e-mailberichten te registreren.
U kunt alleen het verwachte gedrag kennen door veel van de traceringen te bekijken. De beste manier om de verschillen te kennen, is door uw tracering te vergelijken met een van de verzonden database-e-mails. Als u soms een Database Mail kunt verzenden, vergelijkt u de tracering met een geslaagde trace, bekijkt u het verschil en controleert u op eventuele fouten die door de SPID's worden gerapporteerd. Als u geen Database Mail kunt verzenden, vergelijkt u de tracering met de trace die is verzonden in uw testomgeving.
Methode 4: Gebeurtenissen van procesmonitor vastleggen en analyseren
Process Monitor (Procmon) maakt deel uit van de Windows Sysinternals-suite.
Procesmonitor produceert een luidruchtige opname. Als u niets wilt missen, is het beter om filters toe te passen op de gegevens nadat deze zijn vastgelegd in plaats van tijdens het opnameproces. Normaal gesproken kunt u zich richten op het vastleggen van een probleem met database-e-mail, zodat de totale gegevens die zijn vastgelegd, niet te groot zijn.
Bestands-, register-, netwerk-, proces- en thread-gebeurtenissen vastleggen
Wanneer u procmon.exe start, worden gegevens onmiddellijk vastgelegd. De GUI is eenvoudig. U moet het vastleggen van gebeurtenissen stoppen totdat u klaar bent om het probleem te reproduceren. Selecteer Gebeurtenissen voor het>vastleggen van bestanden (Ctrl+E) om het menu-item uit te vinken en de gebeurtenisverzameling te stoppen. Selecteer het gumpictogram of druk op Ctrl+X om de gebeurtenissen te wissen die al zijn vastgelegd:
Wanneer u klaar bent om het probleem met Database Mail te reproduceren, volgt u de stappen:
- Selecteer Bestand>vastleggen van gebeurtenissen (Ctrl+E) om gebeurtenissen vast te leggen.
- Probeer de database-mail te verzenden om het probleem te reproduceren.
- Selecteer Gebeurtenissen voor het>vastleggen van bestanden (Ctrl+E) om te stoppen met het vastleggen van gebeurtenissen.
- Sla het bestand op als *. PML.
De tracering van procesmonitor analyseren
Nadat je de . PML-bestand opent u het opnieuw met procesmonitor. Filter eerst het bestand op de DatabaseMail.exe en sqlservr.exe processen. Selecteer vervolgens Filterfilter > ... of klik op het filterpictogram om het filtermenu te openen.
Selecteer voor Procesnaam sqlservr.exe en DatabaseMail.exe en voeg deze vermeldingen toe:
Net als bij HET vastleggen van SQL XEvent of Trace, is het niet meteen duidelijk waarnaar u moet zoeken. Meestal kunt u het beste een analyse starten door uw tracering te vergelijken met een Procmon-opname voor een verzonden Database Mail. Vergelijk in het ideale geval de tracering met een e-mail die is verzonden vanuit dezelfde omgeving waarin het probleem zich voordoet. Als er echter geen Database Mail is verzonden in de specifieke omgeving, vergelijkt u de tracering met een e-mail die in een andere omgeving is verzonden.
Wanneer DatabaseMail.exe een DLL niet kan laden of het bestand DatabaseMail.exe.config niet kan vinden, is de analyse nuttig.
Methode 5: De uitzonderingsdump verzamelen en analyseren met het hulpprogramma ProcDump
ProcDump maakt ook deel uit van de Windows Sysinternals-suite.
ProcDump is handig wanneer u probeert een geheugendump van het DatabaseMail.exe extern programma vast te leggen. Normaal gesproken gebruikt u ProcDump voor het oplossen van problemen wanneer DatabaseMail.exe een onverwerkte uitzondering tegenkomt.
ProcDump configureren
Als u ProcDump wilt configureren om een dump van DatabaseMail.exe vast te leggen wanneer er een niet-verwerkte uitzondering optreedt, opent u eerst een opdrachtprompt met beheerdersbevoegdheden. Schakel vervolgens ProcDump in om de dump van het DatabaseMail.exe proces vast te leggen met behulp van de volgende opdracht:
c:\Sysinternals> procdump -ma -t DatabaseMail.exe -w e2
U ziet de volgende uitvoer in het opdrachtvenster:
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...
Reproduceer vervolgens het probleem. De dump wordt gemaakt in dezelfde map waarin u ProcDump.exe hebt uitgevoerd.
De uitzonderingsdump analyseren
Zoek de uitzonderingsrecord en bekijk de aanroepstack die naar de uitzondering leidt.
- Open het dumpbestand in WinDbg (Download Foutopsporingsprogramma's voor Windows - WinDbg - Windows-stuurprogramma's).
- Schakel over naar de uitzonderingsrecord met behulp van de
.ecxropdracht of!analyze -vde uitzonderingsrecord.
Wanneer u de stack hebt, kunt u zoeken naar bekende problemen voor een overeenkomende aanroepstack. Neem contact op met het CSS-team als u meer hulp nodig hebt.
Methode 6: Time Travel Debugging tool gebruiken
TTD-opname (Time Travel Debugging) is meestal het laatste redmiddel voor moeilijke problemen. U kunt het WinDbg-preview-foutopsporingsprogramma gebruiken om het op te halen. Zie Time Travel Debugging over de werking en analyse voor uitgebreide instructies en informatie over TTD. Als u dit punt hebt, moet u contact opnemen met het CSS-team. In deze sectie vindt u echter instructies voor het vastleggen van de TTD wanneer dat nodig is.
TTD configureren
Om verschillende redenen kan TTD-opname van DatabaseMail.exe een beetje lastig zijn. Ten eerste wordt DatabaseMail.exe niet voor onbepaalde tijd uitgevoerd als een service, maar wordt aangeroepen door het SQL Server-proces (sqlservr.exe). Daarom kunt u er niet aan koppelen, maar u moet TTD configureren met behulp van de -onLaunch parameter om deze vast te leggen wanneer DatabaseMail.exe wordt gestart. Ten tweede, omdat DatabaseMail.exe wordt aangeroepen door een ander proces, moet u de onderliggende processen voor foutopsporing gebruiken.