Saltar al contenido

¿Cómo puedo generar y capturar eventos de error en mi instancia de Amazon RDS para SQL Server?

5 minutos de lectura
0

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:

  1. Inicia sesión en SQL Server Management Studio (SSMS).

  2. 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.

  3. 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:

  1. Inicia sesión en SSMS.

  2. En Tipo, T-SQL.

  3. 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
  4. 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.

  5. 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?