HANDLECOLLISIONS | NOHANDLECOLLISIONS
Durée de validité
Réplication
Description
Utilisez les paramètres HANDLECOLLISIONS et NOHANDLECOLLISIONS pour déterminer si le processus Replicat tente ou non de résoudre les erreurs d'enregistrement en double et d'enregistrement manquant lors de l'application d'instructions SQL sur la cible. Ces erreurs, appelées collisions, surviennent lors d'un changement initial, lorsque les données provenant de tables source sont chargées vers les tables cible, pendant qu'Oracle GoldenGate réplique des modifications transactionnelles apportées à ces tables. Lorsque Oracle GoldenGate applique les modifications répliquées une fois le chargement terminé, HANDLECOLLISIONS fournit à la réplication une logique de traitement des erreurs pour ces collisions.
Vous pouvez utiliser HANDLECOLLISIONS et NOHANDLECOLLISIONS comme suit :
-
Vous pouvez activer
HANDLECOLLISIONSetNOHANDLECOLLISIONSde manière globale en les indiquant au niveau racine du fichier de paramètres. Un paramètre reste activé pour toutes les instructionsMAPsuivantes dans le fichier de paramètres, jusqu'à ce que le paramètre opposé soit rencontré. -
Vous pouvez activer
HANDLECOLLISIONSouNOHANDLECOLLISIONSdans un paramètreMAPspécifique afin d'activer ou de désactiver la gestion des erreurs uniquement pour ce mapping source-cible.
Les méthodes précédentes peuvent être combinées. Vous pouvez indiquer une règle de gestion des collisions globales, puis la remplacer par différentes règles de gestion des collisions dans les instructions MAP. Une spécification MAP remplace toujours la spécification globale.
Remarque : la gestion des erreurs du processus Replicat intégré n'est pas appropriée avec HANDLECOLLISIONS. Oracle recommande d'utiliser des méthodes d'instanciation précises au lieu d'utiliser HANDLECOLLISIONS.
HowHANDLECOLLISIONSWorks
L'exemple suivant explique le fonctionnement de HANDLECOLLISIONS :
-
Lorsque le processus Replicat rencontre une mise à jour vers une colonne qu'Oracle GoldenGate utilise en tant que clé, la gestion est la suivante :
-
Si la ligne avec l'ancienne clé est introuvable dans la cible, l'enregistrement de modification dans la trace est converti en insertion.
-
Si une ligne avec la nouvelle clé existe dans la cible, le processus Replicat supprime la ligne qui contient l'ancienne clé (elle n'existerait pas si la mise à jour avait été exécutée avec succès), puis la ligne avec la nouvelle clé est mise à jour en tant que superposition où les valeurs de trace remplacent les valeurs en cours.
Cette logique exige que toutes les colonnes de la table (et pas seulement celles qui ont été modifiées) soient consignées dans le journal des transactions, par défaut ou de force, par exemple en utilisant l'option
COLSdeADD TRANDATApour une base de données Oracle. Reportez-vous à Solutions possibles pour éviter les valeurs de colonne manquantes. -
-
Lorsque le processus Replicat rencontre une erreur d'enregistrement en double, l'enregistrement statique qui a été appliqué par le chargement initial est écrasé par l'enregistrement de modification dans la trace. Il est plus sûr de superposer la modification d'un point de vue opérationnel que d'ignorer l'erreur d'enregistrement en double.
-
La réplication avec
HANDLECOLLISIONSne supprime pas l'enregistrement de modification dans la trace, même si l'opération de mise à jour ou de suppression n'affecte pas une colonne de clé dans la source et que la réplication rencontre une erreur d'enregistrement manquante dans la cible. Ces erreurs se produisent lorsqu'un enregistrement est modifié sur le système source, puis qu'il est supprimé avant que les données de la table ne soient extraites par le traitement de chargement initial. Exemple :
-
L'application met à jour l'enregistrement A dans la source table1.
-
L'extraction extrait la mise à jour.
-
L'application supprime l'enregistrement A dans la source table1.
-
L'extraction extrait la suppression.
-
Oracle GoldenGate extrait les données de chargement initial à partir de la source table1, sans enregistrement A.
-
Oracle GoldenGate applique le chargement initial, sans l'enregistrement A.
-
Le processus de réplication tente d'appliquer la mise à jour de l'enregistrement A.
-
La base de données renvoie une erreur "record missing".
-
Le processus de réplication tente d'appliquer la suppression de l'enregistrement A.
-
La base de données renvoie une erreur "record missing".
Désactivez HANDLECOLLISIONS une fois les modifications transactionnelles capturées lors du chargement initial appliquées aux tables cible, de sorte que le processus Replicat ne gère pas automatiquement les erreurs suivantes. Les erreurs générées après la synchronisation initiale indiquent une condition anormale et doivent être évaluées par quelqu'un qui peut déterminer comment les résoudre. Par exemple, une erreur d'enregistrement manquant peut indiquer qu'un enregistrement qui existe sur le système source a été supprimé par inadvertance du système cible.
Vous pouvez désactiver HANDLECOLLISIONS de l'une des manières suivantes :
-
Arrêtez le processus Replicat et enlevez
HANDLECOLLISIONSdu fichier de paramètres du processus Replicat (cela peut entraîner une latence cible). Vous pouvez également modifier le fichier de paramètres pour ajouterNOHANDLECOLLISIONSavant les instructionsMAPpour lesquelles vous souhaitez désactiver le traitement des erreurs. -
Pendant l'exécution du processus Replicat, exécutez GGSCI, puis utilisez la commande
SEND REPLICATavec l'optionNOHANDLECOLLISIONSpour les tables que vous souhaitez affecter.Remarque : si vous utilisez
SEND REPLICAT, veillez à enleverHANDLECOLLISIONSdu fichier de paramètres ou à ajouter un paramètreNOHANDLECOLLISIONSavant de démarrer une autre exécution de processus Replicat, afin queHANDLECOLLISIONSne s'active plus.
Solutions possibles pour éviter les valeurs de colonne manquantes
Lorsqu'une base de données ne consigne pas toutes les valeurs de colonne d'une table source par défaut, des erreurs peuvent survenir si la table cible comporte des contraintes NOT NULL lorsque le processus Replicat tente de convertir une mise à jour de clé primaire en insertion. Vous pouvez contourner ce scénario de l'une des manières suivantes :
-
HANDLECOLLISIONSrequiert que la table ait une contrainte unique NOTNULLou NOTNULLsur la table cible. -
Utilisez le paramètre
NOCOMPRESSUPDATESdans le fichier de paramètres d'extraction pour envoyer toutes les colonnes de la table à la trace, et configurez la base de données pour qu'elle consigne toutes les valeurs de colonne. Par défaut, le processus Extract écrit uniquement la clé primaire et les colonnes qui ont été modifiées dans la trace (trail). Il s'agit de la méthode la plus sûre, car elle écrit les valeurs actuelles au moment où l'opération est effectuée et élimine le besoin d'extraction. -
Utilisez le paramètre
FETCHOPTIONSavec l'optionFETCHPKUPDATECOLSdans le fichier de paramètres d'extraction. Cette configuration entraîne l'extraction des colonnes non disponibles par le processus Extract lorsqu'une colonne de clé est mise à jour sur la source. Une extraction est la valeur en cours, pas nécessairement la valeur au moment d'une mise à jour particulière, ce qui peut entraîner des problèmes d'intégrité des données. Pour plus d'informations et des options d'extraction supplémentaires permettant de gérer les extractions ayant échoué, reportez-vous à"[FETCHOPTIONS](fetchoptions.html#GUID-DB7BCF87-E3E8-48CF-868A-A56F6D0B6A07)".
Si la base de données inclut toutes les colonnes par défaut, vous devez utiliser NOCOMPRESSUPDATES et NOCOMPRESSDELETES pour que HANDLECOLLISIONS fonctionne correctement. Si la base de données ne prend pas en charge NOCOMPRESSDELETES, vous devez utiliser FETCHOPTIONS MISSINGCOLS.
Pour plus d'informations sur les méthodes de chargement initial Oracle GoldenGate, reportez-vous à A propos de l'instanciation avec l'extraction de chargement initial.
Valeur par défaut
NOHANDLECOLLISIONS
Syntaxe
HANDLECOLLISIONS | NOHANDLECOLLISIONS [_ALLOWPKMISSINGROWCOLLISIONS]
[THREADS (<threadID>[, <threadID>][, ...][, <thread_range>[, <thread_range>][, ...])]
HANDLECOLLISIONS
Active la gestion des collisions.
_ALLOWPKMISSINGROWCOLLISIONS
Utilisez HANDLECOLLISIONS avec _ALLOWPKMISSINGROWCOLLISIONS pour ignorer les opérations UPDATE de clé primaire si la ligne cible correspondante n'existe pas.
Remarque : Les opérations ignorées peuvent entraîner une corruption des données. Reportez-vous à la description de cette rubrique.
NOHANDLECOLLISIONS
Désactive la gestion des collisions.
THREADS (<threadID>[, <threadID>][, ...][, <thread_range>[, <thread_range>][, ...])
Active HANDLECOLLISIONS pour les threads spécifiés. Lorsqu'il est utilisé dans une instruction HANDLECOLLISIONS globale au niveau racine du fichier de paramètres, HANDLECOLLISIONS est activé pour les threads indiqués, où qu'ils se trouvent dans toutes les instructions MAP où . Lorsqu'elle est utilisée dans une clause HANDLECOLLISIONS d'une instruction MAP, HANDLECOLLISIONS est activé uniquement pour cette instruction MAP.
threadID[, threadID][, …]
Indique un thread ID ou une liste de threads séparés par une virgule au format threadID, threadID, threadID.
thread_range[, thread_range][, …]
Indique une plage de threads au formatthreadIDlow-threadIDhigh ou une liste de plages délimitées par une virgule au formatthreadIDlow-threadIDhigh, threadIDlow-threadIDhigh.
Vous pouvez combiner ces formats. Par exemple, threadID, threadID, threadIDlow-threadIDhigh.
Exemples
Exemple 1
Cet exemple active HANDLECOLLISIONS pour toutes les instructions MAP du fichier de paramètres.
HANDLECOLLISIONS
MAP hr.emp, TARGET hr.emp;
MAP hr.job_hist, TARGET hr.job_hist;
MAP hr.dep, TARGET hr.dep;
MAP hr.country, TARGET hr.country;
Exemple 2
Cet exemple active HANDLECOLLISIONS pour certaines instructions MAP tout en la désactivant pour d'autres.
HANDLECOLLISIONS
MAP hr.emp, TARGET hr.emp;
MAP hr.job_hist, TARGET hr.job_hist;
NOHANDLECOLLISIONS
MAP hr.dep, TARGET hr.dep;
MAP hr.country, TARGET hr.country;
Exemple 3
Cet exemple illustre l'utilisation de base de HANDLECOLLISIONS dans une instruction MAP.
MAP dbo.tcust, TARGET dbo.tcust, HANDLECOLLISIONS;
Exemple 4
Cet exemple présente une combinaison d'utilisation globale et de niveau MAP. La spécification MAP remplace la spécification globale pour les tables indiquées.
HANDLECOLLISIONS
MAP hr.emp, TARGET hr.emp;
MAP hr.job_hist, TARGET hr.job_hist;
MAP hr.dep, TARGET hr.dep, NOHANDLECOLLISIONS;
MAP hr.country, TARGET hr.country, NOHANDLECOLLISIONS;
Exemple 5
Dans l'exemple suivant, HANDLECOLLISIONS est activé globalement pour toutes les instructions MAP, sauf pour le thread par défaut 0 dans la première instruction MAP et pour le thread 3 dans la deuxième instruction MAP.
HANDLECOLLISIONS
MAP fin.*, TARGET fin.*;
MAP sales.*, TARGET sales.*;
MAP orders.*, TARGET orders.*;
MAP scott.cust, TARGET scott.cust, NOHANDLECOLLISIONS;
MAP amy.cust, TARGET amy.cust, THREAD(3), NOHANDLECOLLISIONS;
Exemple 6
Dans cet exemple, HANDLECOLLISIONS est activé globalement, mais désactivé pour le thread 3. Les fils restants 1, 2 et 4 géreront les collisions.
HANDLECOLLISIONS
NOHANDLECOLLISIONS THREAD(3)
MAP scott.emplyees, TARGET scott.employees, THREADRANGE(1,4, OID);
MAP scott.inventory, TARGET scott.inventory, THREADRANGE(1,4, OID);
MAP scott.cust, TARGET scott.cust, THREADRANGE(1,4, OID);
Exemple 7
Dans cet exemple, HANDLECOLLISIONS est activé globalement, puis désactivé globalement pour les threads 5 à 7. Dans la première instruction de mapping, tous les threads gèrent les collisions, car le paramètre HANDLECOLLISIONS ne spécifie pas de thread ou de plage. Dans la deuxième instruction map, seuls les threads 4, 8 et 9 gèrent les collisions, car le paramètre NOHANDLECOLLISIONS global s'applique aux threads 5 à 7.
HANDLECOLLISIONS
NOHANDLECOLLISIONS THREADRANGE(5-7)
MAP scott.cust, TARGET scott.cust, THREADRANGE(4,9,OID), HANDLECOLLISIONS;
MAP scott.offices, TARGET scott.offices, THREADRANGE(4,9,OID);
MAP scott.emp, TARGET scott.emp, THREADRANGE(4,9,OID);
MAP scott.ord, TARGET scott.ord, THREADRANGE(4,9,OID);
MAP acct.*, TARGET acct.*;
MAP admin.*, TARGET admin.*;