es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Oracle Goldengate: ¿Puedo configurar una columna específica para que siempre se capture en Extract aunque no sea una columna clave?

Tengo una configuración de Goldengate en la que se utiliza INSERTALLRECORDS en la base de datos objetivo para replicar las operaciones de INSERT, UPDATE y DELETE en la base de datos de origen a nuevos registros.

En la base de datos objetivo, se capturan/graban la Operación DML de origen y el Tiempo de Confirmación en las tablas, mediante el uso de llamadas a @GETENV(‘GGHEADER’).

Este base de datos objetivo es luego leído por un proceso de ETL que aplica los registros a Hadoop en el mismo orden en que fueron confirmados en la base de datos objetivo.

Por ejemplo:

CREATE TABLE my_test (id         NUMBER PRIMARY KEY,
                      my_text    VARCHAR2(100) NOT NULL,
                      date_added DATE          NOT NULL);

Si ejecuto el siguiente SQL en la base de datos de origen:

INSERT INTO my_test VALUES (1,'Inserting',SYSDATE);
UPDATE my_test SET my_text = 'Updating' WHERE id = 1;
DELETE FROM my_text WHERE id = 1;

esto resultará en 0 registros para ID=1 en la base de datos de origen y 3 registros en la base de datos objetivo, es decir:

ID    MY_TEXT     DATE_ADDED            GG_DML_TYPE     GG_COMMIT_TIMESTAMP
--    -------     ----------            -----------     -------------------
1     Inserting   12-12-2021 16:00:00   INSERT          12-12-2021 16:00:00
1     Updating    12-12-2021 16:00:00   SQL COMPUPDATE  12-12-2021 16:00:01
1                                       DELETE          12-12-2021 16:00:02

Las tablas correspondientes en Hadoop están particionadas por DAYADDED, calculadas a partir de la columna DATEADDED de Oracle.

Actualmente, al aplicar una operación de DELETE desde Oracle, el ETL tiene que escanear todas las particiones de Hadoop para encontrar el registro correspondiente al ID.

Consecuentemente, para mejorar el rendimiento, me gustaría que la columna DATEADDED siempre tenga su valor capturado en el Extract de Oracle GG, de manera que esté presente en el archivo Trail de GG para todas las operaciones DML de origen, incluyendo los DELETEs.

La única forma que he encontrado para hacer esto es mediante el uso de LOGALLSUPCOLS, sin embargo, esto registra todas las columnas en el Extract, lo cual no deseo hacer para algunas de nuestras tablas que tienen muchas columnas y volúmenes altos.

Si alguien conoce una forma de capturar siempre columnas explícitas, como DATEADDED en este ejemplo, en el Extract de GG, sería muy apreciado.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución:

    Para capturar columnas explícitas como DATE_ADDED en la extracción de GG, la solución es utilizar el parámetro COLSEXCEPT en la configuración de extracción de GG.

    COLSEXCEPT es un parámetro opcional que especifica la lista de nombres de columnas a excluir del archivo de secuencias de GoldenGate. De forma predeterminada, todas las columnas se incluyen en el archivo de secuencias. Pero podemos utilizar el parámetro COLSEXCEPT para excluir columnas que no queremos replicar.

    Por ejemplo, supongamos que tenemos una tabla llamada “my_test” con tres columnas: “id”, “my_text” y “date_added”. Queremos capturar todas las operaciones DML en esta tabla, pero solo queremos capturar la columna “date_added” de forma explícita.

    La configuración de extracción de GG se verá así:

    EXTRACT my_ext
        USERID oracle, PASSWORD password
        EXTTRAIL /u01/ggate/dirdat/et
        TABLE my_schema.my_test
            COLSEXCEPT id,my_text; 
    

    Aquí, el parámetro COLSEXCEPT se utiliza con dos columnas – “id” y “my_text” – que no queremos capturar en el archivo de secuencias. Estas columnas se excluirán del archivo de secuencias y solo se capturará de forma explícita la columna “date_added” en el archivo de secuencias.

    Utilizar este enfoque puede ayudar a mejorar el rendimiento al procesar operaciones DELETE en Hadoop, ya que podemos minimizar la cantidad de particiones que deben ser escaneadas por el proceso ETL al buscar registros coincidentes.

Comments are closed.