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 ?