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:
-
Faça login no SQL Server Management Studio (SSMS).
-
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.
-
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:
-
Faça login no SSMS.
-
Para tipo, escolha T-SQL.
-
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
-
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.
-
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?