データベース メールの問題のトラブルシューティング

この記事では、データベース メールの問題のトラブルシューティング方法について説明します。 初期トラブルシューティングで問題が解決されていない場合は、高度なトラブルシューティングを使用します。

初期データベース メールトラブルシューティング

基本的なトラブルシューティング手順を次に示します。

  1. DatabaseMail.exeを使用して既に送信または送信しようとしたメールのデータベース メール ログと sysmail (sysmail_event_log) ビュー 確認します。
  2. テスト メールを送信します。 テスト メールが正常に送信された場合は、送信されないメッセージの詳細に焦点を当てます。 テスト メールが送信されない場合は、テスト メールのトラブルシューティングに重点を置き、前に送信が失敗したメールを無視します。
  3. SMTP サーバーの設定が正しくないと思われる場合、またはメールの送信に使用されるアカウントに問題がある場合は、PowerShell を使用してテスト メールを送信します。
  4. PowerShell を使用してメールを送信できない場合は、SMTP 構成の問題である可能性があり、SMTP 管理者が必要です。

初期データベース メールトラブルシューティングには、次の手順を使用できます。

Msdb sysmail システム ビュー

詳細な手順を見る前に、関連するデータベース メールシステム ビューの簡単な概要を次に示します。

  1. 最も関連性の高いログ記録は、 msdb sysmail システム ビューで発生します。 これらのビューは、環境内で直接クエリを実行できます。

    名前 説明
    sysmail_allitems View データベース メールに送信されるすべてのメッセージをListsします。
    sysmail_event_log View データベース メール外部プログラムの動作に関するメッセージをListsします
    sysmail_faileditems View データベース メール送信できなかったメッセージに関する情報。
    sysmail_mailattachments View データベース メール メッセージへの添付ファイルに関する情報。
    sysmail_sentitems View データベース メールを使用して送信されたメッセージに関する情報。
    sysmail_unsentitems View データベース メールが現在送信しようとしているメッセージに関する情報。
  2. 一部のエラーは、Windows アプリケーション イベント ログに記録されます。

手順 1: ビュー sysmail_event_log確認する

このシステム ビューは、すべてのデータベース メール問題のトラブルシューティングの出発点です。

データベース メールのトラブルシューティングを行う場合は、ビューでsysmail_event_logメールエラーに関連するイベントを検索します。 一部のメッセージ (データベース メール外部プログラムの失敗など) は、特定の電子メールに関連付けられません。

Sysmail_event_logには、データベース メール システムによって返される Windows またはSQL Server メッセージごとに 1 行が含まれます。 SQL Server Management Studio (SSMS) で、[管理] を選択し、[データベース メール] を右クリックし、[データベース メール ログの表示] を選択して、次のようにデータベース メール ログをチェックします。

[データベース メール] メニューの [データベース メールログアイテムの表示] のスクリーンショット。

に対して次のクエリを 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_faileditemssysmail_event_log関連するメッセージをmailitem_id検索します。

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エラーが返されると、電子メールはデータベース メール システムに送信されないため、エラーはビューにsysmail_event_log表示されません。 ステートメント レベルのプロファイラー トレースを収集し、発生したエラーのトラブルシューティングを行う必要があります。

個々のアカウントの配信試行が失敗した場合、データベース メールは、メール アイテムの配信が成功するか失敗するまで、再試行の試行中にエラー メッセージを保持します。 配信が最後に成功した場合、累積されたすべてのエラーは、 を含む account_id個別の警告としてログに記録されます。 電子メールが送信された場合でも警告が発生する可能性があります。 配信が最後に失敗した場合、すべてのアカウントが失敗したため、以前のすべての警告は、 なしで account_id 1 つのエラー メッセージとしてログに記録されます。

sysmail_event_logにログインする可能性がある問題

次の問題がログインしている sysmail_event_log可能性があります。

  • SQL Serverに接続するための DatabaseMail.exe の失敗。

    外部プログラムが msdb テーブルにログを記録できない場合、プログラムはエラーを Windows アプリケーション イベント ログに記録します。

  • SMTP サーバーに関連付けられているエラー。

    • SMTP サーバーに接続できない。
    • SMTP サーバーでの認証に失敗しました。
    • SMTP サーバーは電子メール メッセージを拒否します。
  • DatabaseMail.exeの例外。

外部実行可能ファイルデータベース メール問題がない場合は、sysmail システム ビューに移動します。 特定のメールに関連するエラーを検索するには、ビューで失敗したメールの を検索mailitem_idし、 でsysmail_faileditemssysmail_event_log関連するメッセージをmailitem_id検索します。 からsp_send_dbmailエラーが返されると、電子メールはデータベース メール システムに送信されないため、エラーはビューにsysmail_event_log表示されません。

手順 2: ビューのsysmail_unsentitems、sysmail_sentitems、およびsysmail_faileditemsを確認する

特定のメールに関する問題についてこれらのビューをチェックすると、データベース メールが送信されているか、キューに残っているか、送信に失敗しているかを確認できます。

msdb データベース内の内部テーブルには、データベース メールから送信される電子メール メッセージと添付ファイルが、現在の状態と共に含まれています。 データベース メールは、メッセージの処理時にこれらのテーブルを更新します。

Sysmail_mailitems table は、他の sysmail ビューのベース テーブルです。 ビューは sysmail_allitems テーブル上に構築され、これらのビューのスーパーセットです。

注:

運用 msdb データベースをバックアップし、ユーザー データベースとして別のテスト システムに復元する場合は、復元されたバックアップで sysmail システム ビューを再作成できます。 復元されたバックアップのビュー定義は、バックアップを復元したシステム上の msdb データベースを参照します。 「Msdb バックアップ」セクションの「顧客 msdb で sysmail ビューを再作成するスクリプト」を参照してください。

Sysmail_unsentitems

このビューには、状態が未送信または再試行データベース メールメッセージごとに 1 行が含まれます。

このビューは、送信を待機しているメッセージの数と、メッセージがメール キューに入っている時間を確認する場合に使用します。 一般に、未送信メッセージの数は少ない。 通常の操作中にベンチマークを実行して、通常の操作に対してメッセージ キュー内の適切な数のメッセージを決定できます。

msdb の Service Broker オブジェクトに問題がある場合は、 でsysmail_unsentitemsメールをチェックすることもできます。 ExternalMailQueueまたは InternalMailQueue キューが無効になっている場合、またはルートに問題がある場合、メールは にsysmail_unsentitmes留まる可能性があります。

未送信 または 再試行中の メッセージはメール キューに残っており、いつでも送信できます。 メッセージには、次の理由で 未送信 の状態が表示される場合があります。

  • メッセージが新しい。 メッセージはメール キューに配置されていますが、データベース メールは他のメッセージで動作しており、このメッセージにはまだ到達していません。
  • データベース メール外部プログラムが実行されておらず、メールは送信されません。

次の理由により、メッセージの 再試行 状態が発生する可能性があります。

  • データベース メールメールを送信しようとしましたが、SMTP メール サーバーに接続できませんでした。 データベース メールは、メッセージを送信したプロファイルに割り当てられている他のデータベース メール アカウントを使用して、メッセージの送信を試み続けます。 アカウントがメールを送信できない場合、データベース メールはパラメーターに構成されているAccount Retry Delay時間の長さを待ってから、メッセージをもう一度送信しようとします。 データベース メール は、 パラメーターを使用して、メッセージの送信を試行する回数を決定します。 データベース メールメッセージの送信を試みると、メッセージは再試行中の状態のままです。
  • データベース メール SMTP サーバーに接続しますが、エラーが発生します。 SMTP サーバーによって返される SMTP エラー コードと、それに付随するエラー メッセージを使用して、さらにトラブルシューティングを行うことができます。

Sysmail_faileditems

メールの送信に失敗したことがわかっている場合は、直接クエリを実行 sysmail_faileditems できます。 受信者別の特定のメッセージのsysmail_faileditemsクエリとフィルター処理の詳細については、「データベース メールで送信された電子メール メッセージの状態を確認する」を参照してください。

データベース メールを使用して送信される電子メール メッセージの状態をチェックするには、次のスクリプトを実行します。

-- 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確認する

このビューには、データベース メールに送信される添付ファイルごとに 1 行が含まれます。 データベース メール添付ファイルに関する情報が必要な場合は、このビューを使用します。

添付ファイルを含むメールの送信に問題があるが、添付ファイルを含む一部のメールが正常に送信された場合、このビューは違いを見つけるのに役立つ可能性があります。

手順 4: SMTP サーバーデータベース メール構成を確認する

データベース メールの問題を解決するのに役立つもう 1 つの手順は、SMTP サーバーのデータベース メール構成と、データベース メールの送信に使用されるアカウントをチェックすることです。

データベース メールを構成する方法の詳細については、「データベース メールの構成」を参照してください。

データベース メールの構成

データベース メールを構成するには、次の手順に従います。

  1. SSMS を開き、[管理] を選択し、[データベース メール] を右クリックして、[データベース メールの構成] を選択します。

    [データベース メール] メニューの [データベース メールログ項目の構成] のスクリーンショット。

  2. [データベース メールアカウントとプロファイル>の管理] [次へ] を選択します。

  3. アカウントがある場合は、[既存のアカウントの 表示、変更、または削除 ] を選択し、[ 次へ] を選択し、それ以外の場合は [ 新しいアカウントの作成] を選択します。 次のスクリーンショットは、SMTP サーバーへの接続とデータベース メールの送信に使用されるアカウント設定を示しています。

    データベース メール構成ウィザードの既存のアカウントの管理のスクリーンショット。

次の場合に特に注意してください。

  • サーバー名とポート番号。 サーバー名は完全修飾ドメイン名である必要があり、ポート番号は正確である必要があります。 一般に、既定の SMTP ポートは 25 ですが、現在の SMTP 構成をチェックする必要があります。

  • Ssl。 SMTP サーバーで Secure Sockets Layer (SSL) またはトランスポート層セキュリティ (TLS) が必要かどうかを確認します。

  • SMTP 認証。 データベース エンジン サービスのWindows 認証、ドメイン アカウントを指定した基本認証、または匿名認証を使用していますか? 自分の環境で SMTP サーバーが許可する内容を確認する必要があります。 ドメイン アカウント (サービス アカウントまたは基本認証) が指定されている場合は、SMTP サーバーに対するアクセス許可が必要です。

構成を使用して PowerShell でテスト メールを送信できます。「PowerShell を使用 してテスト メールを送信する」を参照してください。

システム パラメーターデータベース メール確認する

システム パラメーターをチェックするには、次の手順に従います。

  1. SSMS を開き、[管理] を選択し、[データベース メール] を右クリックして、[データベース メールの構成] を選択します。

  2. [ システム パラメーターの表示または変更] を選択します

次のスクリーンショットは、システム パラメーターの既定値を示しています。 一意のシステム パラメーターに注目し、トラブルシューティングを行っている問題に関連しているかどうかを判断します。

データベース メール構成ウィザードでのシステム パラメーターの構成のスクリーンショット。

手順 5: テスト メールを送信する

このセクションでは、SSMS と PowerShell を使用してテスト データベース メールを送信するのに役立ちます。

データベース メールを使用してテスト メールを送信する

テスト メールを送信すると、発生している問題を再現したり、データベース メールを送信できるかどうかを確認したりできます。

テスト データベース メールを送信するには、[管理] を選択し、[データベース メール] を右クリックし、[テスト電子メールの送信]を選択します。

データベース メールを右クリックした後に表示されるテストメールの送信オプションのスクリーンショット。

テスト メールを送信した後、データベース メール ログビューと sysmail ビューをチェックします。

  • テスト メールが正常に送信されない場合は、このドキュメントを使用して、送信されない理由のトラブルシューティングを行います。
  • テスト メールが正常に送信されても、送信されない他のメールに問題が残っている場合は、送信されないメール メッセージの詳細に注目してください。 実行されている実際 sp_send_dbmail のコマンドを確認します。 Transact-SQL コマンドがない場合は、 コマンドと sql_batch_started コマンドを使用して XEvent トレースをsql_batch_completed収集し、列をbatch_text確認します。

PowerShell を使用してテスト メールを送信する

外部プロセスを使用すると、トラブルシューティングからデータベース メールを除外し、アカウント構成をテストするのに役立ちます。 たとえば、PowerShell を使用してテスト メールを送信します。 PowerShell を使用してテスト メールを送信できない場合は、データベース メールの問題ではないことを示します。

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 オブジェクトを確認する

msdb の Service Broker オブジェクトに関する問題により、データベース メールの操作が失敗する可能性があります。 一般的な問題は、Service Broker キューの 1 つ (ExternalMailQueueInternalMailQueue) が無効になっているということです。 この問題は、Service Broker で正常に送信できない有害メッセージが原因で発生する可能性があります。 たとえば、形式が正しくない XML などです。 5 回の試行後にメッセージを送信できない場合は、"有害" と見なされ、有害メッセージが削除されるまでキューは無効になります。 キューを再度有効にしても問題は解決しません。有害メッセージはキューに残っており、エラー シーケンスは繰り返されるだけなのでです。 有害メッセージの詳細については、「有害メッセージ 処理」を参照してください。

他の Service Broker オブジェクトの 1 つ (、ContractServiceRouteなどMessage Type) も無効または欠落している可能性があります。 Service Broker キューには、キューに関連付けられているアクティブ化手順があるため、障害が発生する可能性があります。 で列msdb.sys.service_queuesactivation_procedureチェックしてから、 を使用sp_helptextして、問題があるかどうかをチェックできます。

次のクエリを実行し、クエリ結果の 2 番目の列の内容をチェックします。

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

Service Broker オブジェクトに問題があるかどうかを判断するには、機能しているデータベース メール構成とオブジェクトを比較することをお勧めします。 比較する必要があるオブジェクトを次に示します。

  • 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

高度なデータベース メールトラブルシューティング

高度なトラブルシューティングは、次のシナリオに適用されます。

  • データベース メール ログを見ると、データベース メールがクラッシュし、原因は完全には説明されていません。 DatabaseMail プロセスが開始され、その直後に例外メッセージが表示され、DatabaseMail プロセスがシャットダウンされていることがわかります。
  • データベース メールが正常に開始されません。 ビューに DatabaseMail プロセスが開始されているのはsysmail_event_log表示されません。
  • 最初のトラブルシューティング は、問題の解決には役立ちません。

高度なデータベース メールトラブルシューティングには、次の方法を使用できます。

高度なトラブルシューティングのためのコレクション

この問題を解決するには、これらのコレクションの 1 つ以上が必要な場合があります。

方法 1: msdb データベースをバックアップする

運用環境とは別の環境で sysmail ビューにクエリを実行すると便利です。 場合によっては、 msdb データベースをバックアップしてから、別のインスタンスに復元できます。 sysmail ビューはすべて msdb を参照して定義されているため、復元された msdb バックアップでクエリを実行する場合でも、ビューはインスタンス内の msdb システム データベースを参照します。 運用 msdb から sysmail ビューを再作成するには、次のスクリプトを使用して、ユーザー データベースに 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 パス。 ダンプ分析の提案については、「 ProcDump 分析 」セクションを参照してください。

方法 3: XEvent またはSQL Server トレースを収集して分析する

システムで実行されている Transact-SQL コマンドのトレースを収集して、いずれかのコマンドが失敗したかどうかを確認できます。

PSSDiag ツールの構成

PSSDiag を使用して、全般パフォーマンス テンプレートの下の XEvent またはSQL Server トレースを収集できます。 次のスクリーンショットに示すように、いくつかの追加イベント (特にすべてのブローカー イベント) を選択します。

[XEvent] タブのすべてのブローカー イベントが有効になっている Pssdiag ツールのスクリーンショット。

Xevent または SQL トレースを分析する

データベース メールが送信されると、通常、Xevent または Profiler キャプチャに 5 つの異なるセッション (SPID) が表示されます。

  • sp_send_dbmail: Transact-SQL ステートメントを実行すると、キューにメッセージを配置するために使用される Service Broker イベントが ExternalMailQueue 表示されます。

  • を介して SMTP サーバーにメッセージを送信するための Service Broker ライセンス認証DatabaseMail.exe。 アプリケーション名は "Microsoft SQL Server Service Broker Activation" です。

  • データベース メール外部プログラム: これは、キューからメッセージを受信し、SMTP サーバーに送信するメッセージをExternalMailQueue準備する外部データベース メール プログラムです。 アプリケーション名は "DatabaseMail - DatabaseMail - Id<PID" です>。

  • データベース メール外部プログラム: これは、データベース メールからの別の接続です。 最初の接続がキュー上の既存のメッセージを ExternalMailQueue 処理した後、キューに配置される追加のメッセージをリッスンするために接続が作成されます。 キューに他のメッセージがない場合、 DatabaseMail.exe はこの接続を終了して閉じます。

  • DatabaseMail.exeをして SMTP サーバーから応答メッセージを受信するための Service Broker ライセンス認証。 送信されたメールの結果をログに記録するように sysmail テーブルを更新します。

多くのトレースを表示することによってのみ、予期される動作を把握できます。 違いを知る最善の方法は、正常に送信されたデータベース メールとトレースを比較することです。 データベース メールを送信できる場合は、トレースを成功したトレースと比較し、その違いを確認し、SPID によって報告されたすべてのエラーについてチェックします。 データベース メールを送信できない場合は、テスト環境で正常に送信されたものとトレースを比較します。

方法 4: プロセス モニター イベントをキャプチャして分析する

プロセス モニター (Procmon) は、Windows Sysinternals スイートの一部です。

プロセス モニターによってノイズの多いキャプチャが生成されます。 何も見逃さないように、キャプチャ プロセス中ではなく、キャプチャ後にデータにフィルターを適用することをお勧めします。 通常は、データベース メールの問題の再現に関するキャプチャをターゲットにして、キャプチャされたデータ全体が大きすぎないようにすることができます。

ファイル、レジストリ、ネットワーク、プロセス、スレッドのイベントをキャプチャする

procmon.exeを開始すると、すぐにデータのキャプチャが開始されます。 GUI は簡単です。 問題を再現する準備ができるまで、イベントのキャプチャを停止する必要があります。 [ ファイル>キャプチャ イベント ] (Ctrl + E) を選択してメニュー項目をオフにし、イベント コレクションを停止します。 消しゴム アイコンを選択するか、Ctrl キーを押しながら X キーを押して、既にキャプチャされているイベントをクリアします。

すべてのイベントがクリアされていることを示す procmon ツールのスクリーンショット。

データベース メールの問題を再現する準備ができたら、次の手順に従います。

  1. [ ファイル>キャプチャ イベント ] (Ctrl + E) を 選択して、イベントのキャプチャを開始します。
  2. データベース メールを送信して問題を再現してみてください。
  3. [ ファイル>キャプチャ イベント] (Ctrl + E) を選択して、イベントのキャプチャを停止します。
  4. ファイルを *として保存します。Pml。

プロセス モニター トレースを分析する

を取得した後。PML ファイルを開き、プロセス モニターをもう一度使用して開きます。 まず、ファイルを DatabaseMail.exe および sqlservr.exe プロセスにフィルター処理します。 次に、[ フィルター フィルター > ]... を選択するか、フィルター アイコンをクリックしてフィルター メニューを開きます。

[プロセス名] で、[sqlservr.exe] を選択し、DatabaseMail.exeし、次のエントリを追加します。

database.exe がフィルター処理されていることを示す procmon ツールのスクリーンショット。

SQL XEvent またはトレース キャプチャの場合と同様に、何を探すかはすぐには明らかではありません。 通常、分析を開始する最善の方法は、正常に送信されたデータベース メールの Procmon キャプチャとトレースを比較することです。 理想的には、問題が発生したのと同じ環境から正常に送信された電子メールとトレースを比較します。 ただし、特定の環境でデータベース メールが正常に送信されない場合は、トレースを別の環境で正常に送信された電子メールと比較します。

DatabaseMail.exe がDLLの読み込みに失敗した場合、または DatabaseMail.exe.config ファイルが見つからない場合、分析は役立ちます。

方法 5: ProcDump ツールを使用して例外ダンプを収集して分析する

ProcDump は、Windows Sysinternals スイートの一部でもあります。

ProcDump は、 DatabaseMail.exe 外部プログラムのメモリ ダンプをキャプチャしようとすると便利です。 通常、未処理の例外が発生 DatabaseMail.exe 場合のトラブルシューティングには ProcDump を使用します。

ProcDump の構成

未処理の例外が発生したときに DatabaseMail.exe のダンプをキャプチャするように ProcDump を構成するには、まず管理者特権でコマンド プロンプトを開きます。 次に、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. または !analyze -v コマンドを使用して例外レコードに.ecxr切り替えます。

スタックがある場合は、一致する呼び出し履歴の既知の問題の検索を開始します。 さらにヘルプが必要な場合は、CSS チームにお問い合わせください。

方法 6: タイム トラベル デバッグ ツールを使用する

通常、タイム トラベル デバッグ (TTD) キャプチャは、困難な問題の最後の手段です。 WinDbg プレビュー デバッガーを使用して取得できます。 TTD に関する包括的な手順と情報については、「 タイム トラベル デバッグ の動作と分析方法」を参照してください。 この時点に到達した場合は、CSS チームに問い合わせる必要があります。 ただし、このセクションでは、必要に応じて TTD をキャプチャする方法について説明します。

TTD の構成

いくつかの理由から、 DatabaseMail.exe のTTDキャプチャは少し難しいかもしれません。 まず、 DatabaseMail.exe はサービスとして無期限に実行されませんが、SQL Server (sqlservr.exe) プロセスによって呼び出されます。 そのため、アタッチすることはできませんが、DatabaseMail.exe起動時にキャプチャを開始するには、 パラメーターを使用-onLaunchして TTD を構成する必要があります。 2 つ目は、 DatabaseMail.exe が別のプロセスによって呼び出されるため、 デバッグ子プロセスを使用する必要があります。