Como posso capturar e receber notificações sobre eventos de erro na minha instância do RDS para SQL Server?

5 minuto de leitura
0

Quero gerar e capturar eventos de erros em uma instância de banco de dados do Amazon Relational Database Service (Amazon RDS) para SQL Server. Também quero ser notificado sempre que um evento de erro ocorrer. Como posso fazer isso?

Descrição breve

O SQL Server usa tratamento de erros para resolver erros de existência de objetos e erros de tempo de execução em um código T-SQL. Para lidar com erros como esses, use os métodos TRY e CATCH. Em seguida, use o comando RAISERROR para gerar erros de clientes e gerar exceções.

Resolução

Use os métodos TRY e CATCH

1.    Use uma instrução TRY e CATCH para definir um bloco de código para testes de erros. Qualquer código que você incluir entre BEGIN TRY e END TRY será monitorado quanto a erros no momento da execução. Sempre que um erro ocorrer no bloco, ele será transferido para a sessão CATCH. Então, a ação será executada em função do código existente no bloco CATCH. Dependendo do problema, é possível corrigir o erro, reportá-lo ou registrá-lo nos logs de erros do SQL Server.

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

2.    Crie uma mensagem personalizada para gerar um erro do SQL Server quando ele ocorrer. Para fazer isso, adicione RAISERROR aos procedimentos do seu armazenamento ou a um SQL Server que deseja monitorar.

RAISERROR ( { msg_id | msg_str | @local_variable }

                         { , severity, state }

                         [ , argument [ , ...n ] ] )

                         [ WITH option [ , ...n ] ]

Exemplos dos métodos TRY e CATCH e RAISERROR Ao capturar erros usando os método TRY e CATCH, crie uma mensagem personalizada e, em seguida, transfira o erro para os logs de erros do SQL Server. Veja este exemplo:

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

Este é um exemplo de um erro gerado 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

Para monitorar o trabalho do agente do SQL Server, adicione um script à etapa para monitorar e gerar o erro nos logs de erros do SQL Server. Em seguida, você poderá usar esses logs para enviar notificações.

1.    Edite o trabalho do SQL Server e adicione a etapa. Para tipo, escolha T-SQL. Insira um nome de banco de dados e, em seguida, adicione esse 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

select @error = count(run_status) from @jb where run_status != 0

if @error > 0

RAISERROR('Automatic message from RDS for SQL Server Agent. Job test2 successful', 18,1) WITH LOG  --\will raise the error when job successful

else

RAISERROR('Automatic message from RDS for SQL Server Agent. Job test2 failed', 16,1) WITH LOG  --\will raise the error when job failed

2.    Configure o trabalho do SQL Server para ir até a etapa que criou para a seção Ação em caso de falha.

3.    Execute este procedimento para confirmar se o trabalho do SQL Server foi executado corretamente e atualizou os detalhes da falha do trabalho nos logs de erros do SQL Server. Para obter mais informações, consulte Visualizar logs do agente ou erros.

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

Exemplo nos logs de erros:

Msg 50000, Level 18, State 1, Line 33
Automatic message from RDS for SQL Server Agent. Job test2 failed
Msg 50000, Level 18, State 1, Line 29
Automatic message from RDS for SQL Server Agent. Job test2 successful

3.    Configure as notificações publicando os logs do SQL Server no Amazon CloudWatch. Modifique o SQL Server usando o console do Amazon RDS. Na seção de exportações de log, escolha os logs que deseja publicar nos logs do CloudWatch. Após publicar os logs do SQL Server no Amazon CloudWatch, é possível criar filtros de métricas para obter ajuda para pesquisar os logs. Os filtros de métricas definem os termos e padrões pelos quais o Amazon CloudWatch pesquisa os dados de log. Em seguida, os filtros de métricas transformam esses dados de log em métricas numéricas do CloudWatch para as quais é possível definir alarmes.

Como posso receber notificações do SNS sobre erros do Amazon RDS para SQL Server e eventos de logs de agente que correspondem a um padrão de filtro do CloudWatch?