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:
-
Puede activar
HANDLECOLLISIONSyNOHANDLECOLLISIONSde forma global especificándolos en el nivel raíz del archivo de parámetros. Un parámetro permanece activado para todas las sentenciasMAPposteriores en el archivo de parámetros hasta que se encuentre el parámetro opuesto. -
Puede activar
HANDLECOLLISIONSoNOHANDLECOLLISIONSen un parámetroMAPespecífico para activar o desactivar el manejo de errores solo para esa asignación de origen a destino.
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:
-
Cuando Replicat encuentra una actualización de una columna que Oracle GoldenGate está utilizando como clave, el manejo es el siguiente:
-
Si la fila con la clave antigua no se encuentra en el destino, el registro de cambios de la pista se convierte en una inserción.
-
Si existe una fila con la nueva clave en el destino, Replicat suprime la fila que tiene la clave antigua (no existiría si la actualización se hubiera ejecutado correctamente) y, a continuación, la fila con la nueva clave se actualiza como superposición en la que los valores de pista sustituyen a los valores actuales.
Esta lógica necesita que todas las columnas de la tabla (no solo las que han cambiado) se registren en el log de transacciones, ya sea por defecto o por la fuerza, como mediante la opción
COLSdeADD TRANDATApara una base de datos Oracle. Consulte Posibles soluciones para evitar que falten valores de columna. -
-
Cuando Replicat detecta un error de registro duplicado, el registro estático aplicado por la carga inicial se sobrescribe con el registro de cambio de la pista. La superposición del cambio es más segura desde el punto de vista operativo que ignorar el error de registro duplicado.
-
Replicat con
HANDLECOLLISIONSno descarta el registro de cambios en la pista aunque la operación de actualización o supresión no afecte a una columna de clave en el origen y Replicat encuentra un error de registro faltante en el destino. Estos errores se producen cuando se cambia un registro en el sistema de origen y, a continuación, el registro se elimina antes de que los datos de la tabla se extraigan mediante el proceso de carga inicial. Por ejemplo:
-
La aplicación actualiza el registro A en el origen table1.
-
Extract extrae la actualización.
-
La aplicación suprime el registro A en el origen table1.
-
Extract extrae la supresión.
-
Oracle GoldenGate extrae datos de carga inicial del origen table1, sin el registro A.
-
Oracle GoldenGate aplica la carga inicial sin el registro A.
-
Replicat intenta aplicar la actualización del registro A.
-
La base de datos devuelve un error "record missing".
-
Replicat intenta aplicar la eliminación del registro A.
-
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:
-
Pare Replicat y elimine
HANDLECOLLISIONSdel archivo de parámetros de Replicat (puede provocar latencia de destino). También puede editar el archivo de parámetros para agregarNOHANDLECOLLISIONSantes de las sentenciasMAPpara las que desea desactivar el manejo de errores. -
Mientras se ejecuta Replicat, ejecute GGSCI y, a continuación, utilice el comando
SEND REPLICATcon la opciónNOHANDLECOLLISIONSpara las tablas que desea que afecten.Nota: Si utiliza
SEND REPLICAT, asegúrese de eliminarHANDLECOLLISIONSdel archivo de parámetros o agregue un parámetroNOHANDLECOLLISIONSantes de iniciar otra ejecución de Replicat, de modo queHANDLECOLLISIONSno se vuelva a activar.
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:
-
HANDLECOLLISIONSnecesita que la tabla tenga una clave primaria NOTNULLo una restricción única NOTNULLen la tabla de destino. -
Utilice el parámetro
NOCOMPRESSUPDATESdel archivo de parámetros Extract para enviar todas las columnas de la tabla a la pista y configurar la base de datos para que registre todos los valores de columna. Por defecto, Extract solo escribe la clave primaria y las columnas que han cambiado a la pista. Este es el método más seguro, ya que escribe los valores actuales en el momento en que se realiza la operación y elimina la necesidad de recuperar. -
Utilice el parámetro
FETCHOPTIONScon la opciónFETCHPKUPDATECOLSen el archivo de parámetros Extract. Esta configuración hace que Extract recupere columnas no disponibles cuando se actualiza una columna de clave en el origen. Una recuperación es el valor actual, no necesariamente el valor en el momento de una actualización concreta, por lo que puede haber problemas de integridad de datos. Consulte"[FETCHOPTIONS](fetchoptions.html#GUID-DB7BCF87-E3E8-48CF-868A-A56F6D0B6A07)"para obtener más información y opciones de recuperación adicionales para manejar recuperaciones incorrectas.
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.*;