Comment capturer et recevoir des notifications relatives aux évènements d'erreur dans mon instance 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 Amazon Relational Database Service (Amazon RDS) pour l'instance de base de données SQL Server. Je souhaite également être alerté lorsqu'un événement d'erreur se produit. Comment procéder ?

Brève description

Le serveur SQL se sert de la fonctionnalité de gestion des erreurs pour résoudre les erreurs d'existence et de temps d'exécution dans un code T-SQL. Pour le traitement de telles erreurs, servez-vous des méthodes TRY et CATCH. Utilisez ensuite la commande RAISERROR pour générer des erreurs clients et lancer des exceptions.

Solution

Servez-vous de la méthode TRY et CATCH

1.    Pour définir un bloc de code de tests d'erreur, servez-vous d'une instruction TRY et CATCH. Tout code que vous incluez entre BEGIN TRY et END TRY fait l'objet d'un contrôle d'erreurs au moment de l'exécution. Lorsqu'une erreur se produit dans le bloc, elle est transférée vers la session CATCH. Ensuite, l'action est exécutée en fonction du code contenu dans le bloc CATCH. En fonction du problème, vous pouvez corriger l'erreur, la signaler ou l'enregistrer dans les journaux d'erreurs du serveur SQL.

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

2.    Créez un message personnalisé signalant une erreur SQL Server lorsqu'elle se produit. Pour ce faire, ajoutez RAISERROR à vos procédures de stockage ou à un serveur SQL que vous souhaitez surveiller.

RAISERROR ( { msg_id | msg_str | @local_variable }

                         { , severity, state }

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

                         [ WITH option [ , ...n ] ]

Exemples de la méthode TRY CATCH et de RAISERROR Lorsque vous capturez des erreurs via la méthode TRY CATCH, créez un message personnalisé, puis signalez l'erreur dans les journaux d'erreurs de SQL server. Consultez cet exemple :

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

Voici un exemple d'erreur signalée dans les journaux de SQL Server :

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

  Divide by zero error encountered.

Surveillez les journaux d'erreurs de SQL Server et envoyez des notifications.

Pour surveiller la tâche de l'agent de SQL Server, ajoutez un script à l'étape afin de surveiller et signalez l'erreur dans les journaux d'erreurs de SQL Server. Vous pouvez ensuite envoyer des notifications à l'aide de ces journaux.

1.    Modifiez votre tâche SQL Server et ajoutez l'étape. Pour le type, sélectionnez T-SQL. Entrez un nom de base de données, puis ajoutez ce T-SQL dans la section de commande :

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.    Configurez la tâche de SQL Server pour passer à l'étape que vous avez créée pour la section Action en cas d'échec.

3.    Exécutez cette procédure pour vérifier que la tâche SQL Server s'est correctement exécutée et a mis à jour les détails de l'échec de la tâche dans les journaux d'erreurs de SQL Server. Pour plus d'informations, consultez Affichage des journaux des erreurs et des agents.

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

Exemple dans les journaux d'erreurs :

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.    La configuration des notifications à travers la publication des journaux SQL Server sur Amazon CloudWatch. Modification du serveur SQL à l'aide de la console Amazon RDS. Dans la section Exportations de journaux, choisissez les journaux à publier dans les journaux CloudWatch. Après la publication des journaux SQL Server sur Amazon CloudWatch, vous pouvez créer des filtres métriques susceptibles d'effectuer des recherches dans les journaux. Les filtres métriques définissent les termes et les modèles qu'Amazon CloudWatch recherche dans les données de journal. Ensuite, les filtres de métriques transforment ces données de journal en métriques CloudWatch numériques pour lesquelles la définition des alarmes est possible.

Pour plus d'informations, consultez Comment recevoir des notifications SNS liées aux événements de journaux d'agent et d'erreur Amazon RDS for SQL Server correspondant à un schéma de filtre CloudWatch ?