Quiero generar y capturar eventos de error en mi instancia de base de datos de Amazon Relational Database Service (Amazon RDS) para SQL Server. También quiero recibir una notificación cuando se produzca un error.
Descripción corta
SQL Server utiliza la gestión de errores para resolver los errores de existencia de objetos y los errores de versión ejecutable en un código T-SQL. Para solucionar errores como estos, utiliza la construcción TRY...CATCH. A continuación, utiliza el comando RAISERROR para generar errores personalizados y excepciones. Para supervisar los registros de errores de SQL Server y recibir notificaciones sobre ellos, utiliza Registros de Amazon CloudWatch.
Resolución
Uso de la construcción TRY...CATCH y la instrucción RAISERROR
Sigue estos pasos:
-
Inicia sesión en SQL Server Management Studio (SSMS).
-
Utiliza la siguiente construcción TRY...CATCH para definir un bloque de código para la prueba de errores:
BEGIN TRY
--code to try
END TRY
BEGIN CATCH
--code to run if an error occurs
--is generated in try
END CATCH
Nota: statement_block supervisa el código que se incluye entre BEGIN TRY y END TRY para detectar errores en la versión ejecutable. Cuando se produce un error en el bloque, el error se transfiere a la sesión CATCH. A continuación, según el código del bloque CATCH, la instrucción ejecuta la acción. Según el problema, puedes corregir el error, informar sobre él o registrarlo en los registros de errores de SQL Server.
-
Crea un mensaje personalizado que genere un error de SQL Server cuando se produzca. Agrega la siguiente instrucción RAISERROR a los procedimientos del almacén o al SQL Server que desees supervisar:
RAISERROR ( { msg_id | msg_str | @local_variable }
{ , severity, state }
[ , argument [ , ...n ] ] )
[ WITH option [ , ...n ] ]
Ejemplo de la construcción TRY y CATCH y el 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, aparece el siguiente mensaje de error en los registros de SQL Server:
Error: 50000, Severity: 16, State: 1.
Divide by zero error encountered.
Supervisión de los registros de errores de SQL Server y envío de notificaciones
Agrega un script al paso de trabajo para supervisar el trabajo del agente de SQL Server y generar el error en los registros de errores de SQL Server. A continuación, puedes usar los registros de errores para enviar notificaciones.
Para editar el trabajo de agente de SQL Server, sigue estos pasos:
-
Inicia sesión en SSMS.
-
En Tipo, T-SQL.
-
Introduce un nombre de base de datos y, a continuación, agrega el siguiente T-SQL en la sección de comandos:
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
-
Configura el paso de trabajo anterior para ir a los pasos siguientes del trabajo en caso de éxito y en caso de error. Para obtener más información, consulta Establecimiento del flujo de éxito o error de los pasos de trabajo en el sitio web de Microsoft. Los pasos de trabajo en caso de éxito y en caso de error ejecutan el código anterior para comprobar si la ejecución se ha realizado correctamente o no. A continuación, el trabajo del agente genera un mensaje en el registro de errores de SQL Server que muestra si el trabajo se ha realizado correctamente o no.
-
Ejecuta el siguiente procedimiento para confirmar que el trabajo de SQL Server se ejecutó correctamente y actualizó los detalles del trabajo fallido en los registros de errores de SQL Server:
EXEC rdsadmin.dbo.rds_read_error_log @index = 0, @type = 1;
Para obtener más información, consulta Visualización de los registros de errores y agentes.
A continuación se muestra un ejemplo de los detalles del trabajo actualizados en los registros de errores:
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
Configuración de las notificaciones en Registros de CloudWatch
Para configurar las notificaciones en CloudWatch, consulta Publicación de registros de SQL Server en Registros de Amazon CloudWatch.
Después de publicar los registros de SQL Server en Registros de CloudWatch, puedes crear filtros de métricas que te ayuden a buscar en los registros. Los filtros de métricas convierten los datos de registro en métricas numéricas de CloudWatch para las que puedes configurar alarmas. Para obtener más información, consulta ¿Cómo puedo recibir notificaciones de SNS sobre los eventos de registro de agentes y errores de Amazon RDS para SQL Server que coincidan con un patrón de filtro de CloudWatch?