다음을 통해 공유


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

적용 대상: SQL Server Azure 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. 데이터베이스 메일을 보내려면 사용자는 msdb 데이터베이스에서 DatabaseMailUserRole 데이터베이스 역할의 구성원이어야 합니다. sysadmin 고정 서버 역할 및 msdb db_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) 계정을 사용하여 전자 메일을 보냅니다.

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

    참고 항목

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

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

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

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

사용하도록 설정되지 않았다면 Service Broker를 사용하도록 설정해야 합니다. 그러나 다음 샘플 스크립트에서는 msdb 시스템 데이터베이스에 대한 단독 액세스 권한이 필요하므로 일반적인 업무 시간 동안 실행하지 못할 수 있습니다. 자세한 내용은 ALTER DATABASE ... SET ENABLE_BROKER를 참조하세요.

ALTER DATABASE msdb SET ENABLE_BROKER;

다음 단계