次の方法で共有


データベース メールのトラブルシューティングの一般的な手順

適用対象:SQL ServerAzure SQL Managed Instance

データベース メールのトラブルシューティングを行うには、データベース メール システムに関して次の点を確認する必要があります。 以下の手順は論理的な順序で示していますが、どのような順序で行ってもかまいません。

アクセス許可

データベース メールのすべての側面をトラブルシューティングするには、 sysadmin 固定サーバー ロールのメンバーである必要があります。 sysadmin 固定サーバー ロールのメンバーではないユーザーは、他のユーザーが送信した電子メールに関する情報ではなく、送信しようとしている電子メールに関する情報のみを取得できます。

データベース メールが有効になっているか

  1. SQL Server Management Studio で、クエリ エディター ウィンドウを使用して SQL Server のインスタンスに接続し、次のコードを実行します。

    sp_configure 'show advanced', 1; 
    GO
    RECONFIGURE;
    GO
    sp_configure;
    GO
    

    結果ウィンドウで、データベース メール XP のrun_value (サーバー構成オプション)1に設定されていることを確認します。

    run_value1されていない場合、データベース メールは有効になりません。

    悪意のあるユーザーから攻撃を受ける機能の数を少なくするため、データベース メールは自動的には有効になりません。 詳細については、「セキュリティ構成」を参照してください。

  2. データベース メールを有効にすることが適切であると判断した場合は、次のコードを実行します。

    sp_configure 'show advanced', 1; 
    GO
    RECONFIGURE;
    GO
    sp_configure 'Database Mail XPs', 1; 
    GO
    RECONFIGURE;
    GO
    

    sp_configure プロシージャを既定の状態に戻します。詳細オプションは表示されません。次のコードを実行します。

    sp_configure 'show advanced', 0; 
    GO
    RECONFIGURE;
    GO
    

ユーザーにメール送信が正しく設定されているか

  1. データベース メールを送信するには、 データベースの msdb データベース ロールのメンバーにユーザーがなる必要があります。 sysadmin 固定サーバー ロールと msdbdb_owner ロールのメンバーは、自動的に DatabaseMailUserRole ロールのメンバーになります。 DatabaseMailUserRole の他のすべてのメンバーを一覧するには、次のステートメントを実行します。

    EXEC msdb.sys.sp_helprolemember 'DatabaseMailUserRole';
    
  2. DatabaseMailUserRole ロールにユーザーを追加するには、次のステートメントを使用します。

    USE msdb;
    GO
    
    sp_addrolemember @rolename = 'DatabaseMailUserRole'
    ,@membername = '<database user>';
    
  3. データベース メールを送信するユーザーは、少なくとも 1 つのデータベース メール プロファイルにアクセスできる必要があります。 ユーザー (プリンシパル) とそのユーザーがアクセスできるプロファイルを一覧するには、次のステートメントを実行します。

    EXEC msdb.dbo.sysmail_help_principalprofile_sp;
    
  4. データベース メール構成ウィザードを使用して プロファイルを作成 し、ユーザーにプロファイルへのアクセスを許可します。

データベース メールが起動しているか

処理する電子メール メッセージがあると、データベース メール外部プログラムがアクティブになります。 指定されたタイムアウト期間内に送信するメッセージがなくなると、プログラムが終了します。

  1. データベース メールのアクティブ化が開始されことを確認するには、次のステートメントを実行します。

    EXEC msdb.dbo.sysmail_help_status_sp;
    
  2. データベース メールのアクティブ化が開始されていない場合は、次のステートメントを実行して開始します。

    EXEC msdb.dbo.sysmail_start_sp;
    
  3. データベース メール外部プログラムが開始されている場合は、次のステートメントを使用してメール キューの状態を確認します。

    EXEC msdb.dbo.sysmail_help_queue_sp @queue_type = 'mail';
    

    メール キューの状態は RECEIVES_OCCURRING になっている必要があります。 状態キューは、瞬間によって異なる場合があります。 メールキューの状態が RECEIVES_OCCURRING ではない場合、キューの再起動をお試しください。 次のステートメントでキューを停止します。

    EXEC msdb.dbo.sysmail_stop_sp;
    

    停止後、次のステートメントでキューを開始します。

    EXEC msdb.dbo.sysmail_start_sp;
    

    lengthの結果セットのsysmail_help_queue_sp列を使用して、メール キュー内の電子メールの数を確認します。

問題は一部のアカウントに影響を与えるのか、全部のアカウントに影響を与えるのか

一部のプロファイルがメールを送信できないと判断した場合は、問題のプロファイルで使用されるデータベース メール アカウントに問題がある可能性があります。

  1. メールを正しく送信できるアカウントを確認するには、次のステートメントを実行します。

    SELECT sent_account_id, sent_date FROM msdb.dbo.sysmail_sentitems;
    
  2. 一覧表示されたアカウントのいずれも、メールを送信できないプロファイルで使用されていない場合、そのプロファイルで使用可能なアカウントがすべて正しく機能していない可能性があります。 個々のアカウントをテストするには、データベース メール構成ウィザードを使用して、アカウントを 1 つだけ含む新しいプロファイルを作成します。次に、[テスト電子メールの送信] ダイアログ ボックスを使用し、このアカウントでメールを送信します。

  3. データベース メールから返されたエラー メッセージを表示するには、次のステートメントを実行します。

    SELECT * FROM msdb.dbo.sysmail_event_log;
    

    データベース メールでは、メールが SMTP メール サーバーに正常に配信されると、メールが送信されたと見なします。 その後、受信者の電子メール アドレスが無効であるなどのエラーが発生しメールが配信されなくても、データベース メールのログにはそのことが記録されません。

メール配信を再試行する

  1. SMTP サーバーに確実に到達できないためにデータベース メールが失敗していると判断した場合は、データベース メールが各メッセージの送信を試行する回数を増やすことで、正常なメール配信率を上げることができます。 データベース メール構成ウィザードを起動して、[システム パラメーターを表示または変更する] オプションを選択します。 または、プロファイルに関連付けるアカウント数を増やすこともできます。これにより、プライマリ アカウントからのフェールオーバー時には、フェールオーバー アカウントを使用して電子メールが送信されるようになります。

  2. [システム パラメーターの構成] ページの [アカウントの再試行回数] の 5 回、[アカウントの再試行間隔] の 60 秒という既定値は、SMTP サーバーに 5 分間到達できないと、メッセージの配信に失敗することを意味しています。 この 2 つのパラメーター値を増加することで、メッセージの配信に失敗するまでの時間を長くすることができます。

    多数のメッセージが送信されている場合、大きな既定値を使用すると信頼性が向上する可能性がありますが、何度も配信しようとすると、リソースの使用が大幅に増加します。 ネットワークや SMTP サーバーに、データベース メールから SMTP サーバーへの即時アクセスを妨害するような問題があれば、それを解決することで、根本的な問題点に対処してください。

msdb で サービス ブローカーが有効になっていることを確認します。

データベース メールでは、msdb データベースに対して Service Broker を有効にする必要があります。 次の T-SQL スクリプトを使用して、サービス ブローカーが msdb で有効になっているかどうかを確認します。

SELECT is_broker_enabled FROM sys.databases WHERE name = 'msdb' ; -- should be 1

有効になっていない場合は、サービス ブローカーを有効にする必要があります。 次のサンプル スクリプトでは、 msdb システム データベースへの排他的アクセスが必要であるため、一般的な営業時間中に実行できない場合があります。 詳細については、ALTER DATABASE ... SET ENABLE_BROKER に関するページを参照してください。

ALTER DATABASE msdb SET ENABLE_BROKER;