HANDLECOLLISIONS | NOHANDLECOLLISIONS
Gültig für
Replicat
Beschreibung
Verwenden Sie die Parameter HANDLECOLLISIONS und NOHANDLECOLLISIONS, um zu steuern, ob Replicat versucht, Fehler bei doppelten Datensätzen und fehlenden Datensätzen beim Anwenden von SQL auf das Ziel zu beheben. Diese Fehler, die als Kollisionen bezeichnet werden, treten während eines erstmaligen Ladevorgangs bei Daten aus Quelltabellen in Zieltabellen auf, während Oracle GoldenGate Transaktionsänderungen repliziert, die an diesen Tabellen vorgenommen werden. Wenn Oracle GoldenGate die replizierten Änderungen anwendet, nachdem der Ladevorgang abgeschlossen ist, stellt HANDLECOLLISIONS Replicat mit Fehlerbehandlungslogik für diese Kollisionen bereit.
Sie können HANDLECOLLISIONS und NOHANDLECOLLISIONS wie folgt verwenden:
-
Sie können
HANDLECOLLISIONSundNOHANDLECOLLISIONSglobal aktivieren, indem Sie sie auf der Root-Ebene der Parameterdatei angeben. Ein Parameter bleibt für alle nachfolgendenMAP-Anweisungen in der Parameterdatei aktiviert, bis der gegnerische Parameter gefunden wird. -
Sie können
HANDLECOLLISIONSoderNOHANDLECOLLISIONSin einem bestimmtenMAP-Parameter aktivieren, um die Fehlerbehandlung nur für dieses Quell-Ziel-Mapping zu aktivieren oder zu deaktivieren.
Die vorhergehenden Methoden können kombiniert werden. Sie können eine globale Kollisionsbehandlungsregel angeben und diese Regel dann mit verschiedenen Kollisionsbehandlungsregeln in den MAP-Anweisungen außer Kraft setzen. Eine MAP-Spezifikation überschreibt immer die globale Spezifikation.
Hinweis: Fehlerbehandlung von integriertem Replicat ist mit HANDLECOLLISIONS nicht geeignet. Oracle empfiehlt, dass Sie genaue Instanziierungsmethoden verwenden, anstatt HANDLECOLLISIONS zu verwenden.
HowHANDLECOLLISIONSWorks
Im folgenden Beispiel wird erläutert, wie HANDLECOLLISIONS funktioniert:
-
Wenn Replicat auf eine Aktualisierung einer Spalte stößt, die Oracle GoldenGate als Schlüssel verwendet, wird wie folgt vorgegangen:
-
Wenn die Zeile mit dem alten Schlüssel nicht im Ziel gefunden wird, wird der Änderungsdatensatz im Trail in einen Einfügevorgang konvertiert.
-
Wenn eine Zeile mit dem neuen Schlüssel im Ziel vorhanden ist, löscht Replicat die Zeile mit dem alten Schlüssel (er wäre nicht vorhanden, wenn die Aktualisierung erfolgreich ausgeführt worden wäre), und dann wird die Zeile mit dem neuen Schlüssel als Overlay aktualisiert, wobei die Trailwerte die aktuellen Werte ersetzen.
Für diese Logik müssen alle Spalten in der Tabelle (nicht nur die Spalten, die geändert wurden) im Transaktionslog protokolliert werden, entweder standardmäßig oder mit Gewalt, z.B. mit der Option
COLSvonADD TRANDATAfür eine Oracle-Datenbank. Siehe Mögliche Lösungen zur Vermeidung fehlender Spaltenwerte. -
-
Wenn Replicat auf einen Duplikatdatensatzfehler stößt, wird der statische Datensatz, der beim ersten Laden angewendet wurde, vom Änderungsdatensatz im Trail überschrieben. Das Überlagern der Änderung ist betrieblich sicherer als das Ignorieren des Duplikatdatensatzfehlers.
-
Replicat mit
HANDLECOLLISIONSverwirft den Änderungsdatensatz im Trail nicht, selbst wenn sich der Aktualisierungs- oder Löschvorgang nicht auf eine Schlüsselspalte in der Quelle auswirkt und Replicat auf einen Fehler beim fehlenden Datensatz im Ziel trifft. Diese Fehler treten auf, wenn ein Datensatz im Quellsystem geändert wird und der Datensatz gelöscht wird, bevor die Tabellendaten beim erstmaligen Laden extrahiert werden. Beispiel:
-
Die Anwendung aktualisiert Datensatz A in Quelle table1.
-
Extrahiert die Aktualisierung.
-
Die Anwendung löscht Datensatz A in Quelle table1.
-
Extrahiert den Löschvorgang.
-
Oracle GoldenGate extrahiert Daten zum erstmaligen Laden aus Quelle table1 ohne Datensatz A.
-
Oracle GoldenGate wendet das erstmalige Laden ohne Datensatz A an.
-
Replicat versucht, die Aktualisierung von Datensatz A anzuwenden.
-
Die Datenbank gibt einen Fehler "Datensatz fehlt" zurück.
-
Replicat versucht, das Löschen von Datensatz A anzuwenden.
-
Die Datenbank gibt einen Fehler "Datensatz fehlt" zurück.
Deaktivieren Sie HANDLECOLLISIONS, nachdem die beim ersten Laden erfassten Transaktionsänderungen auf die Zieltabellen angewendet wurden, sodass Replicat nachfolgende Fehler nicht automatisch verarbeitet. Fehler, die nach der ersten Synchronisierung generiert wurden, weisen auf eine anormale Bedingung hin und sollten von einer Person ausgewertet werden, die bestimmen kann, wie sie gelöst werden sollen. Beispiel: Ein Fehler aufgrund eines fehlenden Datensatzes könnte darauf hinweisen, dass ein Datensatz, der im Quellsystem vorhanden ist, versehentlich aus dem Zielsystem gelöscht wurde.
Sie können HANDLECOLLISIONS wie folgt deaktivieren:
-
Stoppen Sie Replicat, und entfernen Sie
HANDLECOLLISIONSaus der Replicat-Parameterdatei (kann die Ziellatenz verursachen). Alternativ können Sie die Parameterdatei bearbeiten, umNOHANDLECOLLISIONSvor denMAP-Anweisungen hinzuzufügen, für die Sie die Fehlerbehandlung deaktivieren möchten. -
Führen Sie während der Ausführung von Replicat GGSCI aus, und verwenden Sie dann den Befehl
SEND REPLICATmit der OptionNOHANDLECOLLISIONSfür die Tabellen, die Sie beeinflussen möchten.Hinweis: Wenn Sie
SEND REPLICATverwenden, müssen SieHANDLECOLLISIONSaus der Parameterdatei entfernen oder einen ParameterNOHANDLECOLLISIONShinzufügen, bevor Sie eine weitere Replicat-Ausführung starten, sodassHANDLECOLLISIONSnicht erneut aktiviert wird.
Mögliche Lösungen, um fehlende Spaltenwerte zu vermeiden
Wenn eine Datenbank nicht standardmäßig alle Spaltenwerte einer Quelltabelle protokolliert, kann es zu Fehlern kommen, wenn die Zieltabelle NOT NULL-Constraints aufweist, wenn Replicat versucht, eine Aktualisierung eines Primärschlüssels in eine Einfügung zu konvertieren. Sie können dieses Szenario folgendermaßen umgehen:
-
HANDLECOLLISIONSerfordert, dass die Tabelle einen NOT-NULL-Primärschlüssel oder NOT-NULL-Eindeutigkeits-Constraint für die Zieltabelle aufweist. -
Verwenden Sie den Parameter
NOCOMPRESSUPDATESin der Extract-Parameterdatei, um alle Spalten der Tabelle an den Trail zu senden, und konfigurieren Sie die Datenbank so, dass alle Spaltenwerte protokolliert werden. Standardmäßig schreibt Extract nur den Primärschlüssel und die Spalten, die in den Trail geändert wurden. Dies ist die sicherste Methode, da sie die aktuellen Werte zum Zeitpunkt der Ausführung des Vorgangs schreibt und keine Daten abgerufen werden müssen. -
Verwenden Sie den Parameter
FETCHOPTIONSmit der OptionFETCHPKUPDATECOLSin der Extract-Parameterdatei. Bei dieser Konfiguration ruft Extract nicht verfügbare Spalten ab, wenn eine Schlüsselspalte in der Quelle aktualisiert wird. Ein Fetch ist der aktuelle Wert, nicht unbedingt der Wert zum Zeitpunkt einer bestimmten Aktualisierung, sodass Probleme mit der Datenintegrität auftreten können. Weitere Informationen und zusätzliche Fetch-Optionen zur Verarbeitung nicht erfolgreicher Fetch-Vorgänge finden Sie unter"[FETCHOPTIONS](fetchoptions.html#GUID-DB7BCF87-E3E8-48CF-868A-A56F6D0B6A07)".
Wenn die Datenbank standardmäßig alle Spalten enthält, müssen Sie NOCOMPRESSUPDATES und NOCOMPRESSDELETES verwenden, damit HANDLECOLLISIONS ordnungsgemäß funktioniert. Wenn die Datenbank NOCOMPRESSDELETES nicht unterstützt, müssen Sie FETCHOPTIONS MISSINGCOLS verwenden.
Weitere Informationen zu Oracle GoldenGate-Methoden zum erstmaligen Laden finden Sie unter Instantiating with Initial Load Extract.
Standard
NOHANDLECOLLISIONS
Syntax
HANDLECOLLISIONS | NOHANDLECOLLISIONS [_ALLOWPKMISSINGROWCOLLISIONS]
[THREADS (<threadID>[, <threadID>][, ...][, <thread_range>[, <thread_range>][, ...])]
HANDLECOLLISIONS
Ermöglicht Kollisionsbehandlung.
ALLOWPKMISSINGROWCOLLISIONS
Verwenden Sie HANDLECOLLISIONS mit _ALLOWPKMISSINGROWCOLLISIONS, um UPDATE-Vorgänge für Primärschlüssel zu überspringen, wenn die entsprechende Zielzeile nicht vorhanden ist.
Hinweis: Das Überspringen von Vorgängen kann zu Datenbeschädigungen führen. Siehe Beschreibung in diesem Thema.
NOHANDLECOLLISIONS
Schaltet das Kollisionshandling aus.
THREADS (<threadID>[, <threadID>][, ...][, <thread_range>[, <thread_range>][, ...])
Aktiviert HANDLECOLLISIONS für die angegebenen Threads. When used in a global HANDLECOLLISIONS statement at the root level of the parameter file, HANDLECOLLISIONS is enabled for the specified threads wherever they are in all MAP statements where . When used in a HANDLECOLLISIONS clause of a MAP statement, HANDLECOLLISIONS is enabled only for that MAP statement.
threadID[, threadID][, …]
Gibt eine Thread-ID oder eine kommagetrennte Liste mit Threads im Format threadID, threadID, threadID an.
thread_range[, thread_range][, …]
Gibt einen Threadbereich in Form von threadIDlow-threadIDhigh oder einer durch Komma getrennten Liste von Bereichen im Format von threadIDlow-threadIDhigh, threadIDlow-threadIDhigh an.
Eine Kombination aus diesen Formaten ist ebenfalls zulässig, wie threadID, threadID, threadIDlow-threadIDhigh.
Beispiele
Beispiel 1
In diesem Beispiel wird HANDLECOLLISIONS für alle MAP-Anweisungen in der Parameterdatei aktiviert.
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;
Beispiel 2
In diesem Beispiel wird HANDLECOLLISIONS für einige MAP-Anweisungen aktiviert, während es für andere deaktiviert wird.
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;
Beispiel 3
Dieses Beispiel zeigt die grundlegende Verwendung von HANDLECOLLISIONS innerhalb einer MAP-Anweisung.
MAP dbo.tcust, TARGET dbo.tcust, HANDLECOLLISIONS;
Beispiel 4
Dieses Beispiel zeigt eine Kombination aus globaler und MAP-Ebene. Die MAP-Spezifikation überschreibt die globale Spezifikation für die angegebenen Tabellen.
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;
Beispiel 5
Im folgenden Beispiel ist HANDLECOLLISIONS global für alle MAP-Anweisungen aktiviert, mit Ausnahme des Standardthreads 0 in der ersten MAP-Anweisung und für Thread 3 in der zweiten MAP-Anweisung.
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;
Beispiel 6
In diesem Beispiel ist HANDLECOLLISIONS global aktiviert, aber für Thread 3 deaktiviert. Die übrigen Fäden 1, 2 und 4 werden Kollisionen bewältigen.
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);
Beispiel 7
In diesem Beispiel ist HANDLECOLLISIONS global aktiviert und dann global für Threads 5 bis 7 deaktiviert. In der ersten Map-Anweisung verarbeiten alle Threads Kollisionen, da der Parameter HANDLECOLLISIONS keinen Thread oder Bereich angibt. In der zweiten Map-Anweisung verarbeiten nur die Threads 4, 8 und 9 Kollisionen, da die globale NOHANDLECOLLISIONS für die Threads 5-7 gilt.
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.*;