¿Cómo se pueden capturar eventos de errores en la instancia de RDS para SQL Server y recibir notificaciones al respecto?

Actualización más reciente: 19 de octubre de 2022

Deseo generar y capturar eventos de errores en la instancia de base de datos de Amazon Relational Database Service (Amazon RDS) para SQL Server. También deseo recibir una notificación cada vez que se produzca un evento de error. ¿Cómo se puede hacer esto?

Descripción breve

SQL Server utiliza la gestión de errores para resolver los errores de existencia de objetos y los errores en tiempo de ejecución en un código T-SQL. Para gestionar este tipo de errores, utilice el método TRY y CATCH. Posteriormente, utilice el comando RAISERROR para generar errores de cliente y lanzar excepciones.

Resolución

Utilice el método TRY y CATCH

1.    Utilice una instrucción TRY y CATCH para definir un bloque de código a fin de realizar pruebas de errores. Cualquier código que se incluya entre BEGIN TRY y END TRY se supervisa en busca de errores en el momento de la ejecución. Cada vez que se produce un error en el bloque, se transfiere a la sesión CATCH. Así, en función del código del bloque CATCH, se realiza la acción. Según el problema, es posible solucionar el error, informar al respecto o registrarlo en los registros de errores de 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.    Cree un mensaje personalizado que genere un error de SQL Server cuando se produzca. Para ello, agregue RAISERROR a los procedimientos del almacén o a un servidor SQL que desee supervisar.

RAISERROR ( { msg_id | msg_str | @local_variable }

                         { , severity, state }

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

                         [ WITH option [ , ...n ] ]

Ejemplos del método TRY CATCH y RAISERROR Al capturar errores mediante el método TRY CATCH, cree un mensaje personalizado y, a continuación, genere el error en los registros de errores de SQL Server. Consulte este ejemplo:

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 es un ejemplo de un error generado en los registros de SQL Server:

Error: 50000, Severity: 16, State: 1.

  Divide by zero error encountered.

Supervise los registros de errores de SQL Server y envíe notificaciones

Para supervisar el trabajo del agente de SQL Server, agregue un script al paso para supervisar y generar el error en los registros de errores de SQL Server. Posteriormente, podrá utilizar estos registros para enviar notificaciones.

1.    Edite el trabajo de SQL Server y agregue el paso. Elija T-SQL como tipo. Ingrese un nombre de base de datos y, a continuación, agregue este 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

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 el trabajo de SQL Server de modo que vaya al paso que se creó para la sección Acción en caso de fallo.

3.    Ejecute este procedimiento para confirmar que el trabajo de SQL Server se ejecutó correctamente y actualizó los detalles sobre el trabajo fallido en los registros de errores de SQL Server. Para obtener más información, consulte Ver registros de errores y agentes.

EXEC rdsadmin.dbo.rds_read_error_log @index = 0, @type = 1;
Ejemplo en los registros de errores:
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.    Para configurar las notificaciones, publique los registros de SQL Server en Amazon CloudWatch. Modifique SQL Server mediante la consola de Amazon RDS. Elija los registros que desea publicar en los registros de CloudWatch desde la sección de exportaciones de registros. Después de publicar los registros de SQL Server en Amazon CloudWatch, podrá crear filtros de métricas que permitan realizar búsquedas en los registros. Los filtros de métricas definen los términos y patrones que Amazon CloudWatch busca en los datos de registro. A continuación, los filtros de métricas convierten estos datos de registro en métricas numéricas de CloudWatch sobre las que se pueden establecer alarmas.

Para obtener más información, consulte ¿Cómo se pueden recibir notificaciones de SNS sobre eventos de registro de errores y agentes de Amazon RDS para SQL Server que coincidan con un patrón de filtro de CloudWatch?


¿Le resultó útil este artículo?


¿Necesita asistencia técnica o con la facturación?