Introduction
La suppression des exceptions rencontrées par Replication Server peut
s’avérer être une opération très délicate et dangereuse. En fonction du volume
des commandes SQL contenues dans une exception, la procédure stockée
rs_delexception
qui permet de supprimer une exception dans la base ASE RSSD
(Replication Server System Database) peut engendrer une saturation du journal
des transactions de la base RSSD.
Lorsque le journal des transactions RSSD est saturé par l’exécution de la
procédure stockée rs_delexception
, le système de réplication est
indisponible.
Cet article propose de comprendre le modèle des exceptions dans la base RSSD
de Sybase Replication Server ainsi que le stockage des exceptions dans les
tables rs_%
et donne une méthodologie et un script pour supprimer efficacement
les exceptions trop volumineuses en nombre de commandes SQL et qui peuvent
saturer le journal des transactions, mais aussi pour supprimer efficacement et
massivement des centaines de petites exceptions.
Le contexte du schéma de réplication de l’article est le suivant :
La suppression massive des exceptions dans une base RSSD Adaptive Server Enterprise est disponible dans le guide pratique Sybase Replication Server - §2 : Sybase Replication Server - Guide pratique, aide-mémoire
Les exceptions dans Replication Server
Retrouver la base RSSD associée à Replication Server (admin rssd_name)
Pour retrouver rapidement la base RSSD associée à un serveur Replication Server, deux options possibles :
- Utiliser la commande système
admin rssd_name
dans Replication Server. - Consulter le fichier de configuration de Replication Server qui stocke la localisation de la base RSSD.
Exemple avec la commande admin rssd_name :
admin rssd_name
DEC_D1_REP> admin rssd_name
RSSD Dataserver RSSD Database --------------- ------------------ RSD_D1_ASE DEC_D1_REP_RSSD
Exemple avec le fichier de configuration Replication Server :
Dans le contexte de cet article, le fichier de configuration de Replication
Server DEC_D1_REP.cfg
est stocké dans le répertoire
/Software/sybase/dba/DEC_D1_REP/cfg
. Les informations au sujet
de la base RSSD sont données avec les paramètres RSSD_%
dans ce fichier de
configuration
DEC_D1_REP.cfg
…
RSSD_server=RSD_D1_ASE
RSSD_database=DEC_D1_REP_RSSD
…
Écrire les exceptions dans la base RSSD (sysadmin log_first_tran)
Lorsqu’une exception est rencontrée par Sybase Replication Server vers une
destination pour une transaction, le message de cette exception (attempt to
insert duplicate key
, etc.) est consigné dans le fichier de log de Replication
Server et le process distributeur (DSI) vers la destination est alors
suspendu.
Exemple d’exception dans le fichier de log de Replication Server :
E. 2009/09/10 16:49:11. ERROR #1028 DSI EXEC(112(1) DEC_T5_ASE.idee) - dsiqmint.c
(3042)
Message from server: Message: 1204, State 2, Severity 17 -- 'ASE has run
out of LOCKS. Re-run your command when there are fewer active users, or contact a
user with System Administrator (SA) role to reconfigure ASE with more LOCKS.
'.
H. 2009/09/10 16:49:11. THREAD FATAL ERROR #5049 DSI EXEC(112(1) DEC_T5_ASE.idee)
- dsiqmint.c(3049)
The DSI thread for database 'DEC_T5_ASE.idee' is being shutdown. DSI rece
ived data server error #1204 which is mapped to STOP_REPLICATION. See logged data
server errors for more information. The data server error was caused by output c
ommand #1 mapped from input command #50009 of the failed transaction.
I. 2009/09/10 16:49:11. The DSI thread for database 'DEC_T5_ASE.idee' is shutdown
La commande admin who_is_down
lancée dans Replication Server montre
effectivement que le process distributeur (DSI) est dans l’état suspendu
(suspended
).
admin who_is_down
DEC_D1_REP > admin who_is_down
Spid Name State Info ---- ---------- -------------------- ---------------------------------------- DSI EXEC Suspended 118(1) DEC_T5_ASE.idee DSI Suspended 118 DEC_T5_ASE.idee
Le message dans le fichier de log de Replication Server ne donne pas
toujours la raison détaillée de l’exception levée et notamment l’ordre ou les
ordres SQL en échec. Seule la commande système Replication Server sysadmin
log_first_tran
permet de demander à Replication Server d’écrire l’exception
dans sa base RSSD pour pouvoir visualiser l’ordre ou les ordres SQL associé(s)
à l’exception.
sysadmin log_first_tran, dataserver, database
DEC_D1_REP > sysadmin log_first_tran, DEC_T5_ASE, idee
The first transaction for database 'DEC_T5_ASE.idee' has been logged into the exceptions log
Visualiser la liste et le détail des exceptions (rs_helpexception)
La procédure stockée rs_helpexception
dans la base RSSD permet de visualiser
la liste des exceptions stockées ou le détail d’une exception stockée :
execute rs_helpexception [XactID [,v]]
Sans argument, rs_helpexception
liste très sommairement la liste des
exceptions :
RSD_D1_ASE.DEC_D1_REP_RSSD> execute rs_helpexception RSD_D1_ASE.DEC_D1_REP_RSSD> go
Summary of Logged Transactions on 'DEC_D1_REP' Total # of Logged Transactions = 2 Xact ID Org Site Org User Org Date Dest Site # Recs/Xact ----------- --------------- -------- ----------- --------------- ----------- 112 DEC_T1_ASE.idee ideemgr Sep 10 2009 DEC_T5_ASE.idee 3 113 DEC_T1_ASE.idee ideemgr Sep 10 2009 DEC_T5_ASE.idee 314420 For detailed information on a logged xact., type 'rs_helpexception {Xact ID}'
Dans l’exemple ci-dessus, la transaction 113 en échec en date du 10
septembre 2009 contient 314420 commandes SQL (# Recs/Xact
).
En appelant la procédure rs_helpexception
avec le numéro d’exception, le
détail de la transaction en échec est donné avec le site d’origine, le site de
destination, l’utilisateur, la date et l’heure de la transaction validée
(Commit Date
), etc.
RSD_D1_ASE.DEC_D1_REP_RSSD> execute rs_helpexception 113 RSD_D1_ASE.DEC_D1_REP_RSSD> go
Detailed Summary of Logged Transaction # 113 on 'DEC_D1_REP' Origin Site Origin User Org. Commit Date #Cmds in Xact ------------------------------ --------------- ----------------- ------------- DEC_T1_ASE.idee ideemgr Sep 10 2009 3:56 314420 Dest. Site Dest. User Date Logged ------------------------------ --------------- ----------------- DEC_T5_ASE.idee idee_maint Sep 11 2009 4:47 This transaction was logged by the 'sysadmin log_first_tran' command.
En donnant en plus l’argument v
(verbose) en plus du numéro de l’exception,
le détail des commandes SQL dans la transaction en échec est affiché.
RSD_D1_ASE.DEC_D1_REP_RSSD> execute rs_helpexception 113,v RSD_D1_ASE.DEC_D1_REP_RSSD> go
... A0126 05iso_1distribute 2 ~"!,3 1 applied ~!6INSTRUMENT_idee_dect1.~!*rs_update yielding min_before ~$)INST_NUM=~%'623819, ~$-INST_EXT_COD=~",L_SO433BF8F after ~$-INST_EXT_COD=NULL update INSTRUMENT set INST_EXT_COD=NULL where INST_NUM=623819 A0126 05iso_1distribute 2 ~"!,3 1 applied ~!6INSTRUMENT_idee_dect1.~!*rs_update yielding min_before ~$)INST_NUM=~%'623820, ~$-INST_EXT_COD=~"*SO433BF83 after ~$-INST_EXT_COD=NULL update INSTRUMENT set INST_EXT_COD=NULL where INST_NUM=623820 A0126 05iso_1distribute 2 ~"!,3 1 applied ~!6INSTRUMENT_idee_dect1.~!*rs_update yielding min_before ~$)INST_NUM=~%'623821, ~$-INST_EXT_COD=~"*SO433BF84 after ~$-INST_EXT_COD=NULL update INSTRUMENT set INST_EXT_COD=NULL where INST_NUM=623821
Supprimer les exceptions (rs_delexception)
La procédure stockée rs_delexception
dans la base RSSD supprime une
exception à partir de son numéro (Xact ID) :
exec rs_delexception XactID
RSD_D1_ASE.DEC_D1_REP_RSSD> execute rs_delexception 112 RSD_D1_ASE.DEC_D1_REP_RSSD> go
Deleting 3 commands in logged transaction # 112 on 'DEC_D1_REP' Logged transaction # 112 successfully deleted. Truncate RSSD transaction log if necessary. (return status = 0)
Une seule exception à la fois peut être supprimée avec la procédure
rs_delexception
, ce qui peut être très rébarbatif lorsqu’il y a une centaine
d’exceptions à supprimer. Le script donné plus loin permet d’automatiser la
suppression massive des exceptions.
Sans paramètre XactID
, la liste des exceptions est retournée comme avec la
procédure rs_helpexception
avec la consigne de préciser XactID
.
RSD_D1_ASE.DEC_D1_REP_RSSD> execute rs_delpexception RSD_D1_ASE.DEC_D1_REP_RSSD> go
Summary of Logged Transactions on 'DEC_D1_REP' Total # of Logged Transactions = 2 Xact ID Org Site Org User Org Date Dest Site # Recs/Xact ----------- --------------- -------- ----------- --------------- ----------- 112 DEC_T1_ASE.idee ideemgr Sep 10 2009 DEC_T5_ASE.idee 3 113 DEC_T1_ASE.idee ideemgr Sep 10 2009 DEC_T5_ASE.idee 314420 To delete a specific logged xact., type 'rs_delexception {Xact ID}'
Le modèle des exceptions dans Replication Server
Les tables rs_% de la base RSSD impliquées dans le stockage des exceptions
4 tables rs_%
dans la base RSSD stockent les exceptions :
rs_exceptscmd
rs_exceptshdr
rs_exceptslast
rs_systext
Une transaction XactID
dans les exceptions Replication Server est toujours
identifiée par une valeur binaire de type binary(8)
.
Correspondance entre le numéro d’exception (XactID) et sys_trans_id
Les colonnes sys_trans_id
sont de type binary(8)
. Les types binary
stockent
des données semblables aux données hexadécimales, données constituées d’un
préfixe "0x
" suivi d’une chaîne de chiffres et des lettres.
Ces chaînes sont interprétées différemment selon les plates-formes (little
endian/big endian
). Par exemple, la chaîne "0x0000100
" représente 65536 sur des
machines considérant l’octet 0 comme le plus significatif et 256 sur des
machines le considérant comme le moins significatif.
Pour déterminer si l’octet 0 est le plus ou le moins significatif :
RSD_D1_ASE.DEC_D1_REP_RSSD> select convert(int,0x0000100)
256
Dans le contexte de cet article, il s’agit de plateformes SPARC Solaris 9 64 bits, l’octet 0 est le moins significatif.
La requête exemple ci-dessous, en fonction de la signification de l’octet 0
sur la plateforme, permet de traduire les valeurs des colonnes sys_trans_id
dans les tables rs_exceptshdr
et rs_exceptscmd
en identifiant d’exception
XactId
:
if (convert(int, 0x0000100) = 65536) begin select "Xact ID" = convert(int, reverse(substring(sys_trans_id, 5, 8))) from rs_exceptshdr end else begin select "Xact ID" = convert(int, substring(sys_trans_id, 5, 8)) from rs_exceptshdr end
Xact ID ----------- 113
Dans la suite de cet article, seule la commande convert(int,
substring(sys_trans_id, 5, 8))
est exécutée pour retrouver XactID
. Le code est
à adapter en fonction de la plateforme utilisée.
rs_exceptshdr, informations générales sur les exceptions
La table rs_exceptshdr
stocke les informations générales d’une transaction
en échec (site d’origine, site de destination…). Une transaction en échec est
identifiée de manière unique par son identifiant système de transaction
sys_trans_id
:
select "XactID" = convert(int, substring(sys_trans_id, 5, 8)) , orig_site, orig_db, orig_time, error_site, error_db , log_time, log_reason from rs_exceptshdr go
XactID orig_site orig_db orig_time error_site error_db log_time log_reason ------ ---------- ------- ------------------- ---------- -------- ------------------- ---------- 113 DEC_T1_ASE idee Sep 10 2009 3:56PM DEC_T5_ASE idee Sep 11 2009 4:47PM D
La colonne log_reason
dans la table rs_exceptshdr
explique l’action qui a
enregistré l’exception dans la base RSSD (sysadmin log_first_tran, resume
connection
…).
log_reason | Raison de l’enregistrement de l’exception |
---|---|
O |
Transaction automatiquement enregistrée car orpheline dans la queue du DSI |
E |
Transaction qui a généré une erreur sur la cible et qui est associée
à l’option LOG ou RETRY_LOG |
S |
Transaction automatiquement enregistrée car écartée avec une commande
resume connection avec l’option skip transaction |
D |
Transaction enregistrée avec la commande sysadmin log_first_tran |
rs_exceptscmd et rs_systext : textes SQL et commandes source et de sortie (source command, output command)
Les textes SQL d’une exception sont stockés dans la colonne textval
varchar(255)
de la table rs_systext
.
La table rs_systext
ne contient pas la colonne sys_trans_id
pour retrouver
directement l’identifiant XactID
. Il faut réaliser une jointure entre la
colonne parentid
de la table rs_systext
et la colonne cmd_id
de la table
rs_exceptscmd
, table qui contient la colonne sys_trans_id
.
select top 6 "XactID" = convert(int, substring(sys_trans_id, 5, 8)), src_cmd_line, cmd_type, texttype, sequence, textval from rs_systext, rs_exceptscmd where cmd_id = parentid
XactID src_cmd_line cmd_type texttype sequence textval ----------- ------------ -------- -------- -------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 113 1 S C 1 A0126 05iso_1distribute 1 ~";Sep 10 2009 3:56:46:880PM,2 ~"!,3 1 begin transaction ~"%_upd npw ~"(ideemgr 113 1 L C 1 begin transaction 113 2 S C 1 A0126 05iso_1distribute 2 ~"!,3 1 applied ~!6INSTRUMENT_idee_dect1.~!*rs_update yielding min_before ~$)INST_NUM=~%#10, ~$-INST_EXT_COD=~"*250010000 after ~$-INST_EXT_COD=NULL 113 2 L C 1 update INSTRUMENT set INST_EXT_COD=NULL where INST_NUM=10 113 3 S C 1 A0126 05iso_1distribute 2 ~"!,3 1 applied ~!6INSTRUMENT_idee_dect1.~!*rs_update yielding min_before ~$)INST_NUM=~%#11, ~$-INST_EXT_COD=~"*260350000 after ~$-INST_EXT_COD=NULL 113 3 L C 1 update INSTRUMENT set INST_EXT_COD=NULL where INST_NUM=11
Les types de commande cmd_type
dans la table rs_exceptscmd
peuvent avoir
trois valeurs possibles :
cmd_type |
|
---|---|
S |
Commande source : texte de la transaction envoyé par l’agent de réplication et reçu par Replication Server. |
L |
Commande de sortie : texte de la transaction préparée par Replication
Server pour la base de données cible à partir des fonctions chaînes
(function strings ). |
RPC |
Commande de sortie RPC (Remote procedure call). |
Lorsqu’un texte SQL dépasse la capacité de la colonne textval
dans la table
rs_systext
, une nouvelle entrée est créée dans la table rs_systext
avec un
numéro pour la colonne sequence incrémenté.
Dans la table rs_systext
, la colonne texttype
est toujours à C
.
Il ne faut surtout pas manipuler les lignes pour lesquelles texttype
est définie à O
ou S
.
texttype |
|
---|---|
C |
Commande SQL pour une exception. |
S |
Modèle d’entrée d’une chaîne fonction (function string ). |
O |
Modèle de sortie d’une chaîne fonction (function string ).
Exemple :
|
rs_exceptslast
La table rs_exceptslast
dans le modèle des exceptions de la base RSSD est
indépendante des tables rs_exceptshdr, rs_exceptscmd
et rs_systext
.
La table rs_exceptslast
stocke notamment les particularités de la dernière
transaction pour laquelle l’option "skip tran
" a été utilisée avec une commande
resume connection to DATASERVER.BASECIBLE
. L’option skip tran
doit être
utilisée à bon escient.
Une jointure entre la table rs_exceptslast
et la table rs_databases
rend compréhensible les données :
select (select dsname + "."+ dbname from rs_databases where dbid=a.error_db and dbname is not null) "DatabaseCible", (select dsname from rs_databases where dbid=a.origin and dbname is not null) "DataserverSource", (select dsname+ "."+ dbname from rs_databases where dbid=a.lorigin and dbname is not null) "LogicalSource", origin_time, log_time, status from rs_exceptslast a
DatabaseCible DataserverSource LogicalSource origin_time log_time status ---------------- ---------------- ------------------- ------------------ ------------------- ------ DEC_T5_ASE.idee DEC_T1_ASE L_DEC_T1_ASE.l_idee Dec 23 2009 2:27PM Dec 23 2009 2:28PM 0
Dans l’exemple ci-dessus, une transaction a été écartée ave l’option skip
tran
de la commande resume connection to DEC_T5_ASE.idee
.
La colonne status de la table rs_exceptslast
est très importante, car elle
permet de détecter les éventuelles pertes de transactions dans les files (loss
transactions in queues
). La colonne status
peut prendre 3 valeurs possibles
:
status |
|
---|---|
0 |
Valide : aucune transaction pour la base origine. |
1 |
Pertes détectées (losses ) : il faut déterminer dans ce cas si des
transactions ont été perdues pour la base origine. |
2 |
Rejet des messages après des pertes détectées. Des transactions ont été probablement perdues pour la base origine. |
Les transactions écartées avec l’option skip tran
ne sont pas considérées
comme perdues car elles sont enregistrées dans la base RSSD, c’est pourquoi la
colonne status est à 0
dans ce cas de figure.
En revanche, lorsque la colonne status
vaut 1 ou 2, le cas est gravissime
car il faut envisager une éventuelle corruption dans les files (ou queues) du
moteur Replication Server.
Requêtes utiles d’extraction des commandes SQL des exceptions
Extraction du nombre de commandes SQL dans une exception
La colonne src_cmd_line
dans la table rs_exceptscmd
donne le nombre de
commandes SQL pour une exception XActID
donnée en recherchant la valeur
maximale :
declare @xactid int select @xactid=113 select max(src_cmd_line) from rs_exceptscmd exc where (case (select convert(int, 0x0000100)) when 65536 then convert(int, reverse(substring(sys_trans_id, 5, 8))) else convert(int, substring(sys_trans_id, 5, 8)) end ) = @xactid group by sys_trans_id
----------- 314420
Le nombre de commandes SQL dans une exception est un critère important pour
décider d’utiliser ou non la procédure stockée rs_delexception
afin de ne pas
saturer le journal des transactions de la base RSSD.
Extraction des commandes SQL d’une exception
Pour extraire les requêtes SQL d’une exception, il suffit donc d’interroger
la colonne rs_systext
pour la transaction XActId
associée à l’exception :
declare @xactid int
select @xactid = 113
select
textval
from rs_systext, rs_exceptscmd
where cmd_id = parentid
and texttype='C'
and cmd_type='L'
and (case (select convert(int, 0x0000100))
when 65536 then convert(int, reverse(substring(sys_trans_id, 5, 8)))
else convert(int, substring(sys_trans_id, 5, 8))
end
) = @xactid
order by src_cmd_line,sequence
La requête ci-dessus fonctionne très bien lorsqu’aucune commande SQL dans la
transaction ne dépasse la longueur de la colonne textval
qui est dimensionnée à
varchar(255)
. Dans le cas d’une commande SQL dépassant les 255 caractères, un
saut de ligne coupe la commande SQL.
Pour aller plus loin au sujet de l’extraction des commandes SQL d’une exception dans un fichier exploitable, consulter l’article : Extraction et exploitation des exceptions Replication Server
Supprimer efficacement les exceptions dans Replication Server
Problème pouvant survenir lors de la suppression des exceptions (transaction log almost full)
Lors de la suppression des exceptions avec rs_delexception
, lorsque le
nombre de commandes SQL à supprimer dans l’exception est trop volumineux, la
taille du journal des transactions de la base RSSD peut s’avérer être
insuffisante. Une saturation du journal se produit alors :
Server Message: Number 7415, Severity 10 Line 1:
The transaction log in database DEC_D1_REP_RSSD is almost full.
Your transaction is being suspended until space is made available in the log.
Dans ce cas de figure, le système de réplication devient indisponible si le journal des transactions de la base RSSD est saturé !
La saturation provient des commandes delete sur les tables rs_systext
et
rs_exceptscmd
dans la procédure rs_delexception
:
delete rs_systext
from rs_exceptscmd exc,
rs_exceptshdr exh,
rs_systext sys
where exc.sys_trans_id = exh.sys_trans_id
and exc.cmd_id = sys.parentid
and sys.texttype = "C"
and exh.sys_trans_id = @systran
...
delete rs_exceptscmd
where sys_trans_id = @systran
Ce cas peut également se présenter lorsque de multiples appels de la
commande rs_delexception
sont réalisés pour supprimer de nombreuses petites
exceptions, multiples appels réalisés sans vider le journal des transactions
avec la commande dump tran <RSSD Database Name> with truncate_only
à
chaque appel. Le journal de la base RSSD a le temps d’être saturé avant que le
process système Checkpoint Sleeper ne puisse vider le journal régulièrement.
Suppression massive des exceptions volumineuses
Lorsqu’un doute existe sur la capacité du journal des transactions d’une base RSSD à supporter la suppression d’une exception volumineuse en nombre de commandes SQL, et afin de ne pas étendre le journal des transactions à des tailles délirantes, une méthode efficace permet de supprimer massivement les exceptions. Cette méthode n’est pas supportée et suppose 2 pré-requis très importants :
- La base RSSD n’est pas répliquée. Si la base RSSD est répliquée, il faut
s’assurer que les commandes
truncate table
soient répliquées. - Le système de réplication est mis en mode veille ou "quiesced" pendant la suppression massive des exceptions.
Dans le contexte de cet article, la base RSSD n’est pas répliquée.
Il est possible de d’effectuer cette manipulation sans mettre Replication Server en mode veille, cependant le risque n’est pas nul si une exception survient pendant l’opération.
Mise en mode veille ou "quiesced" du système de réplication (admin quiesce_check)
Afin de ne pas surcharger cet article, la procédure de mise en veille d’un moteur Replication Server n’est pas décrite ici : voir Procédure de mise en veille (mode quiesced) de Sybase Replication Server pour en savoir plus.
La commande admin quiesce_check
permet de vérifier la mise en veille du
système de réplication
admin quiesce_check
DEC_D1_REP > admin quiesce_check
La réponse de mise en veille effective doit être : Replication Server
<RS_Name> is quiesced
. Dans le cas contraire, un message indique la
raison.
Suppression massive des exceptions
Une fois le système de réplication en mode "quiesced" (ainsi aucune
exception ne peut survenir), les tables rs_exceptslast, rs_exceptshdr
et
rs_exceptscmd
sont vidées sans journalisation avec la commande truncate table
:
use DEC_D1_REP_RSSD
go
truncate table rs_exceptshdr
go
truncate table rs_exceptscmd
go
truncate table rs_exceptslast
go
Pour vider la table rs_systext
avec la commande truncate table
, les lignes
pour lesquelles texttype
ne valent pas C
sont tout d’abord sauvegardées dans
une table temporaire ayant la même structure que la table rs_systext
. Ces
lignes sauvegardées sont réinjectées dans la table rs_systext
une fois la
troncature réalisée.
use DEC_D1_REP_RSSD
go
select * into #rs_systext from rs_systext where texttype != 'C'
go
truncate table rs_systext
go
insert into rs_systext select * from #rs_systext
go
Remise en route du système de réplication (resume log transfer)
Le système de réplication est remis en route avec la commande resume log
transfer
de Replication Server : voir Procédure de mise en veille
(mode quiesced) de Sybase Replication Server pour en savoir plus sur la
suppression du mode veille.
Suppression efficace d’un nombre élevé de petites exceptions
La procédure stockée rs_delexception
est parfaitement adaptée pour supprimer
efficacement un nombre très élevé de petites exceptions. Toutefois les
multiples appels de la procédure rs_delexception
peuvent également saturer le
journal des transactions de la base RSSD si le process Checkpoint Sleeper n’a
pas le temps de vider le journal régulièrement durant les appels de la
procédure rs_delexception
.
Pour pallier à ce problème, chaque exécution de la procédure rs_delexception
est accompagnée d’une troncature du journal de la base RSSD : la méthode est
violente mais permet d’éviter tout risque d’indisponibilité pour le système de
réplication.
Dans le script shell ci-dessous en guise d’exemple, $EXCEPTSID
est la liste
des exceptions détectées à supprimer :
for iexcept in $EXCEPTSID
do
isql -U${SYB_USER} -S${REPSERVER} -D$[RSSD_DBNAME} -o ${LOG_FILE} EOF |grep -v '^Password
:'
${SYB_PASSWD}
rs_delexception $iexcept
go
dump tran $[RSSD_DBNAME} with truncate_only
go
EOF
done
Script rsdelexceptions.ksh
Le script rsdelexceptions.ksh
supprime massivement les exceptions dans une
base RSSD :
%> rsdelexceptions.ksh <RepServer> <Mode N(default)|F> [<Seuil (1000)>]
Le deuxième paramètre du script est le mode de suppression : N
(par défaut)
ou F
Mode | |
---|---|
N |
Mode de suppression normal. La procédure rs_delexception est
appliquée pour chaque exception avec troncature du journal des
transactions de la base RSSD après chaque appel.
Par défaut, toutes les exceptions contenant plus de 1000 commandes SQL
sont écartées en mode normal : le troisième paramètre applicable
uniquement en mode normal permet d’augmenter ce seuil de 1000 commandes
SQL. Le seuil est augmenté en fonction du dimensionnement du journal
des transactions de la base RSSD. |
F |
Mode de suppression forcée. Les tables rs_exceptshdr, rs_exceptslast,
rs_exceptscmd et rs_systext sont vidées selon la procédure décrite précédemment
(Suppression massive des exceptions).
Durant la suppression massive des exceptions, le moteur de réplication est mis en
veille (mode quiesced). |
Voici quelques exemples d’appel :
%> rsdelexceptions.ksh DEC_D1_REP F
%> rsdelexceptions.ksh DEC_D1_REP N
%> rsdelexceptions.ksh DEC_D1_REP N 5000
Les codes retour suivants sont :
0 | Suppression des exceptions réussie
|
1 | Suppression des exceptions réussie, mais des exceptions ont été
écartées, le seuil du nombre de commandes SQL ayant été atteint pour
une ou plusieurs exceptions à supprimer.
|
2 | La mise en mode veille du moteur de réplication est en échec (mode
quiesced).
|
3 | Erreur de syntaxe dans l’appel du programme.
|
La publication du script rsdelexceptions.ksh
n’est pas encore réalisée.