Skip to content

Comment générer et capturer des événements d'erreur dans mon instance Amazon RDS for SQL Server ?

Lecture de 5 minute(s)
0

Je souhaite générer et capturer des événements d'erreur dans mon instance de base de données Amazon Relational Database Service (Amazon RDS) for SQL Server. Je souhaite également être averti lorsqu'un événement d'erreur se produit.

Brève description

SQL Server utilise la gestion des erreurs pour résoudre les erreurs d'existence d'objets et les erreurs d'exécution dans un code T-SQL. Pour résoudre de telles erreurs, utilisez la construction TRY...CATCH. Puis, utilisez la commande RAISERROR pour générer des erreurs personnalisées et lever des exceptions. Pour surveiller les journaux d'erreurs de SQL Server et recevoir des notifications les concernant, utilisez Amazon CloudWatch Logs.

Résolution

Utiliser la construction TRY... CATCH et l'instruction RAISERROR

Procédez comme suit :

  1. Connectez-vous à SQL Server Management Studio (SSMS).

  2. Utilisez la construction TRY...CATCH suivante pour définir un bloc de code destiné à tester les erreurs :

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

    Remarque : Le statement_block surveille le code que vous incluez entre BEGIN TRY et END TRY pour détecter les erreurs lors de l'exécution. Lorsqu'une erreur se produit dans le bloc, l'erreur est transférée vers la session CATCH. Puis, en fonction du code contenu dans le bloc CATCH, l'instruction exécute l'action. En fonction du problème, vous pouvez corriger l'erreur, signaler l'erreur ou journaliser l'erreur dans les journaux d'erreurs SQL Server.

  3. Créez un message personnalisé qui génère une erreur SQL Server lorsqu'elle se produit. Ajoutez l'instruction RAISERROR suivante à vos procédures de stockage ou à SQL Server que vous souhaitez surveiller :

    RAISERROR ( { msg_id | msg_str | @local_variable }  
    
    { , severity, state }  
    
    [ , argument [ , ...n ] ] )  
    
    [ WITH option [ , ...n ] ]

    Exemple de construction TRY et CATCH et de commande 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

    Par conséquent, le message d'erreur suivant apparaît dans les journaux SQL Server :

    Error: 50000, Severity: 16, State: 1.  
    
    Divide by zero error encountered.

Surveiller les journaux d'erreurs SQL Server et envoyer des notifications

Ajoutez un script à l'étape de tâche pour surveiller la tâche d'agent SQL Server et signaler l'erreur dans les journaux d’erreurs SQL Server. Vous pouvez ensuite utiliser les journaux d'erreurs pour envoyer des notifications.

Pour modifier votre tâche d’agent SQL Server, procédez comme suit :

  1. Connectez-vous à SSMS.

  2. Dans Type, choisissez T-SQL.

  3. Entrez un nom de base de données, puis ajoutez le code T-SQL suivant dans la section des commandes :

    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. Configurez l'étape de tâche précédente pour passer aux étapes de tâche suivantes En cas de réussite et En cas d'échec. Pour plus d'informations, consultez la page Définir le flux de réussite ou d'échec des étapes de tâche sur le site Web de Microsoft. Les étapes de tâche En cas de réussite et En cas d’échec exécutent le code précédent pour vérifier s'il s'agit d'une exécution réussie ou non. La tâche d'agent affiche ensuite le message dans le journal d’erreurs SQL Server qui indique si la tâche est un succès ou un échec.

  5. Exécutez la procédure suivante pour vérifier que la tâche SQL Server s'est correctement exécutée et mettez à jour les détails de la tâche ayant échoué dans les journaux d’erreurs SQL Server :

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

    Pour plus d'informations, consultez la section Consultation des journaux d’erreurs et de l’agent.
    Voici un exemple des détails de tâches mis à jour dans les journaux d'erreurs :

    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

Configurer les notifications dans CloudWatch Logs

Pour configurer les notifications dans CloudWatch, consultez la section Publication des journaux SQL Server sur Amazon CloudWatch Logs.

Après avoir publié les journaux SQL Server sur CloudWatch Logs, vous pouvez créer des filtres de métriques pour vous aider à effectuer des recherches dans les journaux. Les filtres de métriques transforment les données de journal en métriques CloudWatch numériques pour lesquelles vous pouvez définir des alarmes. Pour plus d’informations, consultez la section Comment puis-je recevoir des notifications SNS concernant les événements d’erreur et de journaux de l’agent Amazon RDS for SQL Server qui correspondent à un modèle de filtre CloudWatch ?