Définir des actions spécifiques sur les exceptions avec les classes d'erreur de Sybase Replication Server

Introduction

Le contexte de la documentation concerne la réplication d'une base Sybase vers une base MS SQL Server 2000 avec le composant Sybase Direct Connect for MS SQL. Lorsque la connexion vers la cible MS SQL Server est tuée avec la commande kill, dans ce cas de figure le DSI de Replication Server vers la base MS SQL Server s'arrête.

E. 2006/06/14 16:40:07. ERROR #1028 DSI EXEC(197(1) minerva_dev.idee_sent) - dsiqmint.c(3042)
Message from server: Message: 30291, State 0, Severity 19
--
'[[Message Iteration=1|Data Source
Name=minerva_dev|SQLState=01000|Native
Error=32|Message=[DataDirect][ODBC SQL Server
Driver][libssclient20]ConnectionWrite (send()).
[MessageIteration=2|SQLState=08S01|Native Error=|
Message=[DataDirect][ODBC SQL Server Driver][libssclient20]General network error. Check your network
documentation.]'.
H. 2006/06/14 16:40:07. THREAD FATAL ERROR #5049 DSI EXEC(197(1) minerva_dev.idee_sent) - dsiqmint.c(3049)
The DSI thread for database 'minerva_dev.idee_sent' is being shutdown.
DSI received data server error #30291 which is mapped to STOP_REPLICATION.
See logged data server errors for more information. The data server error was
caused by output command #0 mapped from input command #1 of the failed transaction.
2006/06/14 16:40:07. The DSI thread for database 'minerva_dev.idee_sent' is shutdown. 

Dans certains cas, on souhaite plutôt que le DSI de Replication Server réeffectue plusieurs tentatives au lieu de s'arrêter net ainsi.

Pour mettre en œuvre cette approche, une classe d'erreur doit être mise en place au sein de Replication Server, classe d'erreur dans laquelle il sera spéficié que pour l'erreur 30291, plusieurs nouvelles tentatives doivent être faites par le DSI. C'est l'objectif de cette documentation.

La définition des classes d'erreur personnalisées est disponible dans le guide pratique Sybase Replication Server - §5 : Guide pratique et astuces Sybase Replication Server »

Création de la classe d'erreurs dcmssql_error_class (create error class)

Replication Server autorise une personnalisation de la gestion des erreurs des serveurs de données. Ceci est accompli par la création d'une classe d'erreurs pour une base de données en spécifiant les réponses à apporter pour chaque erreur que le serveur de données peut retourner.

Il est possible de définir une seule classe d'erreurs pour toutes les bases de données gérées par le même type de serveur de données. Par exemple, on peut utiliser la classe d'erreurs rs_sqlserver_error_class avec n'importe quelle base de données Adaptive Server définie dans Replication Server.

Il n'y a pas vraiment de nécessité à créer une nouvelle classe d'erreurs à moins que pour une base de données en particulier on ait impérativement besoin d'une gestion particulière pour certaines exceptions. Ce qui est notre cas pour l'erreur 30291 pour laquelle on désire avoir le mode RETRY et non le mode STOP_REPLICATION.

Pour créer une nouvelle classe d'erreurs, la commande RCL (Replication Server) ci-dessous est utilisée :

create error class error_class

Ainsi pour créer notre nouvelle classe d'erreur dcmssql_error_class dans Replication Server : :

DEC_T2_REP> create error class dcmssl_error_class
DEC_T2_REP> go
Error class 'dcmssql_error_class' is created.

Initialisation de la nouvelle classe d'erreurs avec rs_init_erroractions

Après avoir créé la nouvelle classe d'erreurs, cette dernière est initialisée avec les actions à partir d'une classe d'erreur comme la classe système standard rs_sqlserver_error_class, ce qui revient à dire que la nouvelle classe d'erreurs hérite des actions de la classe d'erreurs rs_sqlserver_error_class.

Pour effectuer cette initialisation, la procédure stockée rs_init_erroractions de la base RSSD est utilisée :

exec rs_init_erroractions new_error_class, template_class

Pour le cas pratique de cette documentation :

exec rs_init_erroractions dcmssql_error_class, rs_sqlserver_error_class
Initialization Succeeded.
1016 rows from Error Class 'rs_sqlserver_error_class' have initialized
Error Class 'dcmssql_error_class'.
(return status = 0)

L'initialisation revient en réalité à remplir la table rs_erroractions dans la base RSSD pour la nouvelle classe dcmssql_error_class.

Affichage des classes d'erreur (rs_helpclass)

La procédure stockée système rs_helpclass de la base RSSD affiche les différentes classes d'erreur (mais aussi les classes de fonctions, function strings) définie dans un système de réplication :

exec rs_helpclass <class_name>
exec rs_helpclass dcmssql_error_class
go
Function String Class(es)      PRS for CLASS                  Parent Class
------------------------------ ------------------------------ ------------------------
Error Class(es)                PRS for CLASS
------------------------------ ------------------------------
dcmssql_error_class            DEC_T2_REP

NOTE
-------------------------------------------------------------------
If the PRS for your system supplied class has been labeled 'Not YetDefined.'.
You may define it with -- create {function string | error}
class CLASS_NAME at the Primary Replication Server (PRS).

Affichage des actions relatives à une erreur (rs_helperror)

La procédure stockée rs_helperror dans la base RSSD affiche l'action prévue pour un numéro d'erreur :

exec rs_helperror server_error_number [, v] 

server_error_number est le numéro d'erreur. Lorsque l'option v est donnée, le message d'erreur ASE est également donné pour le numéro d'erreur spécifié.

Au sujet de l'erreur 30291 qui est au cœur de cette documentation :

exec rs_helperror 30291,v
DS Error Num Error Action              Error Class
------------ ------------------------- ------------------------------
       30291 Stop Replication          dcmssql_error_class
       30291 Stop Replication          rs_sqlserver_error_class

Warning: Error number 30291 does not exist in the SQL Server.

Le warning généré est tout à fait normal, car il s'agit d'un numéro d'erreur qui n'est pas donné par Sybase Adaptive Server Enterprise mais par Direct Connect for MSSQL.

Quoiqu'il en soit, pour l'erreur 30291 dans les classes d'erreur dcmssql_error_class et rs_sqlserver_error_class, la réplication a pour ordre d'arrêter le DSI (Stop Replication).

Personnalisation d'une action pour une erreur avec la commande assign action

La commande RCL « assign action » spécifie l'action à entreprendre pour une erreur donnée, ce qui revient à personnaliser le comportement de la réplication pour des numéros d'erreurs.

La syntaxe est la suivante :

assign action { ignore | warn | retry_log | log | retry_stop | stop_replication }
for error_class
to data_server_error [, data_server_error ] ...
  • ignore est l'action la moins sévère
  • stop_replication est la l'action la plus sévère

Il n'existe que six actions possibles avec Replication Server. Ces actions sont listées dans le tableau qui suit par ordre de sévérité (de la moins sévère à la plus sévère) :

Action Description
ignore Suppose que la commande est un succès et qu'il n y a pas d'erreur ou d'avertissement à prendre en compte.
warn Écrit un avertissement dans le fichier de log de Replication Server mais n'annule pas ou n'interrompt pas la transaction.
retry_log Annule la transaction et tente à nouveau cette dernière. Le nombre d'essais est gouverné par la commande configure connection. Si l'erreur persiste après tous les essais, la transaction est écrite dans la table des exceptions rs_exceptions et passe à la transaction suivante.
log Annule la transaction courante et consigne cette dernière dans la table des exceptions rs_exceptions, puis la transaction suivante est exécutée.
retry_stop Annule la transaction et tente à nouveau cette dernière. Le nombre d'essais est gouverné par la commande configure connection. Si l'erreur persiste après tous les essais, la réplication est suspendue vers la base de données en question.
stop_replication Annule la transaction courante et suspend la réplication vers la base de données. C'est l'équivalent de la commande suspend connection. C'est l'action par défaut.

Lorsqu'une transaction cause des erreurs multiples, Replication Server choisit toujours une seule action, la plus sévère dans tous les cas par défaut. Pour réassigner une erreur à une action par défaut, il suffit de réappliquer explicitement stop_replication pour cette erreur.

Dans le cas pratique de cette documentation :

assign action retry_stop for dcmssql_error_class to 30291
Error mapping is created.

Application d'une classe d'erreur pour une connexion

La commande RCL alter connection est alors utilisée pour affecter une classe d'erreurs à une connexion vers une base de données :

alter connection to minerva_dev.idee_sent
set error class to dcmssql_error_class
go
Connection to 'minerva_dev.idee_sent' is altered.
alter connection to minerva_uat.idee_sent
set error class to dcmssql_error_class
go
Connection to 'minerva_uat.idee_sent' is altered.

Les commandes resume / suspend sont nécessaires pour la prise en compte des modifications, mais dans le contexte de notre cas pratique, nous avons besoin d'augmenter le nombre d'essais, ce dernier est par défaut à 3. La commande alter connection est mise en œuvre pour augmenter le paramètre command_retry.

alter connection to minerva_uat.idee_sent
set command_retry to '10'
go
Config parameter 'command_retry' is modified. This change will not take
effect until the connection/route is restarted. A connection/route can be
restarted with the suspend and resume commands.
alter connection to minerva_dev.idee_sent
set command_retry to '10'
go
Config parameter 'command_retry' is modified. This change will not take
effect until the connection/route is restarted. A connection/route can be
restarted with the suspend and resume commands.
suspend connection to minerva_uat.idee_sent
go
suspend connection to minerva_dev.idee_sent
go
resume connection to minerva_uat.idee_sent
go
resume connection to minerva_dev.idee_sent
go

À l'issue de la personnalisation de l'erreur 30291, le fichier d'erreur de Replication Server montre alors clairement un mode RETRY_STOP pour cette erreur et non plus un mode STOP_REPLICATION :

W. 2006/06/15 15:49:18. WARNING #5091 DSI EXEC(197(1)
minerva_dev.idee_sent)
- dsiqmint.c(3169)

A transaction for database 'minerva_dev.idee_sent' failed. It will beretried
10 times. The data server error received (#30291) is mapped to RETRY_LOG or RETRY_STOP.