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


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

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

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

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

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

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

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

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

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

    Имя Тип Описание
    sysmail_allitems View Списки все сообщения, отправляемые в Database Mail.
    sysmail_event_log View Списки сообщения о поведении внешней программы Database Mail.
    sysmail_faileditems View Сведения о сообщениях, которые Database Mail не удалось отправить.
    sysmail_mailattachments View Сведения о вложениях в сообщениях Database Mail.
    sysmail_sentitems View Сведения о сообщениях, отправленных с помощью Database Mail.
    sysmail_unsentitems View Сведения о сообщениях, которые 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, чтобы проверка журнал 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 table — это базовая таблица для других представлений 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

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

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 и выберите Отправить тестовую почту....

Снимок экрана: параметр отправки тестового сообщения электронной почты, который отображается после щелчка правой кнопкой мыши 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 происходит сбой 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

Вы можете собрать трассировку команд 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 mails. Если иногда можно отправить Database Mail, сравните трассировку с успешной трассировкой, просмотрите разницу и проверка на наличие ошибок, о которых сообщают SPID. Если вы не можете отправить Database Mail, сравните трассировку с успешно отправленной в тестовой среде.

Метод 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 фильтруется.

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

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

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

ProcDump также входит в состав набора Windows Sysinternals.

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

Настройка 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

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