Por Francisco Riccio
Publicado en marzo 2012
Introducción
Oracle Database 9i nos introdujo un nuevo feature llamado Change Data Capture (CDC), este feature ha ido mejorando en las versiones posteriores.
El cual permite llevar un control de cambios (operaciones DML) que ocurren en una tabla y nos entrega solo los cambios ocurridos de una manera rápida y fácil.
Este feature es muy utilizado en ambientes Data Warehousing, en el cual el proceso de ETL solo debe traer los cambios ocurridos en los sistemas transaccionales siendo más efectivo en el tiempo de carga.
Change Data Capture se basa en un modelo publicador/subscritor. Donde podemos tener varios procesos interesados (subscritores) en los cambios ocurridos en una tabla.
Existen dos modalidades que Change Data Capture podría implementarse:
a) Síncrona: Por cada operación DML ejecutada, la información modificada es capturada mediante triggers que es implementado automáticamente por Change Data Capture. Las operaciones realizadas por estos triggers forman parte de la transacción.
Cabe mencionar que esta modalidad no soporta el uso de Direct Load Insert.
Esta opción está disponible en las ediciones: Standard Edition y Enterprise Edition.
b) Asíncrona: Por cada escritura realizada en los redo log files, Oracle realiza el mining del redo entry escrito y captura los cambios realizados sobre la tabla publicadora. La captura de los cambios no forma parte de la transacción realizada.
El modo asíncrono no soporta el uso de supplemental logging
Esta opción está disponible solo en la edición Enterprise Edition.
Implementación
En mi escenario real haré el despliegue de la implementación de Change Data Capture Síncrono en una base de datos Oracle Enterprise Edition versión 11gR2 sobre IBM AIX 6.1 en un sistema SAP versión 6.
El objetivo es capturar todos los cambios ocurridos en la tabla VTTS (Tabla funcional de SAP que almacena Etapas de Envío de Documentos del módulo MM Almacenes) del esquema SAPR3.
A continuación detallo la estructura de la tabla VTTS:
Pasos para la Implementación
1) Creación del usuario publicador y subscritor.
2) Creación de una tabla en el esquema publicador que llevará los cambios ocurridos de la tabla VTTS a través del procedure DBMS_CDC_PUBLISH.CREATE_CHANGE_TABLE.
Aquí detallo el script a ejecutar con el usuario publicador.
a) En el campo change_table_name será el nombre de la tabla a crear en el esquema publicador.
b) En los campos source_schema, source_table, column_type_list es información de la tabla origen en este caso SAPR3.VTTS.
c) El campo capture_values indica si una operación de UPDATE se registrará el antiguo valor que tuvo la fila o el nuevo. Esto lo realizamos con los valores OLD y NEW. Con el valor de BOTH se registrará ambos valores.
La salida esperada es la siguiente:
3) Entregamos permisos de lectura a todas las tablas al usuario subscriptor.
4) Creación de la vista del subscriptor.
Cada subscriptor tendrá una vista donde podrá visualizar los cambios ocurridos, esta vista se basa en la información almacenada en la tabla del publicador.
El siguiente gráfico muestra lo referido en las líneas anteriores:
Esto lo realizamos mediante los procedures: DBMS_CDC_SUBSCRIBE.CREATE_SUBSCRIPTION y DBMS_CDC_SUBSCRIBE.SUBSCRIBE.
Aquí detallo el script a ejecutar con el usuario subscriptor.
a) En el primer script creamos la subscripción.
Nota: Si deseamos eliminar una subscripción podemos usar el procedure:
DBMS_CDC_SUBSCRIBE.DROP_SUBSCRIPTION.
b) Se realiza la subscripción.
Las salidas esperadas son las siguiente:
Finalizado la ejecución de este stored procedure debemos validar que la vista haya sido creada.
5) Activación de la subscripción
Esto lo realizamos mediante el procedure:
Hasta este punto la configuración ha sido finalizado, validaremos si está replicando.
6) Set de Pruebas
a) Eliminaremos e Ingresamos un registro en la tabla SAP.VTTS.
b) En la tabla PUBLICADOR.VTTS_CDC deberíamos visualizar dos registro, uno por la operación de DELETE y otro por la operación de INSERT.
c) Veremos que en la vista del subscriptor no hay filas aún.
Esto se debe a que el subscriptor debe periódicamente extraer los cambios registrados en la tabla del publicador, esto lo realiza con el procedure: DBMS_CDC_SUBSCRIBE.EXTEND_WINDOW.
Y al volver a consultar la vista veremos que ya está poblada con los cambios realizados en la tabla VTTS.
Tenemos la opción de limpiar los registros antiguos ya cargados por la vista con el procedure: DBMS_CDC_SUBSCRIBE.PURGE_WINDOW.
Este procedure no limpia la información guardada en la tabla del publicador, como podemos apreciar:
6) Automatización
En mi escenario real, procedí a crear un job mediante el paquete DBMS_SCHEDULE que proceda a leer de la vista del subscriptor para insertarla en el ambiente Data Warehouse y luego limpie la vista, de forma que siempre el job solo lea los últimos registros no llevados al otro ambiente.
Ejemplo del código:
Las siguientes tablas del diccionario de datos están relacionadas al trabajo con Data Capture.
CHANGE_SOURCES | CHANGE_SETS |
CHANGE_TABLES | DBA_SOURCE_TABLES |
DBA_PUBLISHED_COLUMNNS | DBA_SUBSCRIPTIONS |
DBA_SUBSCRIBED_TABLES | DBA_SUBSCRIBED_COLUMNS |
Publicado por Ing. Francisco Riccio. Es un IT Specialist en IBM Perú e instructor de cursos oficiales de certificación Oracle. Está reconocido por Oracle como un Oracle ACE y certificado en productos de Oracle Application & Base de Datos.