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 : Sybase Replication Server - Guide pratique, aide-mémoire
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èrestop_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.