Compartilhar via


Solução de problemas do Database Mail

Este artigo fornece métodos para solucionar problemas do 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 do Database Mail inicial

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

  1. Revise as exibições de log do Database Mail e sysmail (sysmail_event_log) para emails que já foram enviados ou tentaram enviar usando DatabaseMail.exe.
  2. Envie um e-mail de teste. Se o email de teste for enviado com êxito, concentre-se nos detalhes das mensagens que não foram 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 que não foram enviados com êxito antes.
  3. Se você suspeitar que as configurações do servidor SMTP estão incorretas ou se houver 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 seja necessário.

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

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 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 Lista todas as mensagens enviadas ao Database Mail.
    sysmail_event_log Exibir Lista mensagens sobre o comportamento do programa externo Database Mail.
    sysmail_faileditems Exibir Informações sobre mensagens que o Database Mail não pôde enviar.
    sysmail_mailattachments Exibir Informações sobre anexos de mensagens do Database Mail.
    sysmail_sentitems Exibir Informações sobre mensagens que foram enviadas usando o Database Mail.
    sysmail_unsentitems Exibir Informações sobre mensagens que o 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 visualização

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

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

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

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

Execute a seguinte consulta 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
  • Warnings
  • Informações
  • Êxito

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

Verifique o item de email com falha específico

Para procurar erros relacionados a e-mails específicos, procure o mailitem_id e-mail com falha no sysmail_faileditems modo de exibição e, em seguida, pesquise mensagens relacionadas a 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 de sp_send_dbmail, o email não é enviado para o sistema Database Mail e o erro não é exibido na sysmail_event_log exibição. Você deve coletar o rastreamento do criador de perfil no nível da instrução e solucionar o erro encontrado.

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

Problemas que podem estar registrados sysmail_event_log

Os seguintes problemas podem estar conectados sysmail_event_log:

  • Falha do DatabaseMail.exe para se conectar ao SQL Server.

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

  • Falhas associadas ao servidor SMTP.

    • Falha ao entrar em contato com o servidor SMTP.
    • Falha na autenticação com o servidor SMTP.
    • O servidor SMTP recusa a mensagem de e-mail.
  • Exceções em DatabaseMail.exe.

Se não houver problemas com o executável externo do Database Mail, vá para as exibições do sistema sysmail. Para procurar erros relacionados a e-mails específicos, procure o mailitem_id e-mail com falha no sysmail_faileditems modo de exibição e, em seguida, pesquise mensagens relacionadas a mailitem_id .sysmail_event_log Quando um erro é retornado de sp_send_dbmail, o email não é enviado para o sistema Database Mail e o erro não é exibido na sysmail_event_log exibição.

Etapa 2: Verificar sysmail_unsentitems, sysmail_sentitems e sysmail_faileditems modos de exibição

Você pode verificar se há problemas com e-mails específicos nessas exibições para ver se os e-mails do banco de dados estão sendo enviados, estão presos na fila ou não foram enviados.

As tabelas internas no banco de dados msdb contêm as mensagens de email e os anexos enviados do Database Mail, juntamente com seu status atual. O Database Mail atualiza essas tabelas quando as mensagens são processadas.

Sysmail_mailitems table é a tabela base para as outras visualizações do Sysmail. A sysmail_allitems exibição é construída 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 sysmail no backup restaurado. As definições de exibição no backup restaurado farão referência ao 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 Backup do Msdb.

Sysmail_unsentitems

Esse modo de exibição contém uma linha para cada mensagem do Database Mail cujo status é não enviado ou tentando novamente.

Use essa exibição para saber quantas mensagens estão aguardando o envio e há quanto tempo estão na fila de email. Geralmente, o número de mensagens não enviadas é pequeno. Você pode comparar 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 fazer check-in de sysmail_unsentitems e-mails se houver problemas com os objetos do Service Broker no msdb. Se a ExternalMailQueue fila ou InternalMailQueue estiver desativada ou se houver problemas com a rota, o e-mail poderá permanecer em sysmail_unsentitmes.

As mensagens não enviadas ou repetidas ainda estão na fila de e-mail e podem ser enviadas a qualquer momento. As mensagens podem ter o status não enviado pelos seguintes motivos:

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

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

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

Sysmail_faileditems

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

Para verificar o status das mensagens de email enviadas usando o 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ê deseja descobrir a hora em que o último e-mail foi enviado com sucesso, você pode consultar sysmail_sentitems e ordenar da sent_date seguinte forma:

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

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

Etapa 3: verificar sysmail_mailattachments visualização

Esse modo de exibição contém uma linha para cada anexo enviado ao Database Mail. Use esse modo de exibição quando precisar de informações sobre anexos do Database Mail.

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

Etapa 4: Verificar a configuração do Database Mail para o servidor SMTP

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

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

Configurar o Database Mail

Para configurar o 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 o Database Mail no menu Database Mail.

  2. Selecione Gerenciar contas e perfis>do Database Mail Avançar.

  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 de conta usadas para se conectar ao servidor SMTP e enviar o Database Mail.

    Captura de tela de gerenciar conta existente no Assistente de configuração de email do 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 verificar 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 a autenticação do Windows do serviço Mecanismo de Banco de Dados, a autenticação básica com uma conta de domínio especificada ou a 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.

Verifique os parâmetros do sistema Database Mail

Para verificar 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á solucionando.

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

Etapa 5: enviar um e-mail de teste

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

Enviar um e-mail de teste com o Database Mail

O envio de um e-mail de teste ajuda você a tentar reproduzir o problema que está enfrentando e a 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 de envio de e-mail de teste que aparece após clicar com o botão direito do mouse em Database Mail.

Depois de enviar o e-mail de teste, verifique as exibições de log e sysmail do Database Mail.

  • Se o email de teste não for enviado com êxito, use este documento para solucionar o motivo pelo qual ele não foi 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. Revise 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 examine a batch_text coluna.

Enviar um email de teste com o PowerShell

O uso de um processo externo ajuda a excluir o Database Mail da solução de problemas e a 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, isso indicará que não é um problema do Database Mail.

Se o email enviado do PowerShell falhar com as mesmas configurações e credenciais do servidor SMTP, isso 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 autenticação anônima, use a porta padrão 25 e ela 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 Sysmail Service Broker

Problemas com os objetos do Service Broker no msdb podem causar falha na operação do 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 suspeita 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 "suspeita" e a fila será desabilitada até que a mensagem suspeita seja removida. Reabilitar a fila não resolverá o problema porque a mensagem suspeita ainda está na fila e a sequência de falha apenas se repetirá. Para obter mais informações sobre mensagens suspeitas, consulte Tratamento de mensagens suspeitas.

Um dos outros objetos do Service Broker (como Message Type, Contract, Service, e 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 verificar a activation_procedure coluna em msdb.sys.service_queuese usá-la sp_helptext para verificar se há algum problema.

Execute a consulta a seguir e verifique 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á algum problema 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}Enviar correio
    • {//www.microsoft.com/databasemail/messages}Status do Envio
  • Contracts
    • www.microsoft.com/databasemail/contracts/SendMail/v1.0
  • Queues
    • dbo.ExternalMailQueue
    • dbo.InternalMailQueue
  • Services
    • ExternalMailService
    • InternalMailService
  • Routes

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

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

  • Quando você examina o log do Database Mail, o Database Mail falha e a causa não é totalmente explicada. Você vê que o processo do DatabaseMail é iniciado é seguido imediatamente por uma mensagem de exceção e, em seguida, o processo do DatabaseMail está sendo desligado é exibido.
  • O Database Mail não é iniciado com êxito. Você não vê que o processo DatabaseMail foi iniciado na sysmail_event_log exibição.
  • A solução de problemas inicial não ajuda a resolver o problema.

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

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

Para resolver os problemas, você pode precisar 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 restaurar para outra instância. As exibições do sysmail são todas definidas com referência ao msdb, portanto, mesmo ao consultar o backup do msdb restaurado, as exibições farão referência ao banco de dados do sistema msdb em sua instância. Para recriar exibições de sysmail do msdb de produção, recrie 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 exibições de sysmail, consulte a seção de exibições do sistema sysmail.

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

Se o programa de DatabaseMail.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ção seja normalmente idêntica, verifique o log de eventos para ver se existe alguma outra informação da pilha.

Às vezes, ao solucionar problemas de uma falha DatabaseMail.exe , você pode descobrir que o log indica que um despejo de Relatório de Erros 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 .. \WER\ReportQueue . Consulte a seção Análise de ProcDump para obter sugestões de análise de despejo.

Método 3: Coletar e analisar o XEvent ou o rastreamento do 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 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 Xevent ou o rastreamento SQL

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

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

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

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

  • Programa Externo do Database Mail: Esta é outra conexão do Database Mail. Depois que a primeira conexão processa ExternalMailQueue as mensagens existentes na fila, a conexão é criada para escutar 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 do DatabaseMail.exe. Ele atualiza as tabelas de sysmail para registrar os resultados dos e-mails enviados.

Você só pode saber o comportamento esperado exibindo muitos dos rastreamentos. A melhor maneira de saber as diferenças é comparar seu rastreamento com o dos Database Mails enviados com sucesso. Se, às vezes, você puder enviar um Database Mail, compare o rastreamento com um rastreamento bem-sucedido, veja a diferença e verifique se há erros relatados pelos SPIDs. Se você não puder enviar nenhum Database Mail, compare o rastreamento com o que foi enviado com êxito em seu ambiente de teste.

Método 4: Capturar e analisar eventos do Process Monitor

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

O Monitor de Processo produz uma captura ruidosa. 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 reprodução do problema do Database Mail, para que os dados gerais capturados não sejam muito grandes.

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

Quando você começa procmon.exe, ele começa a capturar dados imediatamente. A GUI é direta. Você precisa interromper a captura de eventos até que esteja pronto para reproduzir o problema. Selecione Eventos de captura de arquivo>(Ctrl+E) para desmarcar o item de menu e interromper a coleta 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 do Database Mail, siga as etapas:

  1. Selecione Eventos de captura de arquivo>(Ctrl+E) para iniciar a captura de eventos.
  2. Tente enviar o Database Mail para reproduzir o problema.
  3. Selecione Eventos de captura de arquivo>(Ctrl+E) para interromper a captura de 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 Processo novamente. Primeiro, filtre o arquivo para os processos DatabaseMail.exe e sqlservr.exe . Em seguida, selecione Filtro > Filtro... ou clique no ícone de filtro para abrir o menu de filtro.

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

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

Assim como no caso da captura do SQL XEvent ou do Trace, não é imediatamente óbvio o que procurar. Normalmente, a melhor maneira de iniciar a análise é comparar seu rastreamento com uma captura Procmon para um Database Mail enviado com êxito. O ideal é comparar o rastreamento com um email enviado com êxito do mesmo ambiente em que o problema ocorre. No entanto, se nenhum Database Mail for enviado 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 encontrar 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 Windows Sysinternals.

ProcDump é útil quando você tenta capturar um despejo de memória do DatabaseMail.exe programa externo. Normalmente, você usa 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 ProcDump para capturar o despejo do processo DatabaseMail.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 – Windows drivers).
  2. Alterne para o registro de exceção usando o .ecxr comando ou !analyze -v .

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

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

A captura de depuração de viagem no tempo (TTD) 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 TTD, consulte Depuração de viagem no tempo sobre como funciona e como fazer análise. Se você chegar a este ponto, precisará entrar em contato com a equipe CSS. No entanto, esta seção fornece instruções sobre como capturar o TTD quando necessário.

Configurar TTD

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