次の方法で共有


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

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

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

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

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

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

Msdb sysmail システム ビュー

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

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

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

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

このシステム ビューは、すべてのデータベース メールの問題をトラブルシューティングするための開始点です。

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

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

[view データベース メール log item in データベース メール menu] のスクリーンショット。

次のクエリを実行して 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 句を使用してフィルター処理します。

失敗した特定のメール アイテムを確認する

特定のメールに関連するエラーを検索するには、sysmail_faileditems ビューで失敗したメールのmailitem_idを検索し、sysmail_event_logmailitem_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 システム ビューに移動します。 特定のメールに関連するエラーを検索するには、sysmail_faileditems ビューで失敗したメールのmailitem_idを検索し、sysmail_event_logmailitem_idに関連するメッセージを検索します。 sp_send_dbmailからエラーが返されると、電子メールは データベース メール システムに送信されず、エラーは sysmail_event_log ビューに表示されません。

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

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

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

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

Note

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

Sysmail_unsentitems

このビューには、状態が unsent または retrying データベース メール メッセージごとに 1 つの行が含まれます。

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

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

未送信またはメッセージは引き続きメール キュー内にあり、いつでも送信できます。 メッセージには、次の理由により、 unsent 状態が含まれる場合があります。

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

メッセージには、次の理由により、 retrying 状態が含まれる場合があります。

  • データベース メールメールを送信しようとしましたが、SMTP メール サーバーに接続できませんでした。 データベース メールは、メッセージを送信したプロファイルに割り当てられている他のデータベース メール アカウントを使用して、メッセージの送信を試み続けます。 アカウントがメールを送信できない場合、データベース メールは Account Retry Delay パラメーターに構成されている時間の長さを待ってから、メッセージの再送信を試みます。 データベース メールは、このパラメーターを使用して、メッセージの送信試行回数を決定します。 メッセージデータベース メール送信しようとすると、メッセージは retrying 状態のままです。
  • データベース メール 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

最後の電子メールが正常に送信された時刻を検索する場合は、次のようにsent_dateしてsysmail_sentitemsと注文を照会できます。

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 を開き、Management を選択し、データベース メールを右クリックして、構成データベース メールを選択します。

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

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

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

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

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

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

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

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

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

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

システム パラメーターを確認するには、次の手順に従います。

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

  2. View を選択するか、システム パラメーターを変更します

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

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

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

このセクションでは、SSMS と PowerShell を使用してテスト データベース メールを送信する方法について説明します。

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

テスト 電子メールを送信すると、発生している問題を再現し、データベース メールを送信できるかどうかを確認するのに役立ちます。

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

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

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

  • テスト メールが正常に送信されない場合は、このドキュメントを使用して、送信されない理由のトラブルシューティングを行います。
  • テスト メールが正常に送信されても、送信されない他のメールに問題が残っている場合は、送信されないメール メッセージの詳細に注目してください。 実行中の実際の sp_send_dbmail コマンドを確認します。 Transact-SQL コマンドがない場合は、 sql_batch_completed コマンドと sql_batch_started コマンドを使用して XEvent トレースを収集し、 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 回試行してもメッセージを送信できない場合は、"有害" と見なされ、有害メッセージが削除されるまでキューは無効になります。 キューを再度有効にしても問題は解決しません。これは、有害メッセージがまだキュー内にあり、エラー シーケンスが繰り返されるだけなのでです。 有害メッセージの詳細については、「 Poison Message Handling」を参照してください。

他の Service Broker オブジェクトの 1 つ ( Message TypeContractServiceRouteなど) も無効または不足している可能性があります。 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 プロセスがシャットダウンが表示されます。
  • データベース メールが正常に開始されません。 sysmail_event_log ビューDatabaseMail プロセスが開始表示されません。
  • 最初のトラブルシューティング 問題の解決には役立ちません。

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

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

この問題を解決するには、これらのコレクションの 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 Analysis 」セクションを参照してください。

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

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

PSSDiag ツールの構成

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

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

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

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

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

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

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

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

  • DATABASEMAIL.EXEを介して SMTP サーバーから応答メッセージを受信するための Service Broker のアクティブ化。 送信されたメールの結果をログに記録するように sysmail テーブルを更新します。

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

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

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

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

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

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

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

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

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

プロセス モニタートレースの分析

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

Process Namesqlservr.exeDatabaseMail.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. .ecxr または !analyze -v コマンドを使用して、例外レコードに切り替えます。

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

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

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

TTD の構成

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