Поделиться через


Устранение неполадок с компонентом Database Mail

В этой статье приведены методы устранения неполадок с компонентом Database Mail. Если начальная устранение неполадок не устранена, используйте дополнительные способы устранения неполадок.

Устранение неполадок с начальной базой данных

Ниже приведены основные действия по устранению неполадок.

  1. Просмотрите журнал Database Mail и представления sysmail (sysmail_event_log) для сообщений, которые уже отправлены или попытались отправить с помощью DatabaseMail.exe.
  2. Отправка тестовой почты. Если тестовая почта успешно отправлена, обратите внимание на сведения о сообщениях, которые не отправляются. Если тестовая почта не отправлена, сосредоточьтесь на устранении неполадок тестовой почты и игнорируйте сообщения, которые не удалось отправить раньше.
  3. Если вы подозреваете, что параметры SMTP-сервера неверны или возникла проблема с учетной записью, используемой для отправки почты, используйте PowerShell для отправки тестовой почты.
  4. Если вы не сможете отправить почту с помощью PowerShell, скорее всего, это будет проблема конфигурации SMTP, а администратор SMTP необходим.

Чтобы устранить неполадки с базой данных, выполните следующие действия.

Системные представления msdb sysmail

Прежде чем ознакомиться с подробными инструкциями, ознакомьтесь с кратким обзором соответствующих системных представлений Database Mail.

  1. Большинство соответствующих журналов происходит в системном представлении msdb sysmail. Эти представления можно запрашивать непосредственно в вашей среде.

    Имя. Тип Описание
    sysmail_allitems Представления Выводит список всех сообщений, отправленных в Database Mail.
    sysmail_event_log Представления Выводит сообщения о поведении внешней программы Database Mail.
    sysmail_faileditems Представления Сведения о сообщениях, которые не удалось отправить database Mail.
    sysmail_mailattachments Представления Содержит сведения о вложениях в сообщениях компонента Database Mail.
    sysmail_sentitems Представления Сведения о сообщениях, отправленных с помощью Компонента Database Mail.
    sysmail_unsentitems Представления Сведения о сообщениях, которые компонент Database Mail в настоящее время пытается отправить.
  2. Некоторые ошибки регистрируются в журнале событий приложения Windows.

Шаг 1. Проверка представления sysmail_event_log

Это системное представление является отправной точкой для устранения всех проблем с компонентом Database Mail.

При устранении неполадок с Компонентом Database Mail найдите sysmail_event_log сведения о событиях, связанных с ошибками электронной почты. Некоторые сообщения (например, сбой внешней программы Database Mail) не связаны с определенными письмами.

Sysmail_event_log содержит одну строку для каждого сообщения Windows или SQL Server, возвращаемого системой Database Mail. В СРЕДЕ SQL Server Management Studio (SSMS) выберите "Управление", щелкните правой кнопкой мыши Database Mail и выберите "Просмотреть журнал базы данных", чтобы проверить журнал Database Mail следующим образом:

Снимок экрана: элемент журнала view Database Mail в меню Database Mail.

Выполните следующий запрос 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

Столбец event_type может иметь следующие значения:

  • ошибки
  • Предупреждения
  • Информация
  • Удачное завершение

Чтобы отобразить только необходимые типы событий, используйте WHERE предложение для фильтрации.

Проверка определенного неуданого почтового элемента

Чтобы найти ошибки, связанные с конкретными письмами, найдите mailitem_id сообщение, которое не удалось отправить в sysmail_faileditems представлении, а затем найдите сообщения, связанные с 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

Если ошибка возвращается из sp_send_dbmail, сообщение электронной почты не отправляется в систему Database Mail, и ошибка не отображается в представлении sysmail_event_log . Необходимо собрать трассировку профилировщика уровня инструкции и устранить неполадки, с которыми вы столкнулись.

При неудачной попытке доставки отдельных учетных записей компонент Database Mail будет хранить сообщения об ошибках во время повторных попыток, пока доставка почтового элемента не завершится успешно или завершится ошибкой. Если доставка завершается успешно, все накопленные ошибки регистрируются в виде отдельных предупреждений, включая account_id. Это может вызвать предупреждение, даже если сообщение было отправлено. Если доставка завершается ошибкой, все предыдущие предупреждения регистрируются как одно сообщение об ошибке без account_id сбоя всех учетных записей.

Проблемы, которые могут быть зарегистрированы в sysmail_event_log

Войдите в систему sysmail_event_logследующие проблемы:

  • Сбой DatabaseMail.exe подключения к SQL Server.

    Если внешняя программа не может войти в таблицы msdb , программа будет записывать ошибки в журнал событий приложения Windows.

  • Сбои, связанные с SMTP-сервером.

    • Сбой связи с SMTP-сервером.
    • Сбой проверки подлинности с помощью SMTP-сервера.
    • SMTP-сервер отказывается от сообщения электронной почты.
  • Исключения в DatabaseMail.exe.

Если нет проблем с внешним исполняемым файлом Database Mail, перейдите в системные представления sysmail. Чтобы найти ошибки, связанные с конкретными письмами, найдите mailitem_id сообщение, которое не удалось отправить в sysmail_faileditems представлении, а затем найдите сообщения, связанные с mailitem_id sysmail_event_logним. Если ошибка возвращается из sp_send_dbmail, сообщение электронной почты не отправляется в систему Database Mail, и ошибка не отображается в представлении sysmail_event_log .

Шаг 2. Проверка представлений sysmail_unsentitems, sysmail_sentitems и sysmail_faileditems

Вы можете проверить эти представления на наличие проблем с определенными письмами, чтобы узнать, отправляются ли сообщения базы данных, зависают в очереди или не отправляются.

Внутренние таблицы в базе данных msdb содержат сообщения электронной почты и вложения, отправляемые из Database Mail, вместе с текущим состоянием. Компонент Database Mail обновляет эти таблицы при обработке сообщений.

Sysmail_mailitems таблица — это базовая таблица для других представлений sysmail. Представление sysmail_allitems построено на таблице и является супермножеством этих представлений.

Примечание.

При резервном копировании рабочей базы данных msdb и восстановлении в другой тестовой системе в качестве пользовательской базы данных можно повторно создать системные представления sysmail в восстановленной резервной копии. Определения представлений в восстановленной резервной копии будут ссылаться на базу данных msdb в системе, где вы восстановили резервную копию. См. сценарий для повторного создания представлений sysmail в msdb клиента в разделе резервного копирования Msdb.

Sysmail_unsentitems

Это представление содержит одну строку для каждого сообщения Database Mail, состояние которого не отображается или повторяется.

Используйте это представление, если хотите увидеть, сколько сообщений ожидает отправки и как долго они находятся в очереди. Как правило, количество неотступных сообщений невелико. Вы можете провести тест во время обычных операций, чтобы определить разумное количество сообщений в очереди сообщений для обычных операций.

Вы также можете проверить почту в sysmail_unsentitems случае проблем с объектами Service Broker в msdb. ExternalMailQueue InternalMailQueue Если или очередь отключена, или возникли проблемы с маршрутом, почта может остаться.sysmail_unsentitmes

Неотступные или повторные попытки сообщений по-прежнему находятся в очереди почты и могут отправляться в любое время. Сообщения могут иметь неотступное состояние по следующим причинам:

  • Сообщение новое. Хотя сообщение было помещено в очередь почты, Database Mail работает над другими сообщениями и еще не достигло этого сообщения.
  • Внешняя программа Database Mail не запущена, и почта не отправляется.

Сообщения могут иметь состояние повтора по следующим причинам:

  • Database Mail попыталась отправить почту, но не могла связаться с почтовым сервером SMTP. Database Mail продолжает пытаться отправить сообщение с помощью других учетных записей Database Mail, назначенных профилю, который отправил сообщение. Если учетная запись не может отправить почту, компонент Database Mail будет ожидать время, настроенное для Account Retry Delay параметра, а затем повторите попытку отправить сообщение. Database Mail использует параметр для определения количества попыток отправки сообщения. Когда компонент Database Mail пытается отправить сообщение, сообщение остается состоянием повтора .
  • Database Mail подключается к SMTP-серверу, но возникает ошибка. Код ошибки SMTP, возвращаемый SMTP-сервером, и любое сопровождающее сообщение об ошибке можно использовать для дальнейшего устранения неполадок.

Sysmail_faileditems

Если вы знаете, что сообщение электронной почты не отправлено, вы можете отправить запрос sysmail_faileditems напрямую. Дополнительные сведения о запросе sysmail_faileditems и фильтрации определенных сообщений по получателю см. в разделе "Состояние сообщений электронной почты, отправленных с помощью компонента Database Mail".

Чтобы проверить состояние сообщений электронной почты, отправляемых с помощью Database Mail, выполните следующие скрипты:

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

Если вы хотите найти время успешного отправки последнего сообщения электронной почты, можно выполнить запрос sysmail_sentitems и заказ sent_date следующим образом:

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

Если некоторые типы сообщений успешно отправлены, но другие не являются, это представление может помочь вам выяснить различия.

Шаг 3. Проверка представления sysmail_mailattachments

Это представление содержит одну строку для каждого вложения, отправленного в Database Mail. Используйте это представление, если вам нужна информация о вложениях Database Mail.

Если у вас возникли проблемы с отправкой сообщений с вложениями, но некоторые сообщения с вложениями отправляются успешно, это представление может помочь вам выяснить различия.

Шаг 4. Проверка конфигурации компонента Database Mail для SMTP-сервера

Еще одним шагом, помогающим решить проблемы с компонентом Database Mail, является проверка конфигурации компонента Database Mail для SMTP-сервера и учетной записи, используемой для отправки компонента Database Mail.

Дополнительные сведения о настройке Компонента Database Mail см. в разделе "Настройка компонента Database Mail".

Настройка Database Mail

Чтобы настроить Database Mail, выполните действия.

  1. Откройте SSMS, выберите "Управление", щелкните правой кнопкой мыши Database Mail и выберите "Настроить database Mail".

    Снимок экрана: настройка элемента журнала Database Mail в меню Database Mail.

  2. Выберите "Управление учетными записями и профилями>компонента Database Mail" далее.

  3. Если у вас есть учетная запись, выберите "Вид", "Изменить" или "Удалить имеющуюся учетную запись" и нажмите кнопку "Далее", в противном случае нажмите кнопку "Создать учетную запись". На следующем снимках экрана показаны параметры учетной записи, используемые для подключения к SMTP-серверу и отправки компонента Database Mail.

    Снимок экрана: управление существующей учетной записью в мастере настройки почты базы данных.

Обратите особое внимание на:

  • Имя сервера и номер порта. Имя сервера должно быть полным доменным именем, а номер порта должен быть точным. Как правило, smtp-порт по умолчанию равен 25, но необходимо проверить текущую конфигурацию SMTP.

  • SSL. Проверьте, требуется ли smtp-серверу протокол SSL или TLS.

  • Проверка подлинности SMTP. Вы используете проверка подлинности Windows службы ядро СУБД, обычную проверку подлинности с указанной учетной записью домена или анонимной проверкой подлинности? Необходимо проверить, что SMTP-сервер разрешает в собственной среде. Если указана учетная запись домена (учетная запись службы или обычная проверка подлинности), у нее должны быть разрешения на SMTP-сервере.

Конфигурацию можно использовать для отправки тестовой почты с помощью PowerShell, см. статью "Отправить тестовое сообщение электронной почты с помощью PowerShell".

Проверка параметров системы Database Mail

Чтобы проверить системные параметры, выполните следующие действия.

  1. Откройте SSMS, выберите "Управление", щелкните правой кнопкой мыши Database Mail и выберите "Настроить database Mail".

  2. Выберите просмотр или изменение системных параметров.

На следующем снимка экрана показаны значения по умолчанию для системных параметров. Обратите внимание на любые уникальные системные параметры и определите, связаны ли они с проблемой, которую вы устраняете.

Снимок экрана: настройка системных параметров в мастере настройки почты базы данных.

Шаг 5. Отправка тестовой почты

В этом разделе показано, как отправить тестовый компонент Database Mail с помощью SSMS и PowerShell.

Отправка тестового сообщения электронной почты с помощью Database Mail

Отправка тестового сообщения электронной почты помогает воспроизвести проблему, которую вы испытываете, и проверить, можно ли отправить любую почту Database Mail.

Чтобы отправить тестовую почту базы данных, выберите "Управление", щелкните правой кнопкой мыши "Почта базы данных" и выберите "Отправить тестовую электронную почту".....

Снимок экрана: параметр отправки тестовой электронной почты, который отображается после нажатия правой кнопкой мыши Database Mail.

После отправки тестовой почты проверьте журнал Database Mail и представления sysmail.

  • Если тестовая почта не отправлена успешно, используйте этот документ для устранения неполадок, почему он не отправлен.
  • Если тестовая почта отправлена успешно, но все еще возникают проблемы с другими письмами, которые не отправляются, обратите внимание на сведения о сообщениях электронной почты, которые не отправляются. Просмотрите фактическую sp_send_dbmail команду, выполняемую. Если у вас нет команды Transact-SQL, соберите трассировку XEvent с помощью и sql_batch_completed командами и sql_batch_started просмотрите batch_text столбец.

Отправка тестового сообщения электронной почты с помощью PowerShell

Использование внешнего процесса помогает исключить компонент Database Mail из устранения неполадок и проверить конфигурацию учетной записи. Например, используйте PowerShell для отправки тестовой почты. Если вы не можете отправить тестовую почту с помощью PowerShell, это означает, что это не проблема с компонентом Database Mail.

Если почта, отправленная из PowerShell, завершается ошибкой с теми же параметрами и учетными данными SMTP-сервера, это может указывать на то, что проблема находится на SMTP-сервере.

  • Измените следующие параметры в соответствии с вашей средой и выполните следующий скрипт:

    $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) 
    
  • Если SMTP-сервер разрешает анонимную проверку подлинности, используйте стандартный порт 25 и не требует SSL. Запустите следующий сценарий:

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

Шаг 6. Проверка объектов sysmail Service Broker

Проблемы с объектами Service Broker в msdb могут привести к неудачной работе компонента Database Mail. Распространенная проблема заключается в том, что одна из очередей Service Broker (ExternalMailQueue и InternalMailQueue) отключена. Эта проблема может быть вызвана подозрительным сообщением, которое не может быть успешно отправлено в Service Broker. Например, неправильно сформированный XML. Если сообщение не может быть отправлено после пяти попыток, оно считается "ядным" и очередь будет отключена, пока не будет удалено отравляемое сообщение. Повторное включение очереди не устранит проблему, так как сообщение об ошибке по-прежнему находится в очереди, и последовательность сбоев просто повторяется. Дополнительные сведения об отравляемом сообщении см. в разделе "Обработка сообщений о яд".

Один из других объектов Service Broker (например Message Type, Contract, Serviceи Route) также может быть отключен или отсутствует. Очереди Service Broker имеют процедуру активации, связанную с очередью, поэтому это возможная точка сбоя. Вы можете проверить activation_procedure столбец в msdb.sys.service_queues, а затем использовать sp_helptext для проверки наличия проблем.

Выполните следующий запрос и проверьте содержимое второго столбца результатов запроса.

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

Чтобы определить, существуют ли проблемы с объектами Service Broker, лучше сравнить объекты с работающей конфигурацией Database Mail. Ниже приведены объекты, с которыми следует сравнить:

  • 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

Устранение неполадок с расширенной базой данных

Дополнительные способы устранения неполадок применяются к следующим сценариям:

  • При просмотре журнала database Mail происходит сбой Database Mail, и причина не полностью объясняется. Вы видите, что процесс DatabaseMail запускается немедленно сообщением об исключении, а затем процесс DatabaseMail завершает работу .
  • Компонент Database Mail не запускается. Процесс DatabaseMail не запущен в представленииsysmail_event_log.
  • Первоначальное устранение неполадок не помогает устранить проблему.

Для устранения неполадок с компонентом Database Mail можно использовать следующие методы.

Коллекции для расширенного устранения неполадок

Чтобы решить проблемы, может потребоваться одна или несколько из этих коллекций.

Метод 1. Резервное копирование базы данных msdb

Это может быть полезно для запроса представлений sysmail в среде, отдельной от рабочей среды. В некоторых случаях можно создать резервную копию базы данных msdb , а затем восстановить ее в другом экземпляре. Представления sysmail определяются со ссылкой на msdb, поэтому даже при запросе в восстановленной резервной копии msdb представления будут ссылаться на системную базу данных msdb в вашем экземпляре. Чтобы повторно создать представления sysmail из рабочей msdb, повторно создайте представления sysmail в пользовательской базе данных с помощью следующего скрипта.

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

Дополнительные сведения о представлениях sysmail см. в разделе системных представлений sysmail.

Метод 2. Проверка журнала событий приложения Windows

Если внешняя DatabaseMail.exe программа не может войти в таблицу msdb , программа зановит ошибку в журнал событий приложения Windows. Кроме того, если DatabaseMail.exe возникает исключение, исключение также будет зарегистрировано. Хотя стек исключений обычно идентичен, проверьте журнал событий, чтобы узнать, существует ли любая другая информация стека.

Иногда при устранении неполадок, связанных с сбоем DatabaseMail.exe , вы можете обнаружить, что ведение журнала указывает, что дамб отчета об ошибках Windows был создан следующим образом:

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

Вы можете получить все файлы, которые отображаются AppCrash_DatabaseMail.exe_* в .. \WER\ReportQueue path. См. раздел "Анализ ProcDump" для предложений по анализу дампа.

Метод 3. Сбор и анализ XEvent или SQL Server Trace

Вы можете собрать трассировку команд Transact-SQL, выполняемых в системе, чтобы узнать, завершается ли любой из них сбоем.

Настройка средства PSSDiag

Вы можете использовать PSSDiag для сбора трассировки XEvent или SQL Server в шаблоне "Общая производительность". Как показано на следующем снимке экрана, выберите некоторые дополнительные события, особенно все события брокера.

Снимок экрана: средство Pssdiag, в котором включены все события брокера на вкладке XEvent.

Анализ трассировки Xevent или SQL

При отправке компонента Database Mail обычно отображаются пять разных сеансов (SPID) в записи Xevent или Profiler.

  • sp_send_dbmail. После запуска инструкции Transact-SQL вы увидите события Service Broker, используемые для отправки сообщений в ExternalMailQueue очередь.

  • Активация Service Broker для отправки сообщений на SMTP-сервер через DatabaseMail.exe. Имя приложения — "Активация microsoft SQL Server Service Broker".

  • Внешняя программа Database Mail: это внешняя программа Database Mail, которая получает сообщения из ExternalMailQueue очереди и подготавливает сообщения для отправки на SMTP-сервер. Имя приложения — DatabaseMail — DatabaseMail — Id<PID>.

  • Внешняя программа Database Mail: это еще одно подключение из Database Mail. После того как первое подключение обрабатывает существующие сообщения в ExternalMailQueue очереди, соединение создается для прослушивания дополнительных сообщений, которые будут помещены в очередь. Если в очереди нет других сообщений, DatabaseMail.exe завершит работу и закройте это подключение.

  • Активация Service Broker для получения сообщений ответа от SMTP-сервера через DatabaseMail.exe. Он обновляет таблицы sysmail до журналов результатов отправленных сообщений.

Вы можете только знать ожидаемое поведение, просматривая многие трассировки. Лучший способ узнать различия заключается в сравнении трассировки с одним из успешно отправленных сообщений Database Mail. Если иногда можно отправить компонент Database Mail, сравните трассировку с успешной трассировкой, просмотрите разницу и проверьте наличие ошибок, сообщаемых SPID. Если вы не можете отправить почту базы данных, сравните трассировку с той, которая успешно отправлена в тестовой среде.

Метод 4. Сбор и анализ событий монитора процессов

Монитор процессов (Procmon) является частью набора Windows Sysinternals.

Монитор процессов создает шумный захват. Чтобы не пропустить ничего, лучше применить фильтры к данным после захвата, а не во время процесса захвата. Как правило, вы можете настроить запись вокруг повторной отправки проблемы Database Mail, поэтому общий объем захваченных данных не будет слишком большим.

Запись файлов, реестра, сети, процессов и событий потока

При запуске procmon.exe начинается запись данных немедленно. Графический интерфейс прост. Необходимо остановить запись событий, пока вы не будете готовы воспроизвести проблему. Выберите "Записи файлов>" (CTRL+E), чтобы снять флажок элемента меню и остановить коллекцию событий. Выберите значок ластика или нажмите клавиши CTRL+X, чтобы очистить события, которые уже записаны:

Снимок экрана: средство procmon, показывающее, что все события очищаются.

Когда вы будете готовы воспроизвести проблему Компонента Database Mail, выполните следующие действия.

  1. Выберите события записи файлов>(CTRL+E), чтобы начать запись событий.
  2. Попробуйте отправить компонент Database Mail, чтобы воспроизвести проблему.
  3. Выберите "Запись файлов>" (CTRL+E), чтобы остановить запись событий.
  4. Сохраните файл как *. PML.

Анализ трассировки монитора процессов

После получения . PML-файл снова откройте его с помощью монитора процессов. Сначала отфильтруйте файл в DatabaseMail.exe и sqlservr.exe процессах. Затем выберите > фильтр... или щелкните значок фильтра, чтобы открыть меню фильтра.

Для имени процесса выберите sqlservr.exe и DatabaseMail.exe, а затем добавьте следующие записи:

Снимок экрана: инструмент procmon, показывающий, database.exe фильтруется.

Так же, как в случае с записью XEvent или трассировки SQL, это не сразу очевидно, что искать. Как правило, лучший способ начать анализ — сравнить трассировку с записью Procmon для успешно отправленного компонента Database Mail. В идеале сравните трассировку с успешно отправленной электронной почтой из той же среды, в которой возникает проблема. Однако если в определенной среде почта базы данных успешно отправлена, сравните трассировку с успешно отправленной электронной почтой в другой среде.

Если DatabaseMail.exe не удается загрузить библиотеку DLL или не удается найти файл конфигурации DatabaseMail.exe.config, анализ полезен.

Метод 5. Сбор и анализ дампа исключений с помощью средства ProcDump

ProcDump также является частью набора Windows Sysinternals.

ProcDump полезен при попытке записать дамп памяти DatabaseMail.exe внешней программы. Как правило, при DatabaseMail.exe обнаружении необработанного исключения используется ProcDump для устранения неполадок.

Настройка ProcDump

Чтобы настроить ProcDump для записи дампа DatabaseMail.exe при обнаружении необработанного исключения, сначала откройте командную строку с правами администратора. Затем включите ProcDump для записи дампа процесса DatabaseMail.exe с помощью следующей команды:

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

В командном окне вы увидите следующие выходные данные:

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

Затем воспроизводите проблему. Дампа будет создана в той же папке, где вы выполнили ProcDump.exe.

Анализ дампа исключений

Найдите запись исключения и проверьте стек вызовов, который приводит к исключению.

  1. Откройте файл дампа в WinDbg (скачивание средств отладки для Windows — WinDbg — драйверы Windows).
  2. Переключитесь на запись исключения с помощью .ecxr команды или !analyze -v команды.

При наличии стека начните поиск известных проблем для соответствующего стека вызовов. Если вам нужна дополнительная помощь, обратитесь в группу CSS.

Метод 6. Использование средства отладки временных путешествий

Запись отладки по времени (TTD) обычно является последним средством для сложных проблем. Чтобы получить его, можно использовать отладчик предварительной версии WinDbg. Подробные инструкции и сведения о TTD см. в статье "Отладка времени перемещения" по принципу работы и способам анализа. Если вы до этого момента, обратитесь в группу CSS. Однако в этом разделе приведены инструкции по захвату TTD при необходимости.

Настройка TTD

По нескольким причинам запись DatabaseMail.exe TTD может быть немного сложной. Во-первых, DatabaseMail.exe не выполняется в качестве службы на неопределенный срок, но вызывается процессом SQL Server (sqlservr.exe). Поэтому вы не можете подключиться к нему, но необходимо настроить TTD с помощью -onLaunch параметра, чтобы начать запись при запуске DatabaseMail.exe . Во-вторых, так как DatabaseMail.exe вызывается другим процессом, необходимо использовать дочерние процессы отладки.