Detección y Resolución Automática de Conflictos

Cuando Oracle GoldenGate replica los cambios entre las bases de datos Oracle, puede configurar y gestionar la detección y resolución automáticas de conflictos de Oracle GoldenGate en las bases de datos Oracle. Nota: La función Detección y resolución automática de conflictos está disponible en Oracle Database 12c versión 2 (12.2) y posteriores, y funciona con Oracle GoldenGate 12c (12.3.0.1) y versiones posteriores. Hay una función manual de detección y resolución de conflictos, que se denomina detección y resolución de conflictos (CDR) de Oracle GoldenGate. El CDR de Oracle GoldenGate está configurado en el archivo de parámetros de Replicat. Para obtener más información sobre Oracle GoldenGate CDR, consulte Detección y resolución manuales de conflictos.

Acerca de la detección y resolución automáticas de conflictos

Cuando Oracle GoldenGate replica cambios entre bases de datos Oracle, puede configurar y gestionar automáticamente la detección y resolución de conflictos de Oracle GoldenGate en estas bases de datos.

Esta función está diseñada para su uso con configuraciones activo-activo, donde Oracle GoldenGate debe mantener la sincronización de datos entre varias bases de datos que contienen los mismos juegos de datos.

Nota: La función de detección y resolución automática de conflictos (ACDR) solo está disponible cuando se utiliza Oracle GoldenGate con Oracle AI Database. Para bases de datos que no son de Oracle, hay una función manual de detección y resolución de conflictos (CDR) disponible con Oracle GoldenGate. El CDR de Oracle GoldenGate está configurado en el archivo de parámetros de Replicat.

Detección y Resolución Automática de Conflictos

Puede configurar la detección y resolución automáticas de conflictos en una configuración de Oracle GoldenGate que replique tablas entre bases de datos Oracle. Para configurar la detección y resolución automáticas de conflictos para una tabla, debe llamar al procedimiento ADD_AUTO_CDR en el paquete DBMS_GOLDENGATE_ADM. Un requisito para configurar la detección y resolución automáticas de conflictos, el usuario de Oracle GoldenGate debe tener los privilegios adecuados. Consulte Grant User Privileges for Oracle AI Database 26ai and Higher y Grant User Privileges for Oracle Database 21c and Lower para obtener más información sobre los privilegios de usuario.

El usuario administrador debe estar conectado a la PDB adecuada al llamar a ADD_AUTO_CDR. Ahora se agregan las siguientes constantes, que representan indicadores de bits:

En el siguiente ejemplo se utiliza un comando ALTER para la tabla HR.EMPLOYEES:

BEGIN
 dbms_goldengate_adm.alter_auto_cdr
 (schema_name => 'HR'
 ,table_name => 'EMPLOYEES'
 ,additional_options => DBMS_GOLDENGATE_ADM.ADDITIONAL_OPTIONS_ADD_KEY_VERSION );
END;
/

Consulte la descripción de additional_options en ADD_AUTO_CDR Procedure de Referencia de tipos y paquetes PL/SQL de Oracle AI Database.

Cuando Oracle GoldenGate captura los cambios originados en una instancia de Oracle AI Database, cada cambio se encapsula en un registro de cambios lógicos de fila (LCR). Un LCR de fila es una representación estructurada de un cambio de fila DML. Cada LCR de fila incluye el tipo de operación, los valores de columna antiguos y los valores de columna nuevos. Los LCR de varias filas pueden formar parte de una única transacción de base de datos.

Cuando más de una réplica de una tabla permite cambios en la tabla, se puede producir un conflicto cuando se realiza un cambio en la misma fila en dos bases de datos diferentes casi al mismo tiempo. Oracle GoldenGate replica los cambios mediante los LCR de fila. Detecta un conflicto comparando los valores antiguos de la fila LCR para el cambio inicial de la base de datos de origen con los valores actuales de la fila de tabla correspondiente en la base de datos de destino identificada por las columnas clave. Si algún valor de columna no coincide, se produce un conflicto.

Después de detectar un conflicto, Oracle GoldenGate puede resolverlo sobrescribiendo los valores de la fila con algunos valores de la fila LCR, ignorando los valores de la fila LCR o calculando un delta para actualizar los valores de la fila.

La detección y resolución automáticas de conflictos no requiere cambios en la aplicación por los siguientes motivos:

Requisitos para la Detección y Resolución Automática de Conflictos

A continuación se muestran los requisitos clave para configurar la CDR automática en Oracle GoldenGate:

Compatibilidad y migración

Si la tabla base de la base de datos de origen no contiene la columna KEYVER$$, pero la tabla base de destino tiene actualizaciones de clave primaria y DELETE, se produce un error en la base de datos de destino para las resoluciones EARLIEST TIMESTAMP, DELETE ALWAYS WINS y SITE PRIORITY.

Al replicar desde una tabla base, que tiene un valor KEYVER$$ en una tabla de destino, que no lo tiene, se ignora la columna KEYVER$$.

Grupos de Columnas

Un grupo de columnas es una agrupación lógica de una o más columnas de una tabla replicada. Al agregar un grupo de columnas, la detección y resolución de conflictos se realiza en las columnas del grupo de columnas independientemente de las demás columnas de la tabla.

Al configurar una tabla para la detección y resolución de conflictos de Oracle GoldenGate con el procedimiento ADD_AUTO_CDR, todas las columnas escalares de la tabla se agregan a un grupo de columnas por defecto. Para definir otros grupos de columnas para la tabla, ejecute el procedimiento ADD_AUTO_CDR_COLUMN_GROUP. Las columnas de la tabla que no forman parte de un grupo de columnas definido por el usuario permanecen en el grupo de columnas por defecto de la tabla.

Los grupos de columnas permiten que diferentes bases de datos actualicen diferentes columnas en la misma fila casi al mismo tiempo sin causar un conflicto. Cuando se configuran grupos de columnas para una tabla, se pueden evitar conflictos incluso si diferentes bases de datos actualizan la misma fila de la tabla. No se detecta ningún conflicto si las actualizaciones cambian los valores de las columnas en diferentes grupos de columnas.

Figura 1: Grupos de columnas

A continuación, se muestra la descripción de imagen

En este ejemplo se muestra una fila que se replica en la base de datos A y la base de datos B. Los dos grupos de columnas siguientes se configuran para la tabla replicada en cada base de datos:

Estos grupos de columnas permiten que la base de datos A y la base de datos B actualicen la misma fila casi al mismo tiempo sin provocar ningún conflicto. En concreto, se realizan los siguientes cambios:

Debido a que la columna Office y la columna Title están en diferentes grupos de columnas, los cambios se replican sin que se detecte ningún conflicto. El resultado es que los valores de la fila son los mismos en ambas bases de datos después de que se haya replicado cada cambio.

Actualizaciones de línea de negocio de trozos

Un juego de operaciones de LOB compuesto por LOB WRITE, LOB ERASE y LOB TRIM es una actualización de LOB de trozos. Cuando se configura una tabla que contiene columnas LOB para la detección y resolución de conflictos, cada columna LOB se coloca en su propio grupo de columnas y el grupo de columnas tiene su propia columna de registro de hora oculta. La columna de registro de hora se actualiza en la primera operación de línea de negocio de trozos.

Para una columna LOB, se detecta y resuelve un conflicto de las siguientes formas:

Detección y resolución más temprana de conflictos de registro de hora

Las columnas con nombres de formato CDRTS$ column group y CDRTS$ROW se utilizan para contener registros de hora que reflejan las horas de modificación de los grupos de columnas y la fila.

Nota: Las tablas con símbolos $ o $$ son tablas internas u ocultas.

DBMS_GOLDENGATE_ADM incluye los siguientes procedimientos para configurar la resolución de registro de hora más temprana y más reciente:

El campo ADDITIONAL_OPTIONS, tanto en ADD_AUTO_CDR() como en ALTER_AUTO_CDR(), activa el uso del primer registro de hora. La activación del registro de hora más antiguo activa automáticamente el control de versiones, que agrega una nueva columna oculta KEYVER$$ (número de versión) del tipo registro de hora. Se agrega un nuevo valor de indicador para indicar el primer uso de registro de hora. Este campo también se agrega a la tabla DELETE TOMBSTONE. Los conflictos de supresión son el motivo por el que se necesita el número de versión. Con una resolución de registro de hora más temprana, es posible que los conflictos de supresión, que pueden ser transparentes, no solo se ejecuten correctamente de manera incorrecta, sino que también eviten nuevas inserciones de la fila (versiones nuevas). Con un registro de hora de versión, la supresión se puede resolver correctamente en un DML de fila para la misma versión de fila.

La inserción original de la fila recibe el registro de hora actual de su valor por defecto. A continuación, la eliminación de esta fila inserta el número de versión y la hora a la que se insertó esta fila en la tabla de lápida cuando hay una supresión. En una nueva inserción, por defecto, el número de versión recibe de nuevo el registro de hora actual, evitando así un conflicto falso con las entradas de supresión actuales en la tabla de lápida.

Ejemplo

Supongamos que tiene una tabla tab1 que es globalmente consistente entre las bases de datos del sitio 1 y el sitio 2.

La tabla contiene una clave (principal). ACDR mantiene automáticamente una versión de clave (kv) y un registro de hora (ts) como columnas para la tabla base (oculta) y la tabla de lápida. Para la versión de clave kv y el registro de hora ts

Base de datos 1: insert tab1 key1 kv1 ts1

Base de datos 2: delete tab1 key1 kv1 ts1

Inserción en la tabla DELETE TOMBSTONE key1 kv1 ts1

Base de datos 1: insert tab1 key1 kv2 ts2

Sin usar la versión de clave, la inserción se ignoraría, el registro de hora de supresión es anterior. A medida que se utiliza la versión de clave, sabe que kv2 no es la versión de la fila que se ha suprimido y la inserción se realiza correctamente.

Última resolución y detección de conflictos de registro de hora

Al ejecutar el procedimiento ADD_AUTO_CDR en el paquete DBMS_GOLDENGATE_ADM para configurar una tabla para la detección y resolución automáticas de conflictos de Oracle GoldenGate, se agrega una columna de registro de hora oculta a la tabla. Esta columna de registro de hora oculta registra la hora de un cambio de fila y esta información se utiliza para detectar y resolver conflictos.

Cuando se aplica un LCR de fila, se puede producir un conflicto para una operación INSERT, UPDATE o DELETE. En la siguiente tabla, se describe cada tipo de conflicto y cómo se resuelve.

Operación Detección de Conflictos Resolución de Conflictos
INSERT Se detecta un conflicto cuando la tabla tiene el mismo valor para una columna de clave que el nuevo valor de la fila LCR.

Si el registro de hora de la fila LCR es posterior al registro de hora de la fila de la tabla, los valores de la fila LCR sustituyen a los valores de la tabla.

Si el registro de hora de la fila LCR es anterior al registro de hora de la fila de la tabla, se desecha el LCR de la fila y se conservan los valores de la tabla.

UPDATE

Se detecta un conflicto en cada uno de los siguientes casos:

  • Existe una discrepancia entre el valor de registro de hora de la fila LCR y el valor de registro de hora de la fila correspondiente de la tabla.

  • Existe una discrepancia entre un valor antiguo de un grupo de columnas de la fila LCR que no coincide con el valor de columna de la fila de tabla correspondiente. Un grupo de columnas es una agrupación lógica de una o más columnas de una tabla replicada.

  • La fila de la tabla no existe. Si la fila está en la tabla lápida, se denomina conflicto actualización-eliminación.

Si hay una discrepancia de valores y el registro de hora de la fila LCR es posterior al registro de hora de la fila de la tabla, los valores de la fila LCR sustituyen a los valores de la tabla.

Si hay una discrepancia de valores y el registro de hora de la fila LCR es anterior al registro de hora de la fila de la tabla, se desecha el LCR de la fila y se retienen los valores de la tabla.

Si la fila de la tabla no existe y el registro de hora de la fila LCR es posterior al registro de hora de la fila de la tabla de lápida, la fila LCR se convierte de una operación UPDATE a una operación INSERT y se inserta en la tabla.

Si la fila de la tabla no existe y el registro de hora de la fila LCR es anterior al registro de hora de la fila de la tabla de lápida, la fila LCR se desecha.

Si la fila de la tabla no existe y no hay ninguna fila correspondiente en la tabla de lápida, la fila LCR se convierte de una operación UPDATE a una operación INSERT y se inserta en la tabla.

DELETE

Se detecta un conflicto en cada uno de los siguientes casos:

  • Existe una discrepancia entre el valor de registro de hora de la fila LCR y el valor de registro de hora de la fila correspondiente de la tabla.

  • La fila de la tabla no existe.

Si el registro de hora de la fila LCR es posterior al registro de hora de la tabla, suprima la fila de la tabla.

Si el registro de hora de la fila LCR es anterior al registro de hora de la tabla, se desecha el LCR de la fila y se conservan los valores de la tabla.

Si la supresión se realiza correctamente, registre la fila LCR insertándola en la tabla de lápida.

Si la fila de la tabla no existe, registre la fila LCR insertándola en la tabla de lápida.

En la siguiente imagen se muestra la resolución de conflictos entre la base de datos A y la B: Última resolución de conflictos de registro de hora con el último método de registro de hora.

En este ejemplo se muestra una fila que se replica en la base de datos A y la base de datos B. Las columnas de base de datos son Name, RowTS, Office, Title y Salary. La columna RowTS es la columna invisible en ambas bases de datos. Hay una actualización en la columna Office de la base de datos A y, al mismo tiempo, hay una actualización en la columna Title de la base de datos B. Esto provoca un conflicto y la resolución de este conflicto se realiza aplicando el último método de registro de hora.

Resolución de conflictos delta

Con la detección de conflictos delta, se produce un conflicto cuando un valor de la lista de columnas antigua de la fila LCR difiere del valor de la fila correspondiente de la tabla.

Para configurar la detección y resolución de conflictos delta para una tabla, ejecute el procedimiento ADD_AUTO_CDR_DELTA_RES en el paquete DBMS_GOLDENGATE_ADM. El método de resolución delta no depende de un registro de hora ni de una columna de resolución adicional. Con la resolución de conflictos delta, el conflicto se resuelve agregando la diferencia entre los valores nuevo y antiguo de la fila LCR al valor de la tabla. Este método de resolución se utiliza generalmente para datos financieros, como un saldo de cuenta. Por ejemplo, si un saldo bancario se actualiza simultáneamente en dos sitios, el valor convergente contabiliza todos los cargos y abonos.

En la siguiente figura, se proporciona un ejemplo que ilustra la detección y resolución de conflictos delta.

Figura 2: Detección y resolución de conflictos delta

Descripción de imagen siguiente

En este ejemplo se muestra una fila que se replica en la base de datos A y la base de datos B. La columna Balance se designa como la columna en la que se realiza la resolución de conflictos delta y la columna RowTS es la columna de registro de hora invisible para realizar un seguimiento de la hora de cada cambio en la columna Balance. Se realiza un cambio en el valor Balance de la fila en ambas bases de datos casi al mismo tiempo (@T20 en la base de datos A y @T22 en la base de datos B). Estos cambios dan como resultado un conflicto, y la resolución de conflictos delta se utiliza para resolver el conflicto de la siguiente manera:

Después de la resolución de conflictos delta, el valor de la columna Balance es el mismo para la fila de la base de datos A y la base de datos B.

CDR de prioridad de centro

Nota: La resolución SITE PRIORITY tiene prioridad sobre todos los valores de resolución COLUMN GROUP.

Nota: Si el parámetro Replicat SITE PRIORITY no se coloca antes de las sentencias de asignación aplicables en el archivo de parámetros, no funcionará. Este parámetro se debe colocar antes de las sentencias de asignación aplicables.

La resolución de prioridad se especifica en el archivo de parámetros de Replicat entre el origen y el destino para la resolución de conflictos.

SITE PRIORITY está activado para una base de datos o PDB en el archivo de parámetros Replicat con el parámetro ACDR SITE_PRIORITY {source_db_name}{OVERWRITE | IGNORE }, que se especifica para activar la resolución SITE PRIORITY para una tabla.

Si se especifica la opción OVERWRITE, la tabla de origen tiene prioridad y los conflictos se resuelven mediante OVERWRITE. Por el contrario, si se especifica la opción IGNORE, la tabla de destino tiene prioridad y los cambios de la tabla de origen se ignoran en un conflicto.

La resolución SITE PRIORITY se puede desactivar mediante el campo ADDITIONAL_OPTIONS en el procedimiento ADD_AUTO_CDR() del paquete DBMS_GOLDENGATE_ADM y ALTER_AUTO_CDR() mediante la definición de IGNORE_SITE_PRIORITY.

Cada relación origen-destino de Replicat se puede configurar de forma diferente; por lo tanto, la convergencia depende de la configuración del usuario.

Eliminar CDR de registro de hora de ganancias siempre

DELETE ALWAYS WINS se activa mediante el campo ADDITIONAL_OPTIONS en los procedimientos DBMS_GOLDENGATE_ADM ADD_AUTO_CDR() y ALTER_AUTO_CDR(). Se trata de nuevo de un método de resolución de conflictos de supresión, que no utiliza la última resolución de registro de hora; por lo tanto, es necesario el control de versiones. La activación de DELETE ALWAYS WINS activa automáticamente el control de versiones, que agrega una nueva columna oculta KEYVER$$ (número de versión) de tipo registro de hora. También se agrega un nuevo valor de indicador a acdrflags_kqldtvc para indicar el uso de DELETE ALWAYS WINS. Este campo también se agrega a la tabla DELETE TOMBSTONE. Existen los mismos problemas de control de versiones que la resolución EARLIEST TIMESTAMP.

Ejemplo:

Versión de clave kv y registro de hora ts

Base de datos 1: insert tab1 key1 kv1 ts1

Base de datos 2: delete tab1 key1 kv1 ts1

Inserción en la tabla DELETE TOMBSTONE key1 kv1 ts1

Base de datos 1: insert tab1 key1 kv2 ts2

Sin usar la versión de clave, se ignoraría la inserción, la supresión siempre gana. A medida que se utiliza la versión de clave, sabe que kv2 no es la versión de la fila que se ha suprimido y la inserción se realiza correctamente.

DELETE TOMBSTONE Tabla

La tabla DELETE TOMBSTONE es un marcador de un registro suprimido para distinguirlo de un registro que nunca existió. Una tabla DELETE TOMBSTONE contiene como mínimo las columnas de clave y el registro de hora de la operación. Esta información es necesaria para suprimir la convergencia porque algunas actualizaciones e inserciones entrantes pueden retrasarse desde otro sitio y el LCR entrante debe filtrarse con el registro de hora de la operación de lápida para determinar si se debe aplicar.

Seguimiento de actualizaciones de clave primaria en Delete Tombstone

El soporte completo de actualizaciones de clave primaria (PK) requiere el manejo de conflictos tanto en las filas representadas por la imagen anterior de la clave como en la fila representada por la imagen posterior de la clave. Una actualización de clave primaria es una supresión e inserción autónoma, por lo que los conflictos de actualización de clave primaria se deben soportar como supresión para los conflictos con la imagen anterior de la clave y se inserta con la imagen posterior de la clave (y la fila).

La compatibilidad con la actualización de clave primaria como supresión de la fila representada por la imagen anterior de la clave significa que se debe insertar en la tabla deleteombstone como supresión. Se agrega un disparador interno de actualización para insertarlo en la tabla de lápida cuando se actualiza la clave primaria (en realidad, la clave de identificación de fila, ya sea la clave primaria si existe o el Reino Unido seleccionado con al menos una columna no nula). Como una actualización de clave primaria puede provocar dos conflictos, se intentan hasta dos resoluciones en el nivel de fila, se elimina la fila con la clave primaria original y se inserta la fila con la nueva clave primaria.

Ejemplo: uso de la última resolución de registro de hora

Base de datos 1: actualización a tab1 key1 at ts1

Base de datos 2: actualización a tab1 key1 set key1 to key2 ts2

Base de datos 3: actualización a tab1 key2 ts3

En este escenario, parece que en la fila de nivel de fila tab1 con key1 se debe suprimir y la actualización de la base de datos 3 debe ser la modificación final de la clave de fila tab1

  1. Si, en cambio, la base de datos 2 está en ts3 y la base de datos 3 está en ts3, la actualización de clave primaria en la base de datos 2 sería la modificación final de la fila tab1 key2.

Now, consider a case where the database 1 was at ts3, database 2 at ts2 and database 3 at ts1, then the update to tab1 row key1 on database 1 should succeed and the PK update from database 2 on tab1 row key2 should succeed. En este punto, parece que la resolución completa es que tanto la eliminación en la imagen anterior como la inserción en la imagen posterior se deben resolver por separado. Esto implica que no son dependientes el uno del otro y una pérdida para uno, no es una pérdida para ambos.

Configuración de resolución y detección de conflictos delta

El procedimiento ADD_AUTO_CDR_DELTA_RES del paquete DBMS_GOLDENGATE_ADM configura la detección y la resolución de conflictos delta.

Con la resolución de conflictos delta, se especifica una columna para la que se detectan y resuelven conflictos. El conflicto se detecta si el valor de la columna de la fila LCR no coincide con el valor correspondiente de la tabla. El conflicto se resuelve agregando la diferencia entre los valores nuevo y antiguo de la fila LCR al valor de la tabla.

Puede configurar un administrador de Oracle GoldenGate mediante el procedimiento GRANT_ADMIN_PRIVILEGE en el paquete DBMS_GOLDENGATE_ADM.

  1. Conéctese a la base de datos del servidor entrante como administrador de Oracle GoldenGate.

  2. Ejecute el procedimiento ADD_AUTO_CDR y especifique la tabla que desea configurar para la última detección y resolución de conflictos de registro de hora.

  3. Ejecute el procedimiento ADD_AUTO_CDR_DELTA_RES y especifique la columna en la que se realiza la detección y resolución de conflictos delta.

  4. Repita los pasos anteriores en cada instancia de Oracle AI Database que replique la tabla.

Ejemplo 9-23 Configuración de la detección y resolución de conflictos delta para una tabla

En este ejemplo, se configura la detección y resolución de conflictos delta para la columna order_total en la tabla oe.orders.

BEGIN
  DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR(
    SCHEMA_NAME => 'OE',
    TABLE_NAME  => 'ORDERS');
END;
/

BEGIN
  DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR_DELTA_RES(
    SCHEMA_NAME => 'OE',
    TABLE_NAME  => 'ORDERS',
    COLUMN_NAME => 'ORDER_TOTAL');
END;
/

Configuración de la última detección y resolución de conflictos de registro de hora

El procedimiento ADD_AUTO_CDR del paquete DBMS_GOLDENGATE_ADM configura la última detección y resolución de conflictos de registro de hora. El procedimiento ADD_AUTO_CDR_COLUMN_GROUP agrega grupos de columnas opcionales.

Para Oracle AI Database 26ai y versiones posteriores, existen métodos adicionales para gestionar y mantener las tablas configuradas de ACDR. Puede conservar las columnas subyacentes relacionadas con AUTO-CDR como columnas UNUSED o borrarlas inmediatamente después de llamar al procedimiento REMOVE_AUTO_CDR.

Si aplica el procedimiento ADD_AUTO_CDR a una tabla, por defecto, sus columnas internas se marcan como no utilizadas si se elimina AUTO_CDR. Después de llamar a REMOVE_AUTO_CDR, las columnas no utilizadas se pueden suprimir manualmente en una etapa posterior o se pueden eliminar inmediatamente mediante algunos parámetros adicionales. Para obtener más información, consulte Removing Conflict Detection and Resolution From a Table.

Para obtener más información, consulte ADD_AUTO_CDR Procedure en la Referencia de tipos y paquetes PL/SQL de Oracle AI Database

Con la última detección y resolución de conflictos de registro de hora, se detecta un conflicto cuando la columna de registro de hora de la fila LCR no coincide con el registro de hora de la fila de tabla correspondiente. La fila LCR se aplica si su registro de hora es posterior. De lo contrario, la fila LCR se desecha y la fila de la tabla no se cambia. Al ejecutar el procedimiento ADD_AUTO_CDR, agrega una columna de registro de hora invisible para cada fila de la tabla especificada y configura la detección y resolución de conflictos de registro de hora. Cuando se utiliza el procedimiento ADD_AUTO_CDR_COLUMN_GROUP para agregar uno o más grupos de columnas, agrega un registro de hora para el grupo de columnas y configura la detección y resolución de conflictos de registro de hora para el grupo de columnas.

Puede configurar un administrador de Oracle GoldenGate mediante el procedimiento GRANT_ADMIN_PRIVILEGE en el paquete DBMS_GOLDENGATE_ADM.

  1. Conéctese a la base de datos del servidor entrante como administrador de Oracle GoldenGate.

  2. Ejecute el procedimiento ADD_AUTO_CDR y especifique la tabla que desea configurar para la última detección y resolución de conflictos de registro de hora.

  3. Ejecute el procedimiento ADD_AUTO_CDR_COLUMN_GROUP y especifique uno o más grupos de columnas en la tabla.

  4. Repita los pasos anteriores en cada instancia de Oracle AI Database que replique la tabla.

Ejemplo 9-24 Configuración de la última detección y resolución de conflictos de registro de hora para una tabla

En este ejemplo, se configura la última detección y resolución de conflictos de registro de hora para la tabla hr.employees.

BEGIN
  DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR(
    SCHEMA_NAME => 'HR',
    TABLE_NAME  => 'EMPLOYEES');
END;
/

Ejemplo 9-25 Configuración de grupos de columnas

En este ejemplo, se configuran los siguientes grupos de columnas para la resolución de conflictos de registro de hora en la tabla HR.EMPLOYEES:

BEGIN
  DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR_COLUMN_GROUP(
    SCHEMA_NAME       => 'HR',
    TABLE_NAME        => 'EMPLOYEES',
    COLUMN_LIST       => 'JOB_ID, DEPARTMENT_ID, MANAGER_ID',
    COLUMN_GROUP_NAME => 'JOB_IDENTIFIER_CG');
END;
/

BEGIN
  DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR_COLUMN_GROUP(
    SCHEMA_NAME       => 'HR',
    TABLE_NAME        => 'EMPLOYEES',
    COLUMN_LIST       => 'SALARY, COMMISSION_PCT',
    COLUMN_GROUP_NAME => 'COMPENSATION_CG');
END;
/

Configuración de resolución y detección de conflictos delta

El procedimiento ADD_AUTO_CDR_DELTA_RES del paquete DBMS_GOLDENGATE_ADM configura la detección y resolución de conflictos delta.

Con la resolución de conflictos delta, se especifica una columna para la que se detectan y resuelven conflictos. El conflicto se detecta si el valor de la columna de la fila LCR no coincide con el valor correspondiente de la tabla. El conflicto se resuelve agregando la diferencia entre los valores nuevo y antiguo de la fila LCR al valor de la tabla.

Puede configurar un administrador de Oracle GoldenGate mediante el procedimiento GRANT_ADMIN_PRIVILEGE en el paquete DBMS_GOLDENGATE_ADM.

  1. Conéctese a la base de datos del servidor entrante como administrador de Oracle GoldenGate.

  2. Ejecute el procedimiento ADD_AUTO_CDR y especifique la tabla que desea configurar para la última detección y resolución de conflictos de registro de hora.

  3. Ejecute el procedimiento ADD_AUTO_CDR_DELTA_RES y especifique la columna en la que se realiza la detección y resolución de conflictos delta.

  4. Repita los pasos anteriores en cada instancia de Oracle AI Database que replique la tabla.

Ejemplo 9-26 Configuración de la detección y resolución de conflictos delta para una tabla

En este ejemplo, se configura la detección y resolución de conflictos delta para la columna order_total en la tabla oe.orders.

BEGIN
  DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR(
    SCHEMA_NAME => 'OE',
    TABLE_NAME  => 'ORDERS');
END;
/

BEGIN
  DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR_DELTA_RES(
    SCHEMA_NAME => 'OE',
    TABLE_NAME  => 'ORDERS',
    COLUMN_NAME => 'ORDER_TOTAL');
END;
/

Gestión de la detección y resolución automáticas de conflictos

Puede gestionar la detección y resolución automática de conflictos de Oracle GoldenGate en Oracle AI Database con el paquete DBMS_GOLDENGATE_ADM.

Modificación de la resolución y detección de conflictos de una tabla

El procedimiento ALTER_AUTO_CDR del paquete DBMS_GOLDENGATE_ADM modifica la detección y resolución de conflictos de una tabla.

La detección y resolución automáticas de conflictos de Oracle GoldenGate se deben configurar para la tabla:

  1. Conéctese a la base de datos del servidor entrante como administrador de Oracle GoldenGate.

  2. Ejecute el procedimiento ALTER_AUTO_CDR y especifique la tabla que desea configurar para la última detección y resolución de conflictos de registro de hora.

  3. Repita todos los pasos anteriores en cada instancia de Oracle AI Database que replique la tabla.

Ejemplo 9-27 Modificación de la Detección y Resolución de Conflictos para una Tabla

Este ejemplo modifica la detección y resolución de conflictos de la tabla HR.EMPLOYEES para especificar que se realice un seguimiento de los conflictos de supresión en una tabla de lápiz.

BEGIN
  DBMS_GOLDENGATE_ADM.ALTER_AUTO_CDR(
    SCHEMA_NAME       => 'HR',
    TABLE_NAME        => 'EMPLOYEES',
    TOMBSTONE_DELETES => TRUE);
END;
/

Modificación de un grupo de columnas

El procedimiento ALTER_AUTO_CDR_COLUMN_GROUP modifica un grupo de columnas.

  1. Conéctese a la base de datos del servidor entrante como administrador de Oracle GoldenGate.

  2. Ejecute el procedimiento ALTER_AUTO_CDR_COLUMN_GROUP y especifique uno o más grupos de columnas en la tabla.

  3. Repita todos los pasos anteriores en cada instancia de Oracle AI Database que replique la tabla.

Ejemplo 9-28 Modificación de un Grupo de Columnas

En este ejemplo se elimina la columna MANAGER_ID del grupo de columnas JOB_IDENTIFIER_CG para la tabla HR.EMPLOYEES.

BEGIN
  DBMS_GOLDENGATE_ADM.ALTER_AUTO_CDR_COLUMN_GROUP(
    SCHEMA_NAME        => 'HR',
    TABLE_NAME         => 'EMPLOYEES',
    COLUMN_GROUP_NAME  => 'JOB_IDENTIFIER_CG',
    REMOVE_COLUMN_LIST => 'MANAGER_ID');
END;
/

Nota: Si hay más de una columna, utilice una lista separada por comas.

Purga de filas de piedra sepulcral

El procedimiento PURGE_TOMBSTONES elimina las filas de lápiz que se registraron antes de una fecha y hora especificadas. Este procedimiento elimina las filas de lápida de todas las tablas configuradas para la resolución de conflictos en la base de datos.

Puede ser necesario purgar filas de lápida periódicamente para evitar que el registro de lápida crezca demasiado grande con el tiempo.

  1. Conéctese a la base de datos del servidor entrante como administrador de Oracle GoldenGate.

  2. Ejecute el procedimiento PURGE_TOMBSTONES y especifique la fecha y la hora.

Ejemplo 9-29 Depuración de Filas Tombstone

Este ejemplo purga todas las filas de lápida registradas antes de las 3:00 p.m. del 1 de diciembre de 2015, hora estándar del este. El registro de hora se debe introducir en formato TIMESTAMP WITH TIME ZONE.

EXEC DBMS_GOLDENGATE_ADM.PURGE_TOMBSTONES('2015-12-01 15:00:00.000000 EST');

Redefinición en línea en tablas ACDR

Oracle AI Database permite mitigar la interacción de las aplicaciones al reorganizar tablas o columnas mediante el paquete DBMS_REDEFINITION. El paquete DBMS_REDEFINITION se puede usar para realizar las siguientes tareas:

DBMS_REDFINITION.START_REDEF_TABLE gestiona automáticamente la columna de registro de hora oculta en la tabla temporal.

Para obtener más información sobre el paquete DBMS_REDFINITION, consulte DBMS_REDEFINITION en la Referencia de tipos y paquetes PL/SQL de Oracle AI Database.

Eliminación de la detección y resolución de conflictos de una tabla

Con Oracle AI Database y versiones posteriores, la eliminación de la detección y resolución automáticas de conflictos (ACDR) por completo de la tabla tiene un impacto menor en la tabla porque las columnas relacionadas con AUTO_CDR se marcan como UNUSED si se elimina AUTO_CDR.

Después de llamar al procedimiento REMOVE_AUTO_CDR, las columnas no utilizadas se pueden suprimir manualmente en una ventana de mantenimiento. Esto resulta útil para tablas grandes en las que la operación ALTER TABLE ... DROP COLUMN consume muchos recursos.

Si desea eliminar todas las columnas internas AUTO_CDR inmediatamente al llamar al procedimiento REMOVE_AUTO_CDR, primero debe marcar la tabla con el parámetro additional_options REMOVE_HIDDEN_COLUMNS para el procedimiento ADD_AUTO_CDR o ALTER_AUTO_CDR.

Utilice el procedimiento REMOVE_AUTO_CDR del paquete DBMS_GOLDENGATE_ADM para etiquetar una tabla como UNUSED, lo que minimiza el bloqueo. Puede elegir borrar una columna o retenerla en una etapa posterior.

  1. Conéctese a la base de datos del servidor entrante como administrador de Oracle GoldenGate.

  2. Ejecute el procedimiento REMOVE_AUTO_CDR y especifique la tabla.

  3. Repita todos los pasos anteriores en cada instancia de Oracle AI Database que replique la tabla.

Ejemplo 9-30 Eliminación de la detección y resolución de conflictos para una tabla

En este ejemplo, se elimina la detección y resolución de conflictos para la tabla HR.EMPLOYEES.

BEGIN
  DBMS_GOLDENGATE_ADM.REMOVE_AUTO_CDR(
    SCHEMA_NAME => 'HR',
    TABLE_NAME  => 'EMPLOYEES');
END;
/

Puede elegir borrar columnas mediante el indicador ADD_AUTO_CDR.REMOVE_HIDDEN_COLUMNS como parámetro additional_flags en el procedimiento ADD_AUTO_CDR.

A continuación, se muestra un ejemplo que puede utilizar para ver columnas ocultas en una tabla.

La siguiente consulta utiliza el paquete DBA_UNUSED_COL_TABS para determinar si hay columnas no utilizadas en la tabla EMPLOYEES.

SELECT OWNER, TABLE_NAME, COUNT
  FROM DBA_UNUSED_COL_TABS
  WHERE OWNER = 'HR'
  AND TABLE_NAME = 'EMPLOYEES'
  ORDER BY OWNER, TABLE_NAME;

La salida se muestra de la siguiente manera:

OWNER        TABLE_NAME    COUNT
--------    ------------ ----------
HR            EMPLOYEES      1

La siguiente consulta muestra las columnas ocultas que el sistema etiquetó cuando se eliminó ACDR para el grupo de columnas en la tabla EMPLOYEES.

SELECT OWNER, TABLE_NAME, COLUMN_ID, COLUMN_NAME, DATA_TYPE, HIDDEN_COLUMN
  FROM DBA_TAB_COLS
  WHERE OWNER = 'HR'
  AND TABLE_NAME = 'EMPLOYEES'
  AND HIDDEN_COLUMN = 'YES' AND USER_GENERATED= 'NO'
  ORDER BY OWNER, TABLE_NAME, COLUMN_ID;

La salida se muestra de la siguiente manera:

OWNER        TABLE_NAME    COLUMN_ID  COLUMN_NAME      DATA_TYPE     HIDDEN_COLUMN
------------ ------------ ---------- -------------    ------------ ---------------
HR           EMPLOYEES    SYS_C00014_22092220:30:52$   TIMESTAMP(6)       YES

Eliminación de un grupo de columnas

Con Oracle AI Database 26ai y versiones posteriores, la eliminación de la detección y resolución automáticas de conflictos (ACDR) de los grupos de columnas tiene un menor impacto en la tabla porque las columnas relacionadas con ACDR se marcan como UNUSED. También puede elegir borrar una columna o retenerla en una etapa posterior.

Utilice el procedimiento REMOVE_AUTO_CDR_COLUMN_GROUP del paquete DBMS_GOLDENGATE_ADM para etiquetar una tabla, lo que minimiza el bloqueo. Consulte el ejemplo de Removing Conflict Detection and Resolution From a Table.

  1. Conéctese a la base de datos del servidor entrante como administrador de Oracle GoldenGate.

  2. Ejecute el procedimiento REMOVE_AUTO_CDR_COLUMN_GROUP y especifique el nombre del grupo de columnas.

  3. Repita todos los pasos anteriores en cada instancia de Oracle AI Database que replique la tabla.

Ejemplo 9-31 Eliminación de un grupo de columnas

En este ejemplo se elimina el grupo de columnas COMPENSATION_CG de la tabla HR.EMPLOYEES.

BEGIN
  DBMS_GOLDENGATE_ADM.REMOVE_AUTO_CDR_COLUMN_GROUP(
    SCHEMA_NAME       => 'HR',
    TABLE_NAME        => 'EMPLOYEES',
    COLUMN_GROUP_NAME => 'COMPENSATION_CG');
END;

Eliminación de la resolución y detección de conflictos delta

El procedimiento REMOVE_AUTO_CDR_DELTA_RES del paquete DBMS_GOLDENGATE_ADM elimina la detección y resolución de conflictos delta para una columna.

La detección y resolución de conflictos delta se deben configurar para la columna especificada.

  1. Conéctese a la base de datos del servidor entrante como administrador de Oracle GoldenGate.

  2. Ejecute el procedimiento REMOVE_AUTO_CDR_DELTA_RES y especifique la columna.

  3. Repita todos los pasos anteriores en cada instancia de Oracle AI Database que replique la tabla.

Ejemplo 9-32 Eliminación de la detección y resolución de conflictos delta para una tabla

En este ejemplo, se elimina la detección y resolución de conflictos delta para la columna ORDER_TOTAL en la tabla OE.ORDERS.

BEGIN
  DBMS_GOLDENGATE_ADM.REMOVE_AUTO_CDR_DELTA_RES(
    SCHEMA_NAME => 'OE',
    TABLE_NAME  => 'ORDERS',
    COLUMN_NAME => 'ORDER_TOTAL');
END;

Supervisión de la detección y resolución automáticas de conflictos

Puede supervisar la detección y resolución automática de conflictos de Oracle GoldenGate en una instancia de Oracle AI Database consultando las vistas del diccionario de datos.

Visualización de información sobre las tablas configuradas para conflictos

La vista ALL_GG_AUTO_CDR_TABLES muestra información sobre las tablas configuradas para la detección y resolución automáticas de conflictos de Oracle GoldenGate.

  1. Conéctese a la base de datos.

  2. Consulte la vista ALL_GG_AUTO_CDR_TABLES.

Ejemplo 9-33 Visualización de información sobre las tablas configuradas para la detección y resolución de conflictos

Esta consulta muestra la siguiente información sobre las tablas que están configuradas para la detección y resolución de conflictos:

COLUMN TABLE_OWNER FORMAT A15
COLUMN TABLE_NAME FORMAT A15
COLUMN TOMBSTONE_TABLE FORMAT A15
COLUMN ROW_RESOLUTION_COLUMN FORMAT A25

SELECT TABLE_OWNER,
       TABLE_NAME,
       TOMBSTONE_TABLE,
       ROW_RESOLUTION_COLUMN
  FROM ALL_GG_AUTO_CDR_TABLES
  ORDER BY TABLE_OWNER, TABLE_NAME;

El resultado tiene un aspecto similar al siguiente:

TABLE_OWNER     TABLE_NAME      TOMBSTONE_TABLE ROW_RESOLUTION_COLUMN
--------------- --------------- --------------- -------------------------
HR              EMPLOYEES       DT$_EMPLOYEES   CDRTS$ROW
OE              ORDERS          DT$_ORDERS      CDRTS$ROW

Visualización de información sobre columnas de resolución de conflictos

La vista ALL_GG_AUTO_CDR_COLUMNS muestra información sobre las columnas configuradas para la detección y resolución automáticas de conflictos de Oracle GoldenGate.

Las columnas se pueden configurar para la detección y resolución automática de conflictos de filas o columnas. Las columnas se pueden configurar para la última resolución de conflictos de registro de hora en un grupo de columnas. Además, se puede configurar una columna para la resolución de conflictos delta.

  1. Conéctese a la base de datos como administrador de Oracle GoldenGate.

  2. Consulte la vista ALL_GG_AUTO_CDR_COLUMNS.

Ejemplo 9-34 Visualización de información sobre grupos de columnas

Esta consulta muestra la siguiente información sobre las tablas que están configuradas para la detección y resolución de conflictos:

COLUMN TABLE_OWNER FORMAT A10
COLUMN TABLE_NAME FORMAT A10
COLUMN COLUMN_GROUP_NAME FORMAT A17
COLUMN COLUMN_NAME FORMAT A15
COLUMN RESOLUTION_COLUMN FORMAT A23

SELECT TABLE_OWNER,
       TABLE_NAME,
       COLUMN_GROUP_NAME,
       COLUMN_NAME,
       RESOLUTION_COLUMN
  FROM ALL_GG_AUTO_CDR_COLUMNS
  ORDER BY TABLE_OWNER, TABLE_NAME;

El resultado tiene un aspecto similar al siguiente:

TABLE_OWNE TABLE_NAME COLUMN_GROUP_NAME COLUMN_NAME     RESOLUTION_COLUMN
---------- ---------- ----------------- --------------- -----------------------
HR         EMPLOYEES  COMPENSATION_CG   COMMISSION_PCT  CDRTS$COMPENSATION_CG
HR         EMPLOYEES  COMPENSATION_CG   SALARY          CDRTS$COMPENSATION_CG
HR         EMPLOYEES  JOB_IDENTIFIER_CG MANAGER_ID      CDRTS$JOB_IDENTIFIER_CG
HR         EMPLOYEES  JOB_IDENTIFIER_CG JOB_ID          CDRTS$JOB_IDENTIFIER_CG
HR         EMPLOYEES  JOB_IDENTIFIER_CG DEPARTMENT_ID   CDRTS$JOB_IDENTIFIER_CG
HR         EMPLOYEES  IMPLICIT_COLUMNS$ PHONE_NUMBER    CDRTS$ROW
HR         EMPLOYEES  IMPLICIT_COLUMNS$ LAST_NAME       CDRTS$ROW
HR         EMPLOYEES  IMPLICIT_COLUMNS$ HIRE_DATE       CDRTS$ROW
HR         EMPLOYEES  IMPLICIT_COLUMNS$ FIRST_NAME      CDRTS$ROW
HR         EMPLOYEES  IMPLICIT_COLUMNS$ EMAIL           CDRTS$ROW
HR         EMPLOYEES  IMPLICIT_COLUMNS$ EMPLOYEE_ID     CDRTS$ROW
OE         ORDERS     IMPLICIT_COLUMNS$ ORDER_MODE      CDRTS$ROW
OE         ORDERS     IMPLICIT_COLUMNS$ ORDER_ID        CDRTS$ROW
OE         ORDERS     IMPLICIT_COLUMNS$ ORDER_DATE      CDRTS$ROW
OE         ORDERS     IMPLICIT_COLUMNS$ CUSTOMER_ID     CDRTS$ROW
OE         ORDERS     DELTA$            ORDER_TOTAL
OE         ORDERS     IMPLICIT_COLUMNS$ PROMOTION_ID    CDRTS$ROW
OE         ORDERS     IMPLICIT_COLUMNS$ ORDER_STATUS    CDRTS$ROW
OE         ORDERS     IMPLICIT_COLUMNS$ SALES_REP_ID    CDRTS$ROW

En este ejemplo, las columnas con IMPLICIT_COLUMNS$ para el nombre de grupo de columnas se configuran para la detección y resolución de conflictos de filas, pero no forman parte de un grupo de columnas. Las columnas con DELTA$ para el nombre del grupo de columnas se configuran para la detección y resolución de conflictos delta y estas columnas no tienen una columna de resolución.

Visualización de información sobre grupos de columnas

La vista ALL_GG_AUTO_CDR_COLUMN_GROUPS muestra información sobre los grupos de columnas configurados para la detección y resolución automáticas de conflictos de Oracle GoldenGate.

Puede configurar la detección y resolución automática de conflictos de Oracle GoldenGate mediante el procedimiento ADD_AUTO_CDR en el paquete DBMS_GOLDENGATE_ADM. Puede configurar grupos de columnas mediante el procedimiento ADD_AUTO_CDR_COLUMN_GROUP en el paquete DBMS_GOLDENGATE_ADM.

  1. Conéctese a la base de datos como administrador de Oracle GoldenGate.

  2. Consulte la vista ALL_GG_AUTO_CDR_COLUMN_GROUPS.

Ejemplo 9-35 Visualización de información sobre grupos de columnas

Esta consulta muestra la siguiente información sobre las tablas que están configuradas para la detección y resolución de conflictos:

COLUMN TABLE_OWNER FORMAT A15
COLUMN TABLE_NAME FORMAT A15
COLUMN COLUMN_GROUP_NAME FORMAT A20
COLUMN RESOLUTION_COLUMN FORMAT A25

SELECT TABLE_OWNER,
       TABLE_NAME,
       COLUMN_GROUP_NAME,
       RESOLUTION_COLUMN
  FROM ALL_GG_AUTO_CDR_COLUMN_GROUPS
  ORDER BY TABLE_OWNER, TABLE_NAME;

El resultado tiene un aspecto similar al siguiente:

TABLE_OWNER     TABLE_NAME      COLUMN_GROUP_NAME    RESOLUTION_COLUMN
--------------- --------------- -------------------- -------------------------
HR              EMPLOYEES       COMPENSATION_CG      CDRTS$COMPENSATION_CG
HR              EMPLOYEES       JOB_IDENTIFIER_CG    CDRTS$JOB_IDENTIFIER_CG