Solucionar problemas de Database Mail

Este artigo fornece métodos para solucionar problemas de Database Mail. Se a solução de problemas inicial não tiver resolvido o problema, use a solução de problemas avançada.

Solução de problemas de Database Mail inicial

Aqui estão as etapas básicas de solução de problemas:

  1. Examine as exibições de log e sysmail (sysmail_event_log) de Database Mail para emails que já foram enviados ou tentaram enviar usando DatabaseMail.exe.
  2. Envie um email de teste. Se o email de teste for enviado com êxito, concentre-se nos detalhes das mensagens que não são enviadas. Se o email de teste não for enviado, concentre-se na solução de problemas do email de teste e ignore os emails enviados sem sucesso antes.
  3. Se você suspeitar que as configurações do servidor SMTP estão incorretas ou que há um problema com a conta usada para enviar o email, use o PowerShell para enviar um email de teste.
  4. Se você não enviar o email usando o PowerShell, é provável que seja um problema de configuração SMTP e um administrador SMTP será necessário.

Você pode usar as etapas a seguir para a solução de problemas de Database Mail inicial.

Exibições do sistema de sysmail do Msdb

Antes de examinar as etapas detalhadas, aqui está um resumo rápido das exibições relevantes do sistema Database Mail.

  1. O registro em log mais relevante ocorre na exibição do sistema msdb sysmail. Você pode consultar essas exibições diretamente em seu ambiente.

    Nome Tipo Descrição
    Sysmail_allitems Exibir Listas todas as mensagens enviadas para Database Mail.
    Sysmail_event_log Exibir Listas mensagens sobre o comportamento do programa externo Database Mail.
    sysmail_faileditems Exibir Informações sobre mensagens que Database Mail não puderam enviar.
    sysmail_mailattachments Exibir Informações sobre anexos a mensagens Database Mail.
    sysmail_sentitems Exibir Informações sobre mensagens enviadas usando Database Mail.
    sysmail_unsentitems Exibir Informações sobre mensagens que Database Mail está tentando enviar no momento.
  2. Alguns erros são registrados no log de eventos do aplicativo Windows.

Etapa 1: verificar sysmail_event_log exibição

Essa exibição do sistema é o ponto de partida para solucionar problemas de Database Mail.

Ao solucionar problemas Database Mail, pesquise a exibição sysmail_event_log de eventos relacionados a falhas de email. Algumas mensagens (como a falha do programa externo Database Mail) não estão associadas a emails específicos.

Sysmail_event_logcontém uma linha para cada mensagem do Windows ou SQL Server retornada pelo sistema Database Mail. Em SQL Server Management Studio (SSMS), selecione Gerenciamento, clique com o botão direito do mouse em Database Mail e selecione Exibir Database Mail Log para marcar o log de Database Mail da seguinte maneira:

Captura de tela do item Exibir Database Mail log no menu Database Mail.

Execute a consulta a seguir para 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

A event_type coluna pode ter os seguintes valores:

  • Erros
  • Avisos
  • Informações
  • Êxito

Para mostrar apenas os tipos de evento necessários, use a WHERE cláusula para filtrar.

Verificar o item de email com falha específica

Para pesquisar erros relacionados a emails específicos, pesquise o mailitem_id email com falha no modo de exibição sysmail_faileditems e pesquise mensagens relacionadas ao mailitem_id .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 um erro é retornado do sp_send_dbmail, o email não é enviado para o sistema de Database Mail e o erro não é exibido no modo de exibiçãosysmail_event_log. Você deve reunir o rastreamento do criador de perfil no nível da instrução e solucionar problemas do erro encontrado.

Quando as tentativas de entrega de conta individuais falharem, Database Mail manterá as mensagens de erro durante tentativas de repetição até que a entrega do item de email seja bem-sucedida ou falhe. Se a entrega for bem-sucedida no final, todos os erros acumulados serão registrados como avisos separados, incluindo account_id. Pode causar um aviso mesmo que o email tenha sido enviado. Se a entrega falhar no final, todos os avisos anteriores serão registrados como uma mensagem de erro sem uma account_id , pois todas as contas falharam.

Problemas que podem ser registrados no sysmail_event_log

Os seguintes problemas podem ser registrados em sysmail_event_log:

  • Falha de DatabaseMail.exe se conectar a SQL Server.

    Se o programa externo não puder fazer logon nas tabelas msdb , o programa registrará erros no log de eventos do aplicativo Windows.

  • Falhas associadas ao servidor SMTP.

    • Falha ao entrar em contato com o servidor SMTP.
    • Falha ao autenticar com o servidor SMTP.
    • O servidor SMTP recusa a mensagem de email.
  • Exceções no DatabaseMail.exe.

Se não houver problemas com Database Mail executável externo, acesse as exibições do sistema sysmail. Para pesquisar erros relacionados a emails específicos, pesquise o mailitem_id email com falha no modo de exibição sysmail_faileditems e pesquise mensagens relacionadas ao mailitem_id .sysmail_event_log Quando um erro é retornado do sp_send_dbmail, o email não é enviado para o sistema de Database Mail e o erro não é exibido no modo de exibiçãosysmail_event_log.

Etapa 2: verificar exibições de sysmail_unsentitems, sysmail_sentitems e sysmail_faileditems

Você pode marcar esses modos de exibição para problemas com emails específicos para ver se os emails de banco de dados estão sendo enviados, estão presos na fila ou não são enviados.

Tabelas internas no banco de dados msdb contêm as mensagens de email e anexos enviados de Database Mail, juntamente com suas status atuais. Database Mail atualiza essas tabelas quando as mensagens são processadas.

Sysmail_mailitems a tabela é a tabela base para as outras exibições de sysmail. O sysmail_allitems modo de exibição é criado na tabela e é um superconjunto dessas exibições.

Observação

Se você fizer backup do banco de dados msdb de produção e restaurar para outro sistema de teste como um banco de dados de usuário, poderá recriar as exibições do sistema de sysmail no backup restaurado. As definições de exibição no backup restaurado referenciarão o banco de dados msdb no sistema em que você restaurou o backup. Consulte o script para recriar exibições de sysmail no msdb do cliente na seção de backup do Msdb .

Sysmail_unsentitems

Essa exibição contém uma linha para cada Database Mail mensagem cuja status não está reentrada ou repetindo.

Use essa exibição quando quiser ver quantas mensagens estão esperando para serem enviadas e há quanto tempo elas estão na fila de emails. Geralmente, o número de mensagens não enviadas é pequeno. Você pode fazer benchmark durante operações normais para determinar um número razoável de mensagens na fila de mensagens para operações normais.

Você também pode marcar emails se sysmail_unsentitems houver problemas com os objetos do Service Broker no msdb. Se a ExternalMailQueue fila ou InternalMailQueue estiver desabilitada ou houver problemas com a rota, o email poderá permanecer em sysmail_unsentitmes.

Mensagens não enviadas ou repetindo ainda estão na fila de emails e podem ser enviadas a qualquer momento. As mensagens podem ter a status não enviada pelos seguintes motivos:

  • A mensagem é nova. Embora a mensagem tenha sido colocada na fila de emails, Database Mail está trabalhando em outras mensagens e ainda não chegou a essa mensagem.
  • O Database Mail programa externo não está em execução e nenhum email é enviado.

As mensagens podem ter o status de repetição pelos seguintes motivos:

  • Database Mail tentou enviar o email, mas não conseguiu contatar o servidor de email SMTP. Database Mail continua tentando enviar a mensagem usando outras contas Database Mail atribuídas ao perfil que enviou a mensagem. Se nenhuma conta puder enviar o email, Database Mail aguardará o tempo configurado para o Account Retry Delay parâmetro e tentará enviar a mensagem novamente. Database Mail usa o parâmetro para determinar quantas vezes são tentadas enviar a mensagem. Quando Database Mail tenta enviar a mensagem, a mensagem continua sendo o status de repetição.
  • Database Mail se conecta ao servidor SMTP, mas ele encontra um erro. O código de erro SMTP retornado pelo servidor SMTP e qualquer mensagem de erro que acompanha pode ser usado para solução de problemas adicionais.

Sysmail_faileditems

Se você souber que o email não foi enviado, você pode consultar sysmail_faileditems diretamente. Para obter mais informações sobre consulta sysmail_faileditems e filtragem de mensagens específicas por destinatário, consulte Verificar o status das mensagens de email enviadas com Database Mail.

Para marcar o status de mensagens de email enviadas usando Database Mail, execute os seguintes scripts:

-- 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 você quiser encontrar a hora em que o último email foi enviado com êxito, você poderá consultar sysmail_sentitems e solicitar da sent_date seguinte maneira:

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

Se determinados tipos de emails forem enviados com êxito, mas outros não forem, essa exibição poderá ajudá-lo a descobrir as diferenças.

Etapa 3: verificar sysmail_mailattachments exibição

Essa exibição contém uma linha para cada anexo enviado para Database Mail. Use essa exibição quando precisar de informações sobre Database Mail anexos.

Se você tiver problemas para enviar emails com anexos, mas alguns emails com anexos forem enviados com êxito, essa exibição poderá ajudá-lo a descobrir as diferenças.

Etapa 4: verificar Database Mail configuração do servidor SMTP

Outra etapa para ajudar a resolver problemas Database Mail é marcar a configuração de Database Mail para o servidor SMTP e a conta usada para enviar Database Mail.

Para obter mais informações sobre como configurar Database Mail, consulte Configurar Database Mail.

Configurar Database Mail

Para configurar Database Mail, siga as etapas:

  1. Abra o SSMS, selecione Gerenciamento, clique com o botão direito do mouse em Database Mail e selecione Configurar Database Mail.

    Captura de tela do item de log configurar Database Mail no menu Database Mail.

  2. Selecione Gerenciar contas e perfis> Database MailPróximo.

  3. Se você tiver uma conta, selecione Exibir, alterar ou excluir uma conta existente e selecione Avançar, caso contrário, selecione criar nova conta. A captura de tela a seguir mostra as configurações da conta usadas para se conectar ao servidor SMTP e enviar Database Mail.

    Captura de tela do gerenciamento da conta existente no Assistente de Configuração de Email de Banco de Dados.

Preste atenção especial a:

  • Nome do servidor e número da porta. O nome do servidor deve ser um nome de domínio totalmente qualificado e o número da porta deve ser preciso. Geralmente, a porta SMTP padrão é 25, mas você precisa marcar a configuração SMTP atual.

  • SSL. Verifique se o servidor SMTP requer SSL (Secure Sockets Layer) ou TLS (Transport Layer Security).

  • Autenticação SMTP. Você está usando o autenticação do Windows do serviço mecanismo de banco de dados, autenticação básica com uma conta de domínio especificada ou autenticação anônima? Você precisa verificar o que o servidor SMTP permite em seu próprio ambiente. Se uma conta de domínio for especificada (conta de serviço ou autenticação básica), ela deverá ter as permissões no servidor SMTP.

Você pode usar a configuração para enviar um email de teste com o PowerShell, consulte Enviar um email de teste com o PowerShell.

Verificar Database Mail parâmetros do sistema

Para marcar os parâmetros do sistema, siga as etapas:

  1. Abra o SSMS, selecione Gerenciamento, clique com o botão direito do mouse em Database Mail e selecione Configurar Database Mail.

  2. Selecione Exibir ou alterar parâmetros do sistema.

A captura de tela a seguir mostra os valores padrão para os parâmetros do sistema. Observe todos os parâmetros exclusivos do sistema e determine se eles estão relacionados ao problema que você está solução de problemas.

Captura de tela de configurar parâmetros do sistema no Assistente de Configuração de email de banco de dados.

Etapa 5: Enviar um email de teste

Esta seção ajuda você a enviar um Database Mail de teste usando o SSMS e o PowerShell.

Enviar um email de teste com Database Mail

Enviar um email de teste ajuda você a tentar reproduzir o problema que você está enfrentando e verificar se algum Database Mail pode ser enviado.

Para enviar um Database Mail de teste, selecione Gerenciamento, clique com o botão direito do mouse em Database Mail e selecione Enviar email de teste....

Captura de tela da opção enviar email de teste que mostra depois de clicar com o botão direito do mouse em Database Mail.

Depois de enviar o email de teste, marcar as exibições Database Mail log e sysmail.

  • Se o email de teste não for enviado com êxito, use este documento para solucionar por que ele não é enviado.
  • Se o email de teste for enviado com êxito, mas ainda houver problemas com outros emails que não são enviados, concentre-se nos detalhes das mensagens de email que não estão sendo enviadas. Examine o comando real sp_send_dbmail que está sendo executado. Se você não tiver o comando Transact-SQL, reúna um rastreamento XEvent usando sql_batch_completed comandos e sql_batch_started e examine a batch_text coluna.

Enviar um email de teste com o PowerShell

O uso de um processo externo ajuda você a excluir Database Mail da solução de problemas e testar a configuração da conta. Por exemplo, use o PowerShell para enviar um email de teste. Se você não enviar um email de teste usando o PowerShell, ele indicará que não é um problema Database Mail.

Se o email enviado do PowerShell falhar com as mesmas configurações e credenciais do servidor SMTP, poderá indicar que o problema está no servidor SMTP.

  • Altere os seguintes parâmetros de acordo com seu ambiente e execute o seguinte script:

    $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 o servidor SMTP permitir a autenticação anônima, use a porta padrão 25 e não exigirá SSL. Execute o seguinte script:

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

Etapa 6: verificar os objetos do Service Broker do sysmail

Problemas com os objetos do Service Broker no msdb podem causar uma operação mal sucedida de Database Mail. Um problema comum é que uma das filas do Service Broker (ExternalMailQueue e InternalMailQueue) está desabilitada. Esse problema pode ser causado por uma mensagem venenosa que não pode ser enviada com êxito no Service Broker. Por exemplo, XML malformado. Se uma mensagem não puder ser enviada após cinco tentativas, ela será considerada "venenosa" e a fila será desabilitada até que a mensagem venenosa seja removida. Habilitar novamente a fila não resolve o problema porque a mensagem venenosa ainda está na fila e a sequência de falhas será repetida. Para obter mais informações sobre mensagens venenosas, consulte Tratamento de Mensagens venenosas.

Um dos outros objetos do Service Broker (como Message Type, Contract, Servicee Route) também pode estar desabilitado ou ausente. As filas do Service Broker têm um procedimento de ativação associado à fila, portanto, é um possível ponto de falha. Você pode marcar a activation_procedure coluna no e, em msdb.sys.service_queuesseguida, usar sp_helptext para marcar se há algum problema.

Execute a consulta a seguir e, em seguida, marcar o conteúdo da segunda coluna dos resultados da consulta.

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

Para determinar se há problemas com os objetos do Service Broker, é melhor comparar os objetos com uma configuração de Database Mail em funcionamento. Aqui estão os objetos com os quais você deve comparar:

  • 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

Solução de problemas de Database Mail avançada

A solução de problemas avançada se aplica aos seguintes cenários:

  • Quando você olha para o log de Database Mail, Database Mail falha e a causa não é totalmente explicada. Você vê que o processo databasemail é iniciado é seguido imediatamente por uma mensagem de exceção e, em seguida, o processo DatabaseMail é encerrado é exibido.
  • Database Mail não começa com êxito. Você não vê que o processo do DatabaseMail é iniciado no modo de exibição sysmail_event_log .
  • A solução de problemas inicial não ajuda você a resolve o problema.

Você pode usar os seguintes métodos para solução de problemas de Database Mail avançada.

As coleções para solução avançada de problemas

Para resolver os problemas, talvez você precise de uma ou mais dessas coleções.

Método 1: fazer backup do banco de dados msdb

Pode ser útil consultar as exibições do sysmail em um ambiente separado da produção. Em alguns casos, você pode fazer backup do banco de dados msdb e, em seguida, restaurar para outra instância. As exibições de sysmail são definidas com referência ao msdb, portanto, mesmo ao consultar no backup restaurado do msdb , as exibições referenciarão o banco de dados do sistema msdb em sua instância. Para recriar exibições de sysmail do msdb de produção, crie novamente as exibições de sysmail no banco de dados do usuário usando o script a seguir.

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

Para obter mais informações sobre as exibições do sysmail, consulte a seção exibições do sistema sysmail .

Método 2: verificar o log de eventos do aplicativo Windows

Se o programa deDatabaseMail.exe externo não puder fazer logon na tabela msdb , o programa registrará o erro no log de eventos do aplicativo Windows. Além disso, se DatabaseMail.exe encontrar exceção, a exceção também será registrada. Embora a pilha de exceções seja normalmente idêntica, marcar o log de eventos para ver se existem outras informações de pilha.

Às vezes, quando você soluciona um problema deDatabaseMail.exe falha, você pode descobrir que o registro em log indica que um despejo de Relatório de Erro do Windows foi criado da seguinte maneira:

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

Você pode recuperar todos os arquivos que mostram AppCrash_DatabaseMail.exe_* no .. Caminho \WER\ReportQueue . Consulte a seção Análise do ProcDump para obter sugestões de análise de despejo.

Método 3: Coletar e analisar rastreamento de XEvent ou SQL Server

Você pode coletar um rastreamento dos comandos Transact-SQL que estão sendo executados no sistema para ver se algum deles falha.

Configurar a ferramenta PSSDiag

Você pode usar o PSSDiag para coletar o rastreamento XEvent ou SQL Server no modelo de Desempenho Geral. Conforme mostrado na captura de tela a seguir, selecione alguns eventos adicionais, especialmente todos os eventos do agente.

Captura de tela da ferramenta Pssdiag na qual todos os eventos do agente na guia XEvent estão habilitados.

Analisar o rastreamento Xevent ou SQL

Quando um Database Mail é enviado, você vê normalmente cinco SPIDs (sessões diferentes) em uma captura Xevent ou Profiler.

  • sp_send_dbmail: depois de executar a instrução Transact-SQL, você verá os eventos do Service Broker que são usados para colocar as mensagens na ExternalMailQueue fila.

  • Ativação do Service Broker para enviar mensagens ao servidor SMTP por meio doDatabaseMail.exe. O nome do aplicativo é "ativação Microsoft SQL Server Service Broker".

  • Database Mail Programa Externo: este é o programa de Database Mail externo que recebe mensagens da ExternalMailQueue fila e prepara mensagens para enviar ao servidor SMTP. O nome do aplicativo é "DatabaseMail – DatabaseMail – Id<PID>".

  • Database Mail Programa Externo: essa é outra conexão de Database Mail. Depois que a primeira conexão processa as mensagens existentes na ExternalMailQueue fila, a conexão é criada para ouvir mensagens adicionais a serem colocadas na fila. Se não houver outras mensagens na fila, DatabaseMail.exe encerrará e fechará essa conexão.

  • Ativação do Service Broker para receber mensagens de resposta do servidor SMTP por meio doDatabaseMail.exe. Ele atualiza as tabelas de sysmail para registrar os resultados dos emails enviados.

Você só pode saber o comportamento esperado exibindo muitos dos rastreamentos. A melhor maneira de saber as diferenças é comparar seu rastreamento com um dos Emails de Banco de Dados enviados com êxito. Se às vezes você puder enviar um Database Mail, compare o rastreamento com um rastreamento bem-sucedido, veja a diferença e marcar para quaisquer erros relatados pelos SPIDs. Se você não conseguir enviar nenhuma Database Mail, compare o rastreamento com o enviado com êxito em seu ambiente de teste.

Método 4: capturar e analisar eventos do Monitor de Processos

O Monitor de Processos (Procmon) faz parte do pacote Sysinternals do Windows.

O Monitor de Processo produz uma captura barulhenta. Para não perder nada, é melhor aplicar filtros aos dados depois de capturados em vez de durante o processo de captura. Normalmente, você pode direcionar a captura em torno de uma reprovação do problema Database Mail, de modo que os dados gerais capturados não seriam muito grandes.

Capturar eventos de arquivo, registro, rede, processo e thread

Quando você inicia procmon.exe, ele começa a capturar dados imediatamente. A GUI é simples. Você precisa parar a captura de eventos até estar pronto para reproduzir o problema. Selecione Eventos de Captura de Arquivos > (Ctrl+E) para desmarcar o item do menu e interromper a coleção de eventos. Selecione o ícone de borracha ou pressione Ctrl+X para limpar os eventos que já foram capturados:

Captura de tela da ferramenta procmon que mostra que todos os eventos estão limpos.

Quando estiver pronto para reproduzir o problema Database Mail, siga as etapas:

  1. Selecione Eventos de Captura de Arquivos > (Ctrl+E) para começar a capturar eventos.
  2. Tente enviar o Database Mail para reproduzir o problema.
  3. Selecione Eventos de Captura de Arquivos > (Ctrl+E) para parar de capturar eventos.
  4. Salve o arquivo como *. PML.

Analisar o rastreamento do Monitor de Processo

Depois de obter o . Arquivo PML, abra-o usando o Monitor de Processos novamente. Primeiro, filtre o arquivo para os processos deDatabaseMail.exe e sqlservr.exe . Em seguida, selecione Filtrar > Filtro... , ou clique no ícone de filtro para abrir o menu de filtro.

Para Nome do Processo, selecione sqlservr.exe e DatabaseMail.exee adicione estas entradas:

Captura de tela da ferramenta procmon que mostra database.exe é filtrada.

Assim como o caso do SQL XEvent ou da captura de rastreamento, não é imediatamente óbvio o que procurar. Normalmente, a melhor maneira de iniciar a análise é comparar seu rastreamento com uma captura do Procmon para uma Database Mail enviada com êxito. Idealmente, compare o rastreamento com um email enviado com êxito do mesmo ambiente em que o problema ocorre. No entanto, se nenhuma Database Mail for enviada com êxito no ambiente específico, compare o rastreamento com um email enviado com êxito em outro ambiente.

Quando DatabaseMail.exe falha ao carregar uma DLL ou não consegue localizar o arquivo DatabaseMail.exe.config , a análise é útil.

Método 5: Coletar e analisar o despejo de exceção usando a ferramenta ProcDump

O ProcDump também faz parte do pacote Sysinternals do Windows.

O ProcDump é útil quando você tenta capturar um despejo de memória do programa externoDatabaseMail.exe . Normalmente, você usa o ProcDump para solução de problemas quando DatabaseMail.exe encontra uma exceção sem tratamento.

Configurar o ProcDump

Para configurar o ProcDump para capturar um despejo de DatabaseMail.exe ao encontrar uma exceção sem tratamento, primeiro abra um prompt de comando com privilégios de administrador. Em seguida, habilite o ProcDump para capturar o despejo do processo deDatabaseMail.exe usando o seguinte comando:

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

Você verá a seguinte saída na janela de comando:

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

Em seguida, reproduza o problema. O despejo será criado na mesma pasta em que você executou ProcDump.exe.

Analisar o despejo de exceção

Localize o registro de exceção e examine a pilha de chamadas que leva à exceção.

  1. Abra o arquivo de despejo no WinDbg (Baixar Ferramentas de Depuração para Windows – WinDbg – drivers do Windows).
  2. Alterne para o registro de exceção usando o .ecxr comando ou !analyze -v .

Quando você tiver a pilha, comece a procurar problemas conhecidos para uma pilha de chamadas correspondente. Se precisar de mais ajuda, entre em contato com a equipe do CSS.

Método 6: usar a ferramenta de depuração de viagem no tempo

A captura de TTD (depuração de viagem no tempo) geralmente é o último recurso para problemas difíceis. Você pode usar o depurador de visualização do WinDbg para obtê-lo. Para obter instruções e informações abrangentes sobre o TTD, consulte Depuração de Viagem no Tempo sobre como ele funciona e como fazer a análise. Se você chegar a esse ponto, precisará entrar em contato com a equipe do CSS. No entanto, esta seção fornece instruções sobre como capturar o TTD quando necessário.

Configurar o TTD

Por vários motivos, a captura de TTD deDatabaseMail.exe pode ser um pouco desafiadora. Primeiro, DatabaseMail.exe não é executado como um serviço indefinidamente, mas é invocado pelo processo SQL Server (sqlservr.exe). Portanto, você não pode anexar a ele, mas deve configurar o TTD usando o -onLaunch parâmetro para começar a capturá-lo quando DatabaseMail.exe começar. Em segundo lugar, como DatabaseMail.exe é invocada por outro processo, você precisa usar os processos filho de depuração.