내용으로 건너뛰기

Amazon RDS for SQL Server 인스턴스에서 오류 이벤트를 발생시키고 캡처하려면 어떻게 해야 합니까?

4분 분량
0

Amazon Relational Database Service(Amazon RDS) for SQL Server DB 인스턴스에서 오류 이벤트를 발생시키고 캡처하려고 합니다. 또한 오류 이벤트가 발생하면 알림을 받고 싶습니다.

간략한 설명

SQL Server는 오류 처리를 사용하여 T-SQL 코드의 객체 존재 오류와 런타임 오류를 해결합니다. 이러한 오류를 해결하려면 TRY...CATCH 구문을 사용합니다. 그런 다음, RAISERROR 명령을 사용하여 사용자 지정 오류를 생성하고 예외를 발생시킵니다. SQL Server 오류 로그를 모니터링하고 이에 대한 알림을 받으려면 Amazon CloudWatch Logs를 사용합니다.

해결 방법

TRY...CATCH 구문과 RAISERROR 문 사용

다음 단계를 완료하십시오.

  1. SQL Server Management Studio(SSMS)에 로그인합니다.

  2. 다음 TRY...CATCH 구문을 사용하여 오류 테스트를 위한 코드 블록을 정의합니다.

    BEGIN TRY  
    
    --code to try  
    
    END TRY  
    
    BEGIN CATCH  
    
    --code to run if an error occurs  
    
    --is generated in try  
    
    END CATCH

    참고: statement_block은 런타임 시 BEGIN TRYEND TRY 사이에 포함된 코드의 오류를 모니터링합니다. 해당 블록에서 오류가 발생하면 오류는 CATCH 세션으로 전송됩니다. 그러면 CATCH 블록의 코드에 따라 명령문이 작업을 수행합니다. 문제에 따라 오류를 수정하거나 오류를 보고하거나 SQL Server 오류 로그에 오류를 기록할 수 있습니다.

  3. SQL Server 오류가 발생하면 이를 알리는 사용자 지정 메시지를 생성합니다. 모니터링하려는 스토어 프로시저 또는 SQL Server에 다음 RAISERROR 문을 추가하십시오.

    RAISERROR ( { msg_id | msg_str | @local_variable }  
    
    { , severity, state }  
    
    [ , argument [ , ...n ] ] )  
    
    [ WITH option [ , ...n ] ]

    TRY 및 CATCH 구문과 RAISERROR 명령의 예: 

    BEGIN TRY  
    
    SELECT 1/0  
    
    END TRY  
    
    BEGIN CATCH  
    
    DECLARE @Var VARCHAR(100)  
    
    SELECT ERROR_MESSAGE()  
    
    SELECT @Var = ERROR_MESSAGE()  
    
    RAISERROR(@Var, 16,1) WITH LOG  
    
    END CATCH

    그 결과, SQL Server 로그에 다음과 같은 오류 메시지가 표시됩니다.

    Error: 50000, Severity: 16, State: 1.  
    
    Divide by zero error encountered.

SQL Server 오류 로그 모니터링 및 알림 전송

작업 단계에 스크립트를 추가하여 SQL Server 에이전트 작업을 모니터링하고 SQL Server 오류 로그에 오류를 기록합니다. 그런 다음, 오류 로그를 사용하여 알림을 전송할 수 있습니다.

SQL Server 에이전트 작업을 편집하려면 다음 단계를 완료하십시오.

  1. SSMS에 로그인합니다.

  2. 유형으로 T-SQL을 선택합니다.

  3. 데이터베이스 이름을 입력한 후 명령 섹션에 다음 T-SQL을 추가합니다.

    DECLARE @name NVARCHAR(128)  
    
    select @name = name from msdb.dbo.sysjobs where job_id = $(ESCAPE_SQUOTE(JOBID));  
    
    -- Temporary table to store the data of the datafile with low free storage  
    
    DECLARE @jb TABLE ([step_id] int, [step_name] NVARCHAR(128), [message] NVARCHAR(4000), [run_status] int);  
    
    insert into @jb  
    
    select hist.step_id, hist.step_name, hist.message, hist.run_status  
    
    from msdb.dbo.sysjobhistory hist inner join  
    
    (select a.job_id  
    
    , convert(varchar(50),max(a.run_requested_date),112) as run_date  
    
    , replace(convert(varchar(50),max(a.run_requested_date),108), ':', '') as run_time  
    
    from msdb.dbo.sysjobs j inner join msdb.dbo.sysjobactivity a  
    
    on j.job_id = a.job_id  
    
    where j.name = @name  
    
    and a.run_requested_date is not null  
    
    group by a.job_id) ja  
    
    on hist.job_id = ja.job_id  
    
    and hist.run_date = ja.run_date  
    
    and hist.run_time >= ja.run_time  
    
    order by hist.step_id  
    
    declare @error int  
    
    declare @errormsg nvarchar(4000)  
    
    select @error = count(run_status) from @jb where run_status != 0  
    
    if @error > 0  
    
    begin  
    
    set @errormsg='Automatic message from RDS for SQL Server Agent - Job: "' + @name + '" succeed'  
    
    RAISERROR(@errormsg, -1,1) WITH LOG  
    
    end else  
    
    begin  
    
    set @errormsg='Automatic message from RDS for SQL Server Agent - Job: "' + @name + '" failed'  
    
    RAISERROR(@errormsg, 16,1) WITH LOG  
    
    end
  4. 성공 시실패 시 다음 작업 단계로 이동하도록 위의 작업 단계를 구성합니다. 자세한 내용은 Microsoft 웹 사이트에서 작업 단계 성공 또는 실패 흐름 설정을 참조하십시오. 성공 시실패 시 작업 단계에서는 이전 코드를 실행하여 실행 성공 여부를 확인합니다. 그러면 에이전트 작업이 SQL Server 오류 로그에 작업이 성공인지 또는 실패인지 보여주는 메시지를 표시합니다.

  5. 다음 프로시저를 실행하여 SQL Server 작업이 올바르게 실행되었고 실패한 작업의 세부 정보가 SQL Server 오류 로그에 업데이트되었는지 확인합니다.

    EXEC rdsadmin.dbo.rds_read_error_log @index = 0, @type = 1;

    자세한 내용은 오류 및 에이전트 로그 보기를 참조하십시오.
    다음은 오류 로그에서 업데이트된 작업 세부 정보의 예입니다.

    Automatic message from RDS for SQL Server Agent - Job: "jobtest-new" succeed    
    Error: 50000, Severity: 16, State: 1.  
    Automatic message from RDS for SQL Server Agent - Job: "jobtest-new" failed

CloudWatch Logs에서 알림 구성

CloudWatch에서 알림을 구성하려면 Amazon CloudWatch Logs에 SQL Server 로그 게시를 참조하십시오.

CloudWatch Logs에 SQL Server 로그를 게시한 후 로그 검색을 지원하는 지표 필터를 생성할 수 있습니다. 지표 필터는 경보를 설정할 수 있는 수치형 CloudWatch 지표로 로그 데이터를 변환합니다. 자세한 내용은 CloudWatch 필터 패턴과 일치하는 Amazon RDS for SQL Server 오류 및 에이전트 로그 이벤트에 대한 SNS 알림을 받으려면 어떻게 해야 합니까?를 참조하십시오.