다음을 통해 공유


일반 데이터베이스 메일 문제 해결 단계

적용 대상: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_value 1이 아니면 데이터베이스 메일을 사용할 수 없습니다. 데이터베이스 메일은 악의적인 사용자의 공격에 사용할 수 있는 기능 수를 줄이기 위해 자동으로 사용하도록 설정되지 않습니다. 자세한 내용은 노출 영역 구성 이해를 참조하세요.

  2. 데이터베이스 메일을 사용하도록 설정하는 것이 적절하다고 판단되면 다음 코드를 실행합니다.

    sp_configure 'Database Mail XPs', 1; 
    GO
    RECONFIGURE;
    GO
    
  3. 고급 옵션을 표시하지 않는 sp_configure 프로시저를 기본 상태로 복원하려면 다음 코드를 실행합니다.

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

사용자가 메일을 보내도록 올바르게 구성되었나요?

  1. 데이터베이스 메일을 보내려면 사용자가 데이터베이스에서 DatabaseMailUserRole 데이터베이스 역할 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. 데이터베이스 메일을 보내려면 사용자가 하나 이상의 데이터베이스 메일 프로필에 액세스할 수 있어야 합니다. 액세스 권한이 있는 사용자(보안 주체) 및 프로필을 나열하려면 다음 문을 실행합니다.

    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;

참고 항목

결과 집합의 sysmail_help_queue_sp 길이 열을 사용하여 메일 큐의 전자 메일 수를 확인합니다.

문제가 일부 또는 모든 계정에 영향을 줍니다.

  1. 일부 프로필이 메일을 보낼 수 있는 것은 아니지만 일부 프로필이 메일을 보낼 수 있다고 판단한 경우 문제 프로필에서 사용하는 데이터베이스 메일 계정에 문제가 있을 수 있습니다. 메일을 성공적으로 보내는 데 성공한 계정을 확인하려면 다음 문을 실행합니다.

    SELECT sent_account_id, sent_date FROM msdb.dbo.sysmail_sentitems;
    
  2. 작동하지 않는 프로필이 나열된 계정을 사용하지 않는 경우 프로필에 사용할 수 있는 모든 계정이 제대로 작동하지 않을 수 있습니다. 개별 계정을 테스트하려면 데이터베이스 메일 구성 마법사를 사용하여 단일 계정으로 새 프로필을 만든 다음 테스트 전자 메일 보내기 대화 상자를 사용하여 새 계정을 사용하여 메일을 보냅니다.

  3. 데이터베이스 메일이 반환한 오류 메시지를 보려면 다음 문을 실행합니다.

    SELECT * FROM msdb.dbo.sysmail_event_log;
    

    참고 항목

    데이터베이스 메일은 메일이 SMTP 메일 서버로 배달되면 메일을 보낸 것으로 간주합니다. 이후 잘못된 수신인 전자 메일 주소와 같은 오류로 인해 메일이 배달되지 않더라도 데이터베이스 메일 로그에는 나타나지 않을 수 있습니다.

메일 배달 다시 시도

  1. SMTP 서버에 안정적으로 연결할 수 없어 데이터베이스 메일이 실패하는 것으로 확인되면 데이터베이스 메일이 각 메시지를 보내려고 시도하는 횟수를 늘려 성공적인 메일 배달 속도를 높일 수 있습니다. 데이터베이스 메일 구성 마법사를 시작하고 시스템 매개 변수 보기 또는 변경 옵션을 선택합니다. 또는 더 많은 계정을 프로필에 연결할 수 있으므로 기본 계정에서 장애 조치(failover)할 때 데이터베이스 메일은 장애 조치(failover) 계정을 사용하여 전자 메일을 보냅니다.

  2. 시스템 매개 변수 구성 페이지에서 계정 재시도 시도의 기본값은 5회, 계정 재시도 지연의 경우 60초입니다. 즉, SMTP 서버에 5분 안에 연결할 수 없는 경우 메시지 배달이 실패합니다. 이러한 매개 변수를 늘려 메시지 배달이 실패하기 전까지의 시간을 연장합니다.

    참고 항목

    기본값이 높아지면 안정성이 향상될 수 있으나 많은 메시지를 보낼 경우 계속해서 많은 메시지의 배달을 시도하므로 리소스 사용도 많아집니다. 데이터베이스 메일이 SMTP 서버에 즉시 연결되지 않도록 하는 네트워크 또는 SMTP 서버 문제를 해결하여 근본 문제를 해결합니다.

msdb에 대해 Service Broker가 사용하도록 설정되어 있는지 확인

데이터베이스 메일을 사용하려면 데이터베이스에 대해 Service Broker를 msdb 사용하도록 설정해야 합니다. 다음 T-SQL 스크립트를 msdb 사용하여 Service Broker를 사용할 수 있는지 확인합니다.

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;

다음 단계