HANDLECOLLISIONS | NOHANDLECOLLISIONS

Válido para

Replicat

Descripción

Utilice los parámetros HANDLECOLLISIONS y NOHANDLECOLLISIONS para controlar si Replicat intenta resolver errores de registro duplicado y de registro faltante al aplicar SQL en el destino. Estos errores, denominados colisiones, se producen durante una carga inicial, cuando se están cargando datos de las Tablas de origen en las Tablas de destino mientras Oracle GoldenGate está replicando en esas tablas los cambios transaccionales que se están realizando. Cuando Oracle GoldenGate aplica los cambios replicados una vez finalizada la carga, HANDLECOLLISIONS proporciona a Replicat una lógica de manejo de errores para estas colisiones.

Puede utilizar HANDLECOLLISIONS y NOHANDLECOLLISIONS de las siguientes formas:

Los métodos anteriores se pueden combinar. Puede especificar una regla global de manejo de colisiones y, a continuación, sustituir esa regla con diferentes reglas de manejo de colisiones en las sentencias MAP. Una especificación MAP siempre sustituye a la especificación global.

Nota: El manejo de errores de Integrated Replicat no es adecuado con HANDLECOLLISIONS. Oracle recomienda utilizar métodos de instanciación precisos en lugar de utilizar HANDLECOLLISIONS.

HowHANDLECOLLISIONSWorks

En el siguiente ejemplo se explica cómo funciona HANDLECOLLISIONS:

  1. La aplicación actualiza el registro A en el origen table1.

  2. Extract extrae la actualización.

  3. La aplicación suprime el registro A en el origen table1.

  4. Extract extrae la supresión.

  5. Oracle GoldenGate extrae datos de carga inicial del origen table1, sin el registro A.

  6. Oracle GoldenGate aplica la carga inicial sin el registro A.

  7. Replicat intenta aplicar la actualización del registro A.

  8. La base de datos devuelve un error "record missing".

  9. Replicat intenta aplicar la eliminación del registro A.

  10. La base de datos devuelve un error "record missing".

Desactive HANDLECOLLISIONS después de que los cambios transaccionales capturados durante la carga inicial se apliquen a las tablas de destino, de modo que Replicat no maneje automáticamente los errores posteriores. Los errores generados después de la sincronización inicial indican una condición anormal y deben ser evaluados por alguien que pueda determinar cómo resolverlos. Por ejemplo, un error de registro faltante podría indicar que un registro que existe en el sistema de origen se eliminó involuntariamente del sistema de destino.

Puede desactivar HANDLECOLLISIONS de las siguientes formas:

Posibles soluciones para evitar que falten valores de columna

Cuando una base de datos no registra todos los valores de columna de una tabla de origen por defecto, puede haber errores si la tabla de destino tiene restricciones NOT NULL cuando Replicat intenta convertir una actualización de clave primaria en una inserción. Puede solucionar este escenario de las siguientes formas:

Si la base de datos incluye todas las columnas por defecto, debe utilizar NOCOMPRESSUPDATES y NOCOMPRESSDELETES para que HANDLECOLLISIONS funcione correctamente. Si la base de datos no soporta NOCOMPRESSDELETES, debe utilizar FETCHOPTIONS MISSINGCOLS.

Consulte Acerca de la Instanciación con el Extract de Carga Inicial para obtener más información sobre los métodos de carga inicial de Oracle GoldenGate.

Valor por defecto

NOHANDLECOLLISIONS

Sintaxis

HANDLECOLLISIONS | NOHANDLECOLLISIONS [_ALLOWPKMISSINGROWCOLLISIONS]
[THREADS (<threadID>[, <threadID>][, ...][, <thread_range>[, <thread_range>][, ...])]

HANDLECOLLISIONS

Activa el manejo de colisiones.

_ALLOWPKMISSINGROWCOLLISIONS

Utilice HANDLECOLLISIONS con _ALLOWPKMISSINGROWCOLLISIONS para omitir las operaciones UPDATE de clave primaria si la fila de destino correspondiente no existe.

Nota: La omisión de operaciones puede causar daños en los datos. Consulte la descripción en este tema.

NOHANDLECOLLISIONS

Apaga el manejo de colisiones.

THREADS (<threadID>[, <threadID>][, ...][, <thread_range>[, <thread_range>][, ...])

Activa HANDLECOLLISIONS para los threads especificados. Cuando se utiliza en una sentencia HANDLECOLLISIONS global en el nivel raíz del archivo de parámetros, HANDLECOLLISIONS está activado para los threads especificados dondequiera que estén en todas las sentencias MAP donde . Cuando se utiliza en una cláusula HANDLECOLLISIONS de una sentencia MAP, HANDLECOLLISIONS solo está activado para esa sentencia MAP.

threadID[, threadID][, …]

Especifica un thread ID o una lista delimitada por comas de threads con el formato threadID, threadID, threadID.

thread_range[, thread_range][, …]

Especifica un rango de threads con el formato de threadIDlow-threadIDhigh o una lista de rangos delimitados por comas con el formato de threadIDlow-threadIDhigh, threadIDlow-threadIDhigh.

Se permiten una combinación de estos formatos, como threadID, threadID, threadIDlow-threadIDhigh.

Ejemplos

Ejemplo 1

En este ejemplo, se activa HANDLECOLLISIONS para todas las sentencias MAP del archivo de parámetros.

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;

Ejemplo 2

En este ejemplo, se activa HANDLECOLLISIONS para algunas sentencias MAP y se desactiva para otras.

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;

Ejemplo 3

En este ejemplo se muestra el uso básico de HANDLECOLLISIONS en una sentencia MAP.

MAP dbo.tcust, TARGET dbo.tcust, HANDLECOLLISIONS;

Ejemplo 4

En este ejemplo se muestra una combinación de uso global y de nivel MAP. La especificación MAP sustituye a la especificación global de las tablas especificadas.

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;

Ejemplo 5

En el siguiente ejemplo, HANDLECOLLISIONS está activado globalmente para todas las sentencias MAP, excepto para el thread por defecto 0 en la primera sentencia MAP y para el thread 3 en la segunda sentencia 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;

Ejemplo 6

En este ejemplo, HANDLECOLLISIONS está activado globalmente, pero desactivado para el thread 3. Los hilos restantes 1, 2 y 4 manejarán colisiones.

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);

Ejemplo 7

En este ejemplo, HANDLECOLLISIONS se activa globalmente y, a continuación, se desactiva globalmente para los threads del 5 al 7. En la primera sentencia map, todos los threads manejarán colisiones, ya que el parámetro HANDLECOLLISIONS no especifica un thread ni un rango. En la segunda sentencia de asignación, solo los subprocesos 4, 8 y 9 manejarán las colisiones, porque el valor global NOHANDLECOLLISIONS se aplica a los subprocesos 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.*;