Ir para o conteúdo

Como faço para gerar e capturar eventos de erro na minha instância do Amazon RDS para SQL Server?

5 minuto de leitura
0

Quero gerar e capturar eventos de erro na minha instância de banco de dados Amazon Relational Database Service (Amazon RDS) para SQL Server. Também quero ser notificado quando ocorrer um evento de erro.

Breve descrição

O SQL Server usa o tratamento de erros para resolver erros de existência de objetos e erros de runtime em um código T-SQL. Para solucionar erros como esses, use o constructo TRY...CATCH. Em seguida, use o comando RAISERROR para gerar erros personalizados e gerar exceções. Para monitorar os logs de erros do SQL Server e receber notificações sobre eles, use o Amazon CloudWatch Logs.

Resolução

Use o constructo TRY... CATCH e a instrução RAISERROR

Conclua as etapas a seguir:

  1. Faça login no SQL Server Management Studio (SSMS).

  2. Use o seguinte constructo TRY... CATCH para definir um bloco de código para teste de erro:

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

    Observação: a statement_block monitora o código que você inclui entre BEGIN TRY e END TRY em busca de erros em runtime. Quando ocorre um erro no bloco, o erro é transferido para a sessão CATCH. Então, dependendo do código no bloco CATCH, a instrução executa a ação. Dependendo do problema, é possível corrigir o erro, reportar o erro ou registrá-lo nos logs de erros do SQL Server.

  3. Crie uma mensagem personalizada que gere um erro do SQL Server quando ele ocorrer. Adicione a seguinte instrução RAISERROR aos procedimentos de armazenamento ou ao SQL Server que você deseja monitorar:

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

    Exemplo de constructo TRY e CATCH e comando 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

    Como resultado, ele gera a seguinte mensagem de erro nos logs do SQL Server:

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

Monitore os logs de erros do SQL Server e envie notificações

Adicione um script à etapa do trabalho para monitorar o trabalho do agente do SQL Server e gerar o erro nos logs de erros do SQL Server. Em seguida, é possível usar os logs de erros para enviar notificações.

Para editar seu trabalho de agente do SQL Server, conclua as seguintes etapas:

  1. Faça login no SSMS.

  2. Para tipo, escolha T-SQL.

  3. Insira um nome do banco de dados e adicione o seguinte T-SQL na seção de comando:

    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. Configure a etapa anterior do trabalho para ir para as próximas etapas do trabalho Em caso de sucesso e Em caso de falha. Para obter mais informações, consulte Definir fluxo de sucesso ou falha da etapa de trabalho no site da Microsoft. As etapas de trabalho Em caso de sucesso e Em caso de falha executam o código anterior para verificar se a execução foi bem-sucedida ou não. Em seguida, o trabalho do agente gera a mensagem no log de erros do SQL Server que mostra se o trabalho foi bem-sucedido ou falhou.

  5. Execute o procedimento a seguir para confirmar se a tarefa do SQL Server foi executada corretamente e atualizou os detalhes da tarefa que falhou nos logs de erros do SQL Server:

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

    Para obter mais informações, consulte Visualização de logs de erros e agentes.
    Veja a seguir um exemplo dos detalhes atualizados do trabalho nos logs de erros:

    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

Configurar notificações no CloudWatch Logs

Para configurar notificações no CloudWatch, consulte Publicação de logs do SQL Server no Amazon CloudWatch Logs.

Depois de publicar os logs do SQL Server no CloudWatch Logs, é possível criar filtros métricos para ajudá-lo a pesquisar os logs. Os filtros métricos transformam os dados de log em métricas numéricas do CloudWatch para as quais é possível definir alarmes. Para obter mais informações, consulte Como posso receber notificações do SNS sobre erros do Amazon RDS para SQL Server e eventos de log do agente que correspondam a um padrão de filtro do CloudWatch?