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:

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:

  1. Die Anwendung aktualisiert Datensatz A in Quelle table1.

  2. Extrahiert die Aktualisierung.

  3. Die Anwendung löscht Datensatz A in Quelle table1.

  4. Extrahiert den Löschvorgang.

  5. Oracle GoldenGate extrahiert Daten zum erstmaligen Laden aus Quelle table1 ohne Datensatz A.

  6. Oracle GoldenGate wendet das erstmalige Laden ohne Datensatz A an.

  7. Replicat versucht, die Aktualisierung von Datensatz A anzuwenden.

  8. Die Datenbank gibt einen Fehler "Datensatz fehlt" zurück.

  9. Replicat versucht, das Löschen von Datensatz A anzuwenden.

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

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:

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