Condividi tramite


Risoluzione dei problemi relativi a Posta elettronica database

Questo articolo fornisce metodi per la risoluzione dei problemi di Posta elettronica database. Se la risoluzione iniziale del problema non è stata risolta, usare la risoluzione dei problemi avanzata.

Risoluzione dei problemi di Posta elettronica database iniziale

Ecco i passaggi di base per la risoluzione dei problemi:

  1. Esaminare le visualizzazioni Posta elettronica database log e sysmail (sysmail_event_log) per i messaggi di posta elettronica che sono già stati inviati o tentati di inviare tramite DatabaseMail.exe.
  2. Inviare un messaggio di prova. Se il messaggio di prova viene inviato correttamente, concentrarsi sui dettagli dei messaggi che non vengono inviati. Se il messaggio di prova non viene inviato, concentrarsi sulla risoluzione dei problemi relativi alla posta elettronica di test e ignorare i messaggi inviati in modo non riuscito prima.
  3. Se si sospetta che le impostazioni del server SMTP non siano corrette o si verifichi un problema con l'account usato per inviare la posta elettronica, usare PowerShell per inviare un messaggio di prova.
  4. Se non si invia il messaggio di posta elettronica tramite PowerShell, è probabile che si tratti di un problema di configurazione SMTP e che sia necessario un amministratore SMTP.

Per la risoluzione dei problemi iniziale di Posta elettronica database, è possibile usare i passaggi seguenti.

Viste di sistema sysmail msdb

Prima di esaminare i passaggi dettagliati, ecco un breve riepilogo delle viste di sistema Posta elettronica database pertinenti.

  1. La registrazione più rilevante si verifica nella visualizzazione del sistema sysmail msdb . È possibile eseguire query su queste viste direttamente nell'ambiente.

    Nome Tipo Descrizione
    sysmail_allitems Visualizza Elenca tutti i messaggi inviati a Posta elettronica database.
    sysmail_event_log Visualizza Elenca i messaggi sul comportamento del programma esterno Posta elettronica database.
    sysmail_faileditems Visualizza Informazioni sui messaggi che Posta elettronica database non è stato possibile inviare.
    sysmail_mailattachments Visualizza Informazioni relative agli allegati ai messaggi di Posta elettronica database.
    sysmail_sentitems Visualizza Informazioni sui messaggi inviati tramite Posta elettronica database.
    sysmail_unsentitems Visualizza Informazioni sui messaggi che Posta elettronica database stanno tentando di inviare.
  2. Alcuni errori vengono registrati nel registro eventi dell'applicazione di Windows.

Passaggio 1: Controllare sysmail_event_log visualizzazione

Questa visualizzazione di sistema è il punto di partenza per la risoluzione di tutti i problemi di Posta elettronica database.

Durante la risoluzione dei problemi Posta elettronica database, cercare nella sysmail_event_log visualizzazione gli eventi correlati agli errori di posta elettronica. Alcuni messaggi (ad esempio l'errore del programma esterno Posta elettronica database) non sono associati a messaggi di posta elettronica specifici.

Sysmail_event_logcontiene una riga per ogni messaggio di Windows o SQL Server restituito dal sistema Posta elettronica database. In SQL Server Management Studio (SSMS) selezionare Gestione, fare clic con il pulsante destro del mouse su Posta elettronica database e selezionare Visualizza Posta elettronica database Log per controllare il log Posta elettronica database come indicato di seguito:

Screenshot della voce Visualizza Posta elettronica database log nel menu Posta elettronica database.

Eseguire la query seguente 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]
FROM msdb.dbo.sysmail_event_log er
ORDER BY [LogDate] DESC

La event_type colonna può avere i valori seguenti:

  • Errori
  • Avvisi
  • Informazioni
  • Success

Per visualizzare solo i tipi di evento necessari, utilizzare la WHERE clausola per filtrare.

Controllare l'elemento di posta non riuscito specifico

Per cercare gli errori correlati a messaggi di posta elettronica specifici, cercare il mailitem_id messaggio di posta elettronica non riuscito nella sysmail_faileditems visualizzazione e quindi cercare i messaggi correlati a 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

Quando viene restituito un errore da sp_send_dbmail, il messaggio di posta elettronica non viene inviato al sistema di Posta elettronica database e l'errore non viene visualizzato nella sysmail_event_log visualizzazione. È consigliabile raccogliere la traccia del profiler a livello di istruzione e risolvere l'errore riscontrato.

Quando i singoli tentativi di recapito dell'account hanno esito negativo, Posta elettronica database conterrà i messaggi di errore durante i tentativi fino a quando il recapito dell'elemento di posta non riesce o non riesce. Se il recapito ha esito positivo, tutti gli errori accumulati vengono registrati come avvisi separati, incluso account_id. Può causare un avviso anche se il messaggio di posta elettronica è stato inviato. Se il recapito non riesce alla fine, tutti gli avvisi precedenti vengono registrati come un messaggio di errore senza perché account_id tutti gli account non sono riusciti.

Problemi che possono essere registrati sysmail_event_log

I problemi seguenti potrebbero essere registrati in sysmail_event_log:

  • Errore di DatabaseMail.exe per la connessione a SQL Server.

    Se il programma esterno non è in grado di accedere alle tabelle msdb , il programma logrà gli errori nel registro eventi dell'applicazione di Windows.

  • Errori associati al server SMTP.

    • Impossibile contattare il server SMTP.
    • Errore di autenticazione con il server SMTP.
    • Il server SMTP rifiuta il messaggio di posta elettronica.
  • Eccezioni in DatabaseMail.exe.

Se non sono presenti problemi con Posta elettronica database eseguibile esterno, passare alle viste di sistema sysmail. Per cercare gli errori correlati a messaggi di posta elettronica specifici, cercare il mailitem_id messaggio di posta elettronica non riuscito nella sysmail_faileditems visualizzazione e quindi cercare i messaggi correlati a mailitem_id in sysmail_event_log. Quando viene restituito un errore da sp_send_dbmail, il messaggio di posta elettronica non viene inviato al sistema di Posta elettronica database e l'errore non viene visualizzato nella sysmail_event_log visualizzazione.

Passaggio 2: Controllare sysmail_unsentitems, sysmail_sentitems e sysmail_faileditems visualizzazioni

È possibile controllare la presenza di problemi con messaggi di posta elettronica specifici per verificare se i messaggi di posta elettronica del database vengono inviati, sono bloccati nella coda o non possono essere inviati.

Le tabelle interne nel database msdb contengono i messaggi di posta elettronica e gli allegati inviati da Posta elettronica database, insieme al relativo stato corrente. Posta elettronica database aggiorna queste tabelle durante l'elaborazione dei messaggi.

Sysmail_mailitems table è la tabella di base per le altre viste sysmail. La sysmail_allitems vista è basata sulla tabella ed è un superset di queste viste.

Note

Se si esegue il backup del database msdb di produzione e si esegue il ripristino in un altro sistema di test come database utente, è possibile ricreare le viste di sistema sysmail nel backup ripristinato. Le definizioni di visualizzazione nel backup ripristinato fanno riferimento al database msdb nel sistema in cui è stato ripristinato il backup. Vedere lo script per ricreare le viste sysmail nel database msdb del cliente nella sezione Backup msdb.

Sysmail_unsentitems

Questa vista contiene una riga per ogni Posta elettronica database messaggio il cui stato non è inviato o riprova.

Utilizzare questa vista quando si desidera controllare il numero di messaggi in attesa di essere inviati e da quanto tempo sono presenti nella coda della posta. In genere, il numero di messaggi non inviati è ridotto. È possibile eseguire il benchmark durante le normali operazioni per determinare un numero ragionevole di messaggi nella coda dei messaggi per le normali operazioni.

È anche possibile controllare i messaggi di posta elettronica in sysmail_unsentitems se si verificano problemi con gli oggetti di Service Broker in msdb. Se la ExternalMailQueue coda o InternalMailQueue è disabilitata o si verificano problemi con la route, la posta potrebbe rimanere in sysmail_unsentitmes.

I messaggi non inviati o nuovi tentativi sono ancora nella coda di posta elettronica e possono essere inviati in qualsiasi momento. I messaggi possono avere lo stato non inviato per i motivi seguenti:

  • Il messaggio è nuovo. Anche se il messaggio è stato inserito nella coda di posta, Posta elettronica database sta lavorando su altri messaggi e non ha ancora raggiunto questo messaggio.
  • Il programma esterno Posta elettronica database non è in esecuzione e non viene inviato alcun messaggio di posta elettronica.

I messaggi possono avere lo stato di ripetizione dei tentativi per i motivi seguenti:

  • Posta elettronica database ha tentato di inviare il messaggio di posta elettronica, ma non è stato possibile contattare il server di posta SMTP. Posta elettronica database continua a provare a inviare il messaggio usando altri account Posta elettronica database assegnati al profilo che ha inviato il messaggio. Se nessun account può inviare il messaggio di posta elettronica, Posta elettronica database attenderà il periodo di tempo configurato per il Account Retry Delay parametro e quindi tenterà di inviare nuovamente il messaggio. Posta elettronica database usa il parametro per determinare il numero di tentativi di invio del messaggio. Quando Posta elettronica database tenta di inviare il messaggio, il messaggio rimane lo stato di ripetizione dei tentativi.
  • Posta elettronica database si connette al server SMTP, ma si verifica un errore. Il codice di errore SMTP restituito dal server SMTP e qualsiasi messaggio di errore a fianco può essere utilizzato per ulteriori operazioni di risoluzione dei problemi.

Sysmail_faileditems

Se si sa che il messaggio di posta elettronica non è riuscito a essere inviato, è possibile eseguire una query sysmail_faileditems direttamente. Per altre informazioni sull'esecuzione sysmail_faileditems di query e sul filtro per i messaggi specifici per destinatario, vedere Controllare lo stato dei messaggi di posta elettronica inviati con Posta elettronica database.

Per controllare lo stato dei messaggi di posta elettronica inviati tramite Posta elettronica database, eseguire gli script seguenti:

-- 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

Se si vuole trovare l'ora in cui l'ultimo messaggio di posta elettronica è stato inviato correttamente, è possibile eseguire query sysmail_sentitems e ordinare sent_date in base a quanto segue:

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

Se alcuni tipi di messaggi vengono inviati correttamente, ma altri non lo sono, questa visualizzazione può aiutare a individuare le differenze.

Passaggio 3: Controllare sysmail_mailattachments visualizzazione

Questa vista contiene una riga per ogni allegato inviato a Posta elettronica database. Usare questa visualizzazione quando sono necessarie informazioni su Posta elettronica database allegati.

Se si verificano problemi durante l'invio di messaggi di posta elettronica con allegati, ma alcuni messaggi con allegati vengono inviati correttamente, questa visualizzazione può aiutare a individuare le differenze.

Passaggio 4: Controllare Posta elettronica database configurazione per il server SMTP

Un altro passaggio per risolvere i problemi di Posta elettronica database consiste nel controllare la configurazione Posta elettronica database per il server SMTP e l'account usato per inviare Posta elettronica database.

Per altre informazioni su come configurare Posta elettronica database, vedere Configurare Posta elettronica database.

Configurare Posta elettronica database

Per configurare Posta elettronica database, seguire questa procedura:

  1. Aprire SSMS, selezionare Gestione, fare clic con il pulsante destro del mouse Posta elettronica database e scegliere Configura Posta elettronica database.

    Screenshot della voce configura Posta elettronica database log nel menu Posta elettronica database.

  2. Selezionare Gestisci account e profili>Posta elettronica database Avanti.

  3. Se si dispone di un account, selezionare Visualizza, modificare o eliminare un account esistente e selezionare Avanti. In caso contrario, selezionare Crea nuovo account. Lo screenshot seguente mostra le impostazioni dell'account usate per connettersi al server SMTP e inviare Posta elettronica database.

    Screenshot della gestione dell'account esistente in Configurazione guidata posta elettronica database.

Prestare particolare attenzione a:

  • Nome del server e numero di porta. Il nome del server deve essere un nome di dominio completo e il numero di porta deve essere accurato. In genere, la porta SMTP predefinita è 25, ma è necessario controllare la configurazione SMTP corrente.

  • SSL. Verificare se il server SMTP richiede SECURE Sockets Layer (SSL) o Transport Layer Security (TLS).

  • Autenticazione SMTP. Si usano le autenticazione di Windows del servizio motore di database, l'autenticazione di base con un account di dominio specificato o l'autenticazione anonima? È necessario verificare il server SMTP consentito nel proprio ambiente. Se viene specificato un account di dominio (account del servizio o autenticazione di base), deve disporre delle autorizzazioni per il server SMTP.

È possibile usare la configurazione per inviare un messaggio di prova con PowerShell, vedere Inviare un messaggio di posta elettronica di test con PowerShell.

Controllare Posta elettronica database parametri di sistema

Per controllare i parametri di sistema, seguire questa procedura:

  1. Aprire SSMS, selezionare Gestione, fare clic con il pulsante destro del mouse Posta elettronica database e scegliere Configura Posta elettronica database.

  2. Selezionare Visualizza o modifica parametri di sistema.

Lo screenshot seguente mostra i valori predefiniti per i parametri di sistema. Si notino eventuali parametri di sistema univoci e determinano se sono correlati al problema che si sta risolvendo.

Screenshot della configurazione guidata dei parametri di sistema in Configurazione guidata posta elettronica database.

Passaggio 5: Inviare un messaggio di prova

Questa sezione illustra come inviare un Posta elettronica database di test usando SSMS e PowerShell.

Inviare un messaggio di posta elettronica di prova con Posta elettronica database

L'invio di un messaggio di posta elettronica di test consente di provare a riprodurre il problema riscontrato e di verificare se è possibile inviare qualsiasi Posta elettronica database.

Per inviare un Posta elettronica database di test, selezionare Gestione, fare clic con il pulsante destro del mouse su Posta elettronica database e selezionare Invia messaggio di posta elettronica di test...

Screenshot dell'opzione invia messaggio di posta elettronica di test visualizzata dopo aver fatto clic con il pulsante destro del mouse Posta elettronica database.

Dopo aver inviato il messaggio di prova, controllare le visualizzazioni di log e sysmail Posta elettronica database.

  • Se il messaggio di prova non viene inviato correttamente, usare questo documento per risolvere i problemi relativi al motivo per cui non viene inviato.
  • Se il messaggio di prova viene inviato correttamente, ma ci sono ancora problemi con altri messaggi che non vengono inviati, concentrarsi sui dettagli dei messaggi di posta elettronica che non vengono inviati. Esaminare il comando effettivo sp_send_dbmail che viene eseguito. Se il comando Transact-SQL non è disponibile, raccogliere una traccia XEvent usando sql_batch_completed i comandi e sql_batch_started ed esaminare la batch_text colonna.

Inviare un messaggio di posta elettronica di test con PowerShell

L'uso di un processo esterno consente di escludere Posta elettronica database dalla risoluzione dei problemi e testare la configurazione dell'account. Ad esempio, usare PowerShell per inviare un messaggio di prova. Se non si invia un messaggio di prova tramite PowerShell, indica che non si tratta di un problema Posta elettronica database.

Se la posta inviata da PowerShell ha esito negativo con le stesse impostazioni e credenziali del server SMTP, potrebbe indicare che il problema si trova nel server SMTP.

  • Modificare i parametri seguenti in base all'ambiente e quindi eseguire lo script seguente:

    $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) 
    
  • Se il server SMTP consente l'autenticazione anonima, usare la porta standard 25 e non richiede SSL. Eseguire lo script seguente:

    $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) 
    

Passaggio 6: Controllare gli oggetti di Service Broker sysmail

I problemi relativi agli oggetti Service Broker in msdb possono causare un'operazione non riuscita di Posta elettronica database. Un problema comune è che una delle code di Service Broker (ExternalMailQueue e InternalMailQueue) è disabilitata. Questo problema può essere causato da un messaggio non elaborabile che non può essere inviato correttamente in Service Broker. Ad esempio, xml in formato non valido. Se non è possibile inviare un messaggio dopo cinque tentativi, viene considerato "non elaborabile" e la coda verrà disabilitata fino alla rimozione del messaggio non elaborabile. Riabilitare la coda non risolverà il problema perché il messaggio non elaborante è ancora nella coda e la sequenza di errore si ripeterà. Per altre informazioni sul messaggio non elaborabili, vedere Gestione dei messaggi non elaborabili.

Uno degli altri oggetti di Service Broker, ad esempio Message Type, ContractService, e Route, può anche essere disabilitato o mancante. Le code di Service Broker hanno una procedura di attivazione associata alla coda, quindi si tratta di un possibile punto di errore. È possibile controllare la activation_procedure colonna in msdb.sys.service_queuese quindi usare sp_helptext per verificare se sono presenti problemi.

Eseguire la query seguente e quindi controllare il contenuto della seconda colonna dei risultati della query.

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

Per determinare se sono presenti problemi con gli oggetti di Service Broker, è preferibile confrontare gli oggetti con una configurazione di Posta elettronica database funzionante. Ecco gli oggetti da confrontare con:

  • 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

Risoluzione dei problemi di Posta elettronica database avanzata

La risoluzione dei problemi avanzata si applica agli scenari seguenti:

  • Quando si esamina il log Posta elettronica database, Posta elettronica database si arresta in modo anomalo e la causa non è completamente spiegata. Si noterà che il processo DatabaseMail viene avviato immediatamente da un messaggio di eccezione e quindi viene visualizzato il processo DatabaseMail.
  • Posta elettronica database non viene avviato correttamente. Il processo DatabaseMail non viene avviato nella sysmail_event_log visualizzazione.
  • La risoluzione iniziale dei problemi non consente di risolvere il problema.

È possibile usare i metodi seguenti per la risoluzione dei problemi di Posta elettronica database avanzata.

Raccolte per la risoluzione dei problemi avanzata

Per risolvere i problemi, potrebbe essere necessario uno o più di queste raccolte.

Metodo 1: Eseguire il backup del database msdb

Può essere utile eseguire query sulle viste sysmail in un ambiente separato dall'ambiente di produzione. In alcuni casi, è possibile eseguire il backup del database msdb e quindi eseguire il ripristino in un'altra istanza. Le viste sysmail sono tutte definite con riferimento a msdb, quindi anche quando si eseguono query nel backup msdb ripristinato, le viste fanno riferimento al database di sistema msdb nell'istanza. Per ricreare le viste sysmail dal database msdb di produzione, ricreare le viste sysmail nel database utente usando lo script seguente.

/* 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

Per altre informazioni sulle viste sysmail, vedere la sezione sysmail system views .For more information about sysmail views, see the sysmail system views section.

Metodo 2: Controllare il registro eventi dell'applicazione di Windows

Se il programma esterno DatabaseMail.exe non è in grado di accedere alla tabella msdb , il programma logrà l'errore nel registro eventi dell'applicazione di Windows. Inoltre, se DatabaseMail.exe rileva un'eccezione, verrà registrata anche l'eccezione. Anche se lo stack di eccezioni è in genere identico, controllare il registro eventi per verificare se esistono altre informazioni sullo stack.

In alcuni casi, quando si risolve un arresto anomalo del DatabaseMail.exe , è possibile che la registrazione indichi che è stato creato un dump del report degli errori di Windows come indicato di seguito:

<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:"

È possibile recuperare tutti i file che mostrano AppCrash_DatabaseMail.exe_* in .. \WER\ReportQueue path. Per i suggerimenti per l'analisi dei dump, vedere la sezione Analisi ProcDump .

Metodo 3: Raccogliere e analizzare la traccia XEvent o SQL Server

È possibile raccogliere una traccia dei comandi Transact-SQL eseguiti nel sistema per verificare se uno di essi ha esito negativo.

Configurare lo strumento PSSDiag

È possibile usare PSSDiag per raccogliere la traccia XEvent o SQL Server nel modello Prestazioni generali. Come illustrato nello screenshot seguente, selezionare alcuni eventi aggiuntivi, in particolare tutti gli eventi broker.

Screenshot dello strumento Pssdiag in cui sono abilitati tutti gli eventi broker nella scheda XEvent.

Analizzare la traccia Xevent o SQL

Quando viene inviato un Posta elettronica database, vengono visualizzate in genere cinque sessioni diverse (SPID) in un'acquisizione Xevent o Profiler.

  • sp_send_dbmail: dopo aver eseguito l'istruzione Transact-SQL, vengono visualizzati gli eventi di Service Broker usati per inserire i messaggi nella ExternalMailQueue coda.

  • Attivazione di Service Broker per l'invio di messaggi al server SMTP tramite DatabaseMail.exe. Il nome dell'applicazione è "Attivazione di Microsoft SQL Server Service Broker".

  • Posta elettronica database Programma esterno: si tratta del programma Posta elettronica database esterno che riceve messaggi dalla ExternalMailQueue coda e prepara i messaggi da inviare al server SMTP. Il nome dell'applicazione è "DatabaseMail - DatabaseMail - ID<PID>".

  • Posta elettronica database programma esterno: si tratta di un'altra connessione da Posta elettronica database. Dopo che la prima connessione elabora i messaggi esistenti nella ExternalMailQueue coda, la connessione viene creata per l'ascolto di messaggi aggiuntivi da inserire nella coda. Se nella coda non sono presenti altri messaggi, DatabaseMail.exe terminerà e chiuderà la connessione.

  • Attivazione di Service Broker per la ricezione di messaggi di risposta dal server SMTP tramite DatabaseMail.exe. Aggiorna le tabelle sysmail per registrare i risultati dei messaggi inviati.

È possibile conoscere solo il comportamento previsto visualizzando molte delle tracce. Il modo migliore per conoscere le differenze consiste nel confrontare la traccia con quella delle Posta elettronica database inviate correttamente. Se a volte è possibile inviare un Posta elettronica database, confrontare la traccia con una traccia riuscita, vedere la differenza e verificare la presenza di eventuali errori segnalati dagli SPID. Se non è possibile inviare alcun Posta elettronica database, confrontare la traccia con quella inviata correttamente nell'ambiente di test.

Metodo 4: Acquisire e analizzare gli eventi di Monitoraggio processi

Process Monitor (Procmon) fa parte della suite Sysinternals di Windows.

Process Monitor produce un'acquisizione rumorosa. Per non perdere nulla, è preferibile applicare filtri ai dati dopo l'acquisizione anziché durante il processo di acquisizione. In genere, è possibile indirizzare l'acquisizione intorno a una riprova del problema Posta elettronica database, in modo che i dati complessivi acquisiti non siano troppo grandi.

Acquisire eventi di file, registro, rete, processi e thread

Quando si avvia procmon.exe, inizia immediatamente l'acquisizione dei dati. L'interfaccia utente grafica è semplice. È necessario arrestare l'acquisizione degli eventi fino a quando non si è pronti per riprodurre il problema. Selezionare Eventi di acquisizione file>(CTRL+E) per deselezionare la voce di menu e arrestare la raccolta di eventi. Selezionare l'icona della gomma o premere CTRL+X per cancellare gli eventi già acquisiti:

Screenshot dello strumento procmon che mostra che tutti gli eventi vengono cancellati.

Quando si è pronti a riprodurre il problema di Posta elettronica database, seguire questa procedura:

  1. Selezionare Eventi di acquisizione file>(CTRL+E) per avviare l'acquisizione degli eventi.
  2. Provare a inviare il Posta elettronica database per riprodurre il problema.
  3. Selezionare Eventi di acquisizione file>(CTRL+E) per arrestare l'acquisizione di eventi.
  4. Salvare il file come *. PML.

Analizzare la traccia di Monitoraggio processi

Dopo aver visualizzato . File PML, aprirlo di nuovo usando Monitoraggio processi. Filtrare prima di tutto il file in base ai processi di DatabaseMail.exe e sqlservr.exe . Selezionare quindi Filtro > ... oppure fare clic sull'icona del filtro per aprire il menu filtro.

In Nome processo selezionare sqlservr.exe e DatabaseMail.exe e quindi aggiungere queste voci:

Screenshot dello strumento procmon che mostra database.exe è filtrato.

Proprio come nel caso dell'acquisizione di SQL XEvent o Trace, non è immediatamente ovvio cosa cercare. In genere, il modo migliore per iniziare l'analisi consiste nel confrontare la traccia con un'acquisizione Procmon per un Posta elettronica database inviato correttamente. In teoria, confrontare la traccia con un messaggio di posta elettronica inviato correttamente dallo stesso ambiente in cui si verifica il problema. Tuttavia, se nessun Posta elettronica database viene inviato correttamente nell'ambiente specifico, confrontare la traccia con un messaggio di posta elettronica inviato correttamente in un altro ambiente.

Quando DatabaseMail.exe non riesce a caricare una DLL o non riesce a trovare il file DatabaseMail.exe.config , l'analisi è utile.

Metodo 5: Raccogliere e analizzare il dump delle eccezioni usando lo strumento ProcDump

ProcDump è anche una parte della suite Windows Sysinternals.

ProcDump è utile quando si tenta di acquisire un dump della memoria del DatabaseMail.exe programma esterno. In genere, si usa ProcDump per la risoluzione dei problemi quando DatabaseMail.exe rileva un'eccezione non gestita.

Configurare ProcDump

Per configurare ProcDump per acquisire un dump di DatabaseMail.exe quando si verifica un'eccezione non gestita, aprire prima un prompt dei comandi con privilegi di amministratore. Abilitare quindi ProcDump per acquisire il dump del processo di DatabaseMail.exe usando il comando seguente:

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

Nella finestra di comando verrà visualizzato l'output seguente:

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...

Riprodurre quindi il problema. Il dump verrà creato nella stessa cartella in cui è stato eseguito ProcDump.exe.

Analizzare il dump delle eccezioni

Trovare il record di eccezione ed esaminare lo stack di chiamate che porta all'eccezione.

  1. Aprire il file di dump in WinDbg (Scaricare gli strumenti di debug per Windows - WinDbg - Driver windows).
  2. Passare al record di eccezione usando il .ecxr comando o !analyze -v .

Quando si dispone dello stack, iniziare a cercare problemi noti per uno stack di chiamate corrispondente. Per altre informazioni, contattare il team CSS.

Metodo 6: Usare lo strumento di debug time travel

L'acquisizione TTD (Time Travel Debugging) è in genere l'ultima risorsa per problemi difficili. È possibile usare il debugger di anteprima di WinDbg per ottenerlo. Per istruzioni complete e informazioni su TTD, vedere Time Travel Debugging su come funziona e come eseguire l'analisi. Se si arriva a questo punto, è necessario contattare il team CSS. Tuttavia, questa sezione fornisce istruzioni su come acquisire il TTD quando necessario.

Configurare TTD

Per diversi motivi, l'acquisizione TTD di DatabaseMail.exe può essere un po'difficile. In primo luogo, DatabaseMail.exe non viene eseguito come servizio a tempo indeterminato, ma viene richiamato dal processo di SQL Server (sqlservr.exe). Pertanto, non è possibile collegarlo, ma è necessario configurare TTD usando il parametro per avviare l'acquisizione all'avvio -onLaunch di DatabaseMail.exe . In secondo luogo, poiché DatabaseMail.exe viene richiamato da un altro processo, è necessario usare i processi figlio debug.