Replicación entre IBM DB2 LUW y Oracle Database utilizando Oracle GoldenGate Parte I.
Introducción:
Hoy en dia es un hecho comun que las organizaciones utilicen varios sistemas RDBMS de diferentes proveedores como Oracle, IBM DB2, MS SQL, Postgres, MySQL entre otros. En algunos casos puede surgir la necesidad de unificar todos dentro de un mismo sistema o de acoplar varios sistemas. En casos como estos, necesitamos migrar o replicar datos entre sistemas que en la mayoría de los casos podría ser una tarea desalentadora sin tener la herramienta adecuada y el plan adecuado para el trabajo.
En el siguiente articulo, se presentará una carga de datos inicial seguida de su posterior replicación desde una base de datos IBM DB2 LUW hacia una base de datos Oracle 12c mediante Oracle GoldenGate.
Configuración del ambiente
Base de datos Origen: Sistema operativo: Oracle Virtual Box con SUSE Enterprise Linux 12.3 Database: IBM DB2 10.5.7.1 Oracle GoldenGate: Oracle GoldenGate v12.2.0.1.1 Hostname: db2linux IP address: 192.168.56.111
Base de datos Destino: Sistema operativo: Oracle Virtual Box con Oracle Enterprise Linux 6.5 Oracle Database: Oracle Database 12c v12.1.0.2.0 Oracle GoldenGate: Oracle GoldenGate v12.2.0.1.1 Hostname: orcl IP address: 192.168.56.101
En esta serie de articulos, primero cubriremos la carga inicial. En la segunda parte, cubriremos la replicacion unidireccional y bidireccional.
Configuración de la migración inicial de objetos
Para llevar a cabo la migración inicial de objetos utilizaremos la característica de migración provista por Oracle SQL Developer. El primer paso es establecer una conexión hacia la base de datos de SAMPLE de IBM DB2. Puedes utilizar SQL Developer para conectarte y navegar sobre una base de datos no-Oracle instalando el componente JDBC de IBM DB2 en la opción Third Party JDBC drivers
Menú Tools ->Preferences->Database->Third party JDBC Drivers

Para obtener los archivos del driver JDBC de IBM DB2, descárgalos desde la página de soporte de IBM DB2o cópialos desde el directorio de instalación de DB2, en nuestro caso está ubicado en /opt/ibm/db2/V10.5/java. Despliega los archivos db2jcc4.jar y db2jcc_license_cu.jar en tu directorio local y agrégalos a SQL Developer utilizando el botón de Add Entry.
A continuación, debemos crear una conexión hacia la base de datos SAMPLE de IBM DB2. La base de datos SAMPLE es utilizada normalmente en tutoriales sobre DB2 y puede ser creada con el comando db2sampl. Crea una conexión hacia la base de datos DB2 con el nombre SAMPLE utilizando el hostname db2linux, usuario db2inst1, puerto 50001 y contraseña en nuestro caso es test1234.

Prueba la conexión hacia la base de datos SAMPLE y despliega el listado de tablas. Todas las tablas serán migradas como demostraremos en el resto de este artículo.

SQL Developer utilizara un repositorio para realizar migraciones en Oracle. A continuación, vamos a crear un usuario que será el dueño del repositorio, llamado SQLMIGR como se muestra:
SQL> create user sqlmigr identified by test1234; User created. SQL> grant connect,resource,create view to sqlmigr; Grant succeeded. SQL> alter user sqlmirg quota unlimited on users; User altered.
Como usuario root crea un directorio para los archivos de migración y asignar a oracle como dueño del directorio.
[root@orcl sqldeveloper]# mkdir /migrfiles [root@orcl sqldeveloper]# chown -R oracle:oinstall /migrfiles/
A continuación, procedemos a instalar el repositorio. Ve al menú Tools->Migration…->Migrate. El asistente de migración se iniciará, crea una conexión llamada SQLMIGR utilizando el usuario SQLMIGR y la contraseña test1234, luego da click sobre el botón Next y el repositorio de migración será creado.

Una vez haya sido creado el repositorio el asistente procederá con el siguiente paso para el proyecto de migración. Nómbralo db2tooracleproj y selecciona la ubicación para los scripts de migración como se muestra:

El siguiente paso es seleccionar la base de datos origen, en nuestro caso será la base de datos SAMPLE. Utiliza el modo Online seleccionado por default:

Presiona el botón Next, en el listado de bases de datos tendremos SAMPLE. Esta es la que vamos a utilizar así que solo presiona Next.

A continuacion, llegaremos al paso de conversión del asistente. El listado contiene los tipos standard de conversión de DB2 a Oracle. En este paso, puedes configurar cualquier preferencia que desees y luego click sobre el botón Next.

El siguiente paso está relacionado con traducciones desde SQL PL hacia PL/SQL (procedimientos, funciones y triggers) y traducciones de constraints y vistas.

A continuación, selecciona la base de datos destino. Aquí, elegiremos el modo offline, todo el código de migración se escribirá en archivos. Como no tenemos interés en migración de datos (esta se hara con GoldenGate) seleccionaremos también la opción ‘Proceed to Summary Page’

Presiona Finish. Una ventana emergente de migración iniciara.

Una vez que los scripts de migración hayan sido creados, navega hacia el directorio
Una vez hayan sido creados los scripts de migración, navega hacia el directorio destino (/migrfiles/db2tooracleproj/generated/2016-05-15_11-58-06) y ejecuta el script master.sql conectado como usuario dba. Por default las tablas serán colocadas dentro del usuario utilizado para la conectarse con DB2, es decir DB2INST1, usuarios y nombres de tablas pueden ser personalizados dentro del script si lo deseas.
En nuestro caso preferimos ejecutar el script sin realizar ninguna modificación.
Ignora cualquier error relacionado a vistas, procedimientos almacenados o funciones. El punto principal es tener las tablas, índices y constraints creados correctamente.
Al ser una carga inicial, deshabilitaremos todos los contraints foráneos, de otra manera la replicación fallaría. Volveremos a habilitarlos una vez terminada la carga inicial.
Como usuario db2inst1 ejecuta:
SQL> declare v_str varchar2(300); cursor t_cur is select table_name,constraint_name from user_constraints where constraint_type='R'; begin for r in t_cur loop execute immediate 'ALTER TABLE ' || r.table_name ||' DISABLE CONSTRAINT ' || r.constraint_name ; end loop; end; SQL> PL/SQL procedure successfully completed.
Carga inicial desde DB2 hacia Oracle
Configura Oracle GoldenGate para IBM DB2 LUW
Para el resto de esta serie de artículos, utilizaremos el usuario ggs_admin para las operaciones relacionadas con GoldenGate.
IBM DB2 utiliza administración de usuarios externa, no existe un concepto similar al de usuarios de bases de datos exclusivos, un poco diferente a lo que estamos acostumbrados a trabajar en Oracle. En Oracle, este tipo de autenticación es llamada autenticación externa. Por lo tanto, lo primero que debemos hacer es crear un usuario a nivel de sistema operativo y luego otorgar privilegios desde DB2 directamente.
Como usuario root crearemos el usuario ggs_admin, después, desde DB2, otorgaremos privilegios de administrador de base de datos (DBADM) como se muestra:
db2inst1@db2linux:~> db2 'connect to sample' Database Connection Information Database server = DB2/LINUXX8664 10.5.7 SQL authorization ID = DB2INST1 Local database alias = SAMPLE db2inst1@db2linux:~> db2 'grant dbadm on database to user ggs_admin' DB20000I The SQL command completed successfully. db2inst1@db2linux:~>
Hemos extraído los archivos de Oracle GoldenGate para DB2 LUW en el directorio /u01/goldengate12c con el usuario db2inst1 como dueño y creado los subdirectorios necesarios como se muestra:
GGSCI (db2linux) 4> create subdirs Creating subdirectories under current directory /u01/goldengate12c Parameter files /u01/goldengate12c/dirprm: created Report files /u01/goldengate12c/dirrpt: created Checkpoint files /u01/goldengate12c/dirchk: created Process status files /u01/goldengate12c/dirpcs: created SQL script files /u01/goldengate12c/dirsql: created Database definitions files /u01/goldengate12c/dirdef: created Extract data files /u01/goldengate12c/dirdat: created Temporary files /u01/goldengate12c/dirtmp: created Credential store files /u01/goldengate12c/dircrd: created Masterkey wallet files /u01/goldengate12c/dirwlt: created Dump files /u01/goldengate12c/dirdmp: created
Configura e inicia el proceso Manager. Utilizaremos el puerto 7890 del lado de IBM DB2.
db2inst1@db2linux:/u01/goldengate12c> ./ggsci Oracle GoldenGate Command Interpreter for DB2 Version 12.2.0.1.1 OGGCORE_12.2.0.1.0_PLATFORMS_151211.1401 Linux, x64, 64bit (optimized), DB2 10.5 on Dec 11 2015 22:49:17 Operating system character set identified as UTF-8. Copyright (C) 1995, 2015, Oracle and/or its affiliates. All rights reserved. GGSCI (db2linux) 1> edit params mgr PORT 7890 GGSCI (db2linux) 1> start mgr
A continuación, crea el archivo de parámetros del proceso Extract llamado DB2ORALD y agrega los parámetros como sigue:
GGSCI (db2linux) 1> edit params DB2ORALD EXTRACT DB2ORALD SOURCEDB SAMPLE USERIDALIAS ggs_admin rmthost orcl, mgrport 7809 rmttask replicat, group lddb2 table DB2INST1.PROJECT; table DB2INST1.PROJACT ; table DB2INST1.ACT ; table DB2INST1.IN_TRAY; table DB2INST1.ORG; table DB2INST1.STAFF; table DB2INST1.SALES; table DB2INST1.STAFFG; table DB2INST1.EMPMDC; table DB2INST1.PRODUCT; table DB2INST1.INVENTORY; table DB2INST1.CUSTOMER; table DB2INST1.PURCHASEORDER; table DB2INST1.CATALOG; table DB2INST1.CL_SCHED; table DB2INST1.DEPARTMENT; table DB2INST1.EMPPROJACT; table DB2INST1.EMPLOYEE; table DB2INST1.EMP_PHOTO; table DB2INST1.EMP_RESUME; table DB2INST1.SUPPLIERS; table DB2INST1.PRODUCTSUPPLIER;
Configura el proceso Extract para una carga inicial como sigue:
GGSCI (db2linux) 8> add extract db2orald, sourceistable EXTRACT added.
Configuración de GoldenGate en el lado de Oracle Database
Configura el proceso Manager, asigna el puerto 7809 y otorga privilegios de acceso desde db2linux como se muestra:
GGSCI (orcl) 1> edit params mgr PORT 7809 ACCESSRULE, PROG *, IPADDR 192.168.56.111, ALLOW GGSCI (orcl) 1> start mgr
Configura el proceso Replicat para una carga inicial, nómbralo LDDB2 y define sus parámetros como sigue:
GGSCI (orcl) 1> edit params LDDB2 replicat LDDB2 SETENV (ORACLE_SID=ORCL) userid ggs_admin, password ggs_admin Handlecollisions Assumetargetdefs MAP DB2INST1.*, TARGET DB2INST1.*
Configura el proceso Replicat como specialrun (la cláusula specialrun permite al proceso Replicat ejecutarse directamente sin crear checkpoints intermediarios):
GGSCI (orcl) 71> add replicat LDDB2, specialrun REPLICAT added.
La carga inicial
Desde el lado de DB2 inicia el proceso Extract:
GGSCI (db2linux) 13> start db2orald Sending START request to MANAGER ... EXTRACT DB2ORALD starting
Si ejecutas un comando tail sobre el archivo ggserr.log podrás observar que el proceso ha sido iniciado:
2016-05-15 11:25:05 INFO OGG-00993 Oracle GoldenGate Capture for DB2, db2orald.prm: EXTRACT DB2ORALD started. 2016-05-15 11:25:11 INFO OGG-02911 Oracle GoldenGate Capture for DB2, db2orald.prm: Processing table DB2INST1.PROJECT. 2016-05-15 11:25:16 INFO OGG-02911 Oracle GoldenGate Capture for DB2, db2orald.prm: Processing table DB2INST1.PROJACT. 2016-05-15 11:25:18 INFO OGG-02911 Oracle GoldenGate Capture for DB2, db2orald.prm: Processing table DB2INST1.ACT. 2016-05-15 11:25:20 INFO OGG-02911 Oracle GoldenGate Capture for DB2, db2orald.prm: Processing table DB2INST1.IN_TRAY. 2016-05-15 11:25:20 INFO OGG-02911 Oracle GoldenGate Capture for DB2, db2orald.prm: Processing table DB2INST1.ORG. 2016-05-15 11:25:20 INFO OGG-02911 Oracle GoldenGate Capture for DB2, db2orald.prm: Processing table DB2INST1.STAFF. 2016-05-15 11:25:21 INFO OGG-02911 Oracle GoldenGate Capture for DB2, db2orald.prm: Processing table DB2INST1.SALES. 2016-05-15 11:25:24 INFO OGG-02911 Oracle GoldenGate Capture for DB2, db2orald.prm: Processing table DB2INST1.STAFFG. 2016-05-15 11:25:25 INFO OGG-02911 Oracle GoldenGate Capture for DB2, db2orald.prm: Processing table DB2INST1.EMPMDC. 2016-05-15 11:25:28 INFO OGG-02911 Oracle GoldenGate Capture for DB2, db2orald.prm: Processing table DB2INST1.PRODUCT. 2016-05-15 11:25:32 INFO OGG-02911 Oracle GoldenGate Capture for DB2, db2orald.prm: Processing table DB2INST1.INVENTORY. 2016-05-15 11:25:38 INFO OGG-02911 Oracle GoldenGate Capture for DB2, db2orald.prm: Processing table DB2INST1.CUSTOMER. 2016-05-15 11:25:44 INFO OGG-02911 Oracle GoldenGate Capture for DB2, db2orald.prm: Processing table DB2INST1.PURCHASEORDER. 2016-05-15 11:25:50 INFO OGG-02911 Oracle GoldenGate Capture for DB2, db2orald.prm: Processing table DB2INST1.CATALOG. 2016-05-15 11:25:51 INFO OGG-02911 Oracle GoldenGate Capture for DB2, db2orald.prm: Processing table DB2INST1.CL_SCHED. 2016-05-15 11:25:59 INFO OGG-02911 Oracle GoldenGate Capture for DB2, db2orald.prm: Processing table DB2INST1.DEPARTMENT. 2016-05-15 11:26:08 INFO OGG-02911 Oracle GoldenGate Capture for DB2, db2orald.prm: Processing table DB2INST1.EMPPROJACT. 2016-05-15 11:26:13 INFO OGG-02911 Oracle GoldenGate Capture for DB2, db2orald.prm: Processing table DB2INST1.EMPLOYEE. 2016-05-15 11:26:19 INFO OGG-02911 Oracle GoldenGate Capture for DB2, db2orald.prm: Processing table DB2INST1.EMP_PHOTO. 2016-05-15 11:26:27 INFO OGG-02911 Oracle GoldenGate Capture for DB2, db2orald.prm: Processing table DB2INST1.EMP_RESUME. 2016-05-15 11:26:39 INFO OGG-02911 Oracle GoldenGate Capture for DB2, db2orald.prm: Processing table DB2INST1.SUPPLIERS. 2016-05-15 11:26:44 INFO OGG-02911 Oracle GoldenGate Capture for DB2, db2orald.prm: Processing table DB2INST1.PRODUCTSUPPLIER. 2016-05-15 11:26:50 INFO OGG-00991 Oracle GoldenGate Capture for DB2, db2orald.prm: EXTRACT DB2ORALD stopped normally.
Presta especial atención a los campos con tipo de dato como XMLType y DECFLOAT, estos tipos de datos no son soportados por GoldenGate. Para estos casos, debe utilizarse un método diferente para migrar estos campos hacia Oracle, convierte los campos XMLType a tipo de dato BLOB o CLOB, los campos DECFLOAT pueden ser convertidos a DECIMAL o replicarlos después de la migración de manera programática. A continuación se muestra un mensaje desde el archivo ggser.log desde el lado de DB2 que involucre un tipo de dato XMLType:
2016-05-15 11:25:05 WARNING OGG-05506 Oracle GoldenGate Capture for DB2, db2orald.prm: Table DB2INST1.SUPPLIERS, column ADDR, contains an unsupported data type: XML.The column will be excluded.
Finalmente, activa de nuevo los constraints de llaves foráneas que habíamos desactivado:
Como usuario db2inst ejecuta:
declare v_str varchar2(300); cursor t_cur is select table_name,constraint_name from user_constraints where constraint_type='R'; begin for r in t_cur loop execute immediate 'ALTER TABLE ' || r.table_name ||' ENABLE CONSTRAINT ' || r.constraint_name ; end loop; end; PL/SQL procedure successfully completed.
Conclusión
En este artículo, hemos demostrado una carga uncial de datos desde IBM DB2 LUW hacia Oracle 12c utilizando Oracle GoldenGate 12c. Hemos utilizado además la base de datos SAMPLE de DB2, convertido y creado las tablas a sintaxis de Oracle y ejecutado en una base de datos Oracle llamada ORCL utilizando SQL Developer. Este escenario puede ser utilizado para una migración de datos o para preparan un ambiente de replicación que será demostrado en la parte II de esta serie de artículos. En resumen, los pasos fueron los siguientes:
- Crear una conexión hacia la base de datos DB2.
- Crear un repositorio de migración o utilizar uno existente.
- Crear un Proyecto de migración y generar los scripts DDL.
- Ejecutar los scripts DDL sobre la base de datos Oracle.
- Instalar Oracle GoldenGate en el servidor fuente y destino.
- Crear usuarios de base de datos adicionales para la administración de GoldenGate.
- Configurar los procesos Manager, Extract y Replicat en origen y destino.
- Ejecutar la carga inicial.
- Resolución de problemas.
Comentarios
Publicar un comentario