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 :

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 :

  1. L'application met à jour l'enregistrement A dans la source table1.

  2. L'extraction extrait la mise à jour.

  3. L'application supprime l'enregistrement A dans la source table1.

  4. L'extraction extrait la suppression.

  5. Oracle GoldenGate extrait les données de chargement initial à partir de la source table1, sans enregistrement A.

  6. Oracle GoldenGate applique le chargement initial, sans l'enregistrement A.

  7. Le processus de réplication tente d'appliquer la mise à jour de l'enregistrement A.

  8. La base de données renvoie une erreur "record missing".

  9. Le processus de réplication tente d'appliquer la suppression de l'enregistrement A.

  10. 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 :

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 :

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.*;