Replicación con GoldenGate entre Bases de Datos Pluggables
Introducción
Vamos a configurar una replicación de GoldenGate con Integrated Extract e Integrated Replicat entre dos bases de datos Pluggables PDB
dentro de un Contenedor Multitenant CDB
.
Primero vamos a clonar la base de datos Pluggable actual y entonces configuraremos GoldenGate para mantener ambas bases en sincronía.
Preparar el Ambiente
Tenemos una instancia multitenant en Oracle 19c con un contenedor ORCLCDB
y una PDB taller
y GoldenGate 19c instalado.
Preparar la Base de Datos para la Replicación
El GoldenGate require que configuremos el siguiente parámetro para habilitar la replicación:
[oracle@patoracle ~]$ sqlplus / as sysdba
SQL> alter system set ENABLE_GOLDENGATE_REPLICATION=true scope=both;
System altered.
también es mandatorio tener activados el supplemental log data y el force logging:
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
Database altered.
SQL> ALTER DATABASE FORCE LOGGING;
Database altered.
SQL> ALTER SYSTEM SWITCH LOGFILE;
System altered.
SQL> SELECT supplemental_log_data_min, force_logging FROM v$database;
SUPPLEME FORCE_LOGGING
-------- ---------------------------------------
YES YES
luego creemos el diccionario del LogMiner:
SQL> exec dbms_logmnr_d.build( options => DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);
PL/SQL procedure successfully completed.
y finalmente debemos tener suficiente tiempo de retención del undo, nosotros lo configuraremos a un día:
SQL> alter system set undo_retention = 86400 scope=both;
System altered.
Crear el Usuario de GoldenGate
Crear un usuario de la base de datos para GoldenGate con los privilegios adecuados.
patoracle ~ $ sqlplus / as sysdba
SQL> create USER c##golden IDENTIFIED BY **** container=all;
User created.
SQL> grant RESOURCE, CONNECT to c##golden container=all;
Grant succeeded.
SQL> exec dbms_goldengate_auth.grant_admin_privilege('c##golden',container=>'all');
PL/SQL procedure successfully completed.
SQL> grant UNLIMITED TABLESPACE to c##golden container=all;
Grant succeeded.
Agregar el Usuario al Almacén de Credenciales
Necesitamos agregar la información de inicio de sesión en GoldenGate creando una credentialstore
y alias para el contenedor y bases de datos pluggables:
[golden@patoracle golden]$ ./ggsci
Oracle GoldenGate Command Interpreter for Oracle
Version 19.1.0.0.4 OGGCORE_19.1.0.0.0_PLATFORMS_191017.1054_FBO
GGSCI (patoracle) 1> add credentialstore
Credential store created.
GGSCI (patoracle) 2> alter credentialstore add user c##golden@ORCLCDB alias goldcontainer
Password:
Credential store altered.
GGSCI (patoracle) 3> alter credentialstore add user c##golden@taller alias goldtaller
Password:
Credential store altered.
GGSCI (patoracle) 4> alter credentialstore add user c##golden@estudio alias goldestudio
Password:
Credential store altered.
GGSCI (patoracle) 5> info credentialstore
Reading from credential store:
Default domain: OracleGoldenGate
Alias: goldcontainer
Userid: c##golden@ORCLCDB
Alias: goldtaller
Userid: c##golden@taller
Alias: goldestudio
Userid: c##golden@estudio
Agregar Trandata para el Schema
Debemos activar la trandata para el schema que necesitamos replicar, para hacer esto nos conectamos a la base pluggable:
GGSCI (patoracle) 1> DBLOGIN USERIDALIAS goldtaller
Successfully logged into database TALLER.
GGSCI (patoracle as c##golden@ORCLCDB/TALLER) 2> ADD SCHEMATRANDATA taller.perro
2020-05-13 13:40:31 INFO OGG-01788 SCHEMATRANDATA has been added on schema "perro".
2020-05-13 13:40:31 INFO OGG-01976 SCHEMATRANDATA for scheduling columns has been added on schema "perro".
2020-05-13 13:40:31 INFO OGG-10154 Schema level PREPARECSN set to mode NOWAIT on schema "perro".
2020-05-13 13:40:34 INFO OGG-10471 ***** Oracle Goldengate support information on table PERRO.T1 *****
Oracle Goldengate support native capture on table PERRO.T1.
Oracle Goldengate marked following column as key columns on table PERRO.T1: I1.
Tomar un Snapshot de la Base de Datos
Finalmente necesitamos un snapshot
de nuestra base de datos pluggable para que sea el punto inicial de la clonación-replicación.
[oracle@patoracle ~]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Wed May 13 13:01:52 2020
Version 19.3.0.0.0
SQL> alter session set container = taller;
Session altered.
SQL> alter pluggable database taller close immediate;
Pluggable database altered.
SQL> alter pluggable database taller open read only;
Pluggable database altered.
SQL> alter pluggable database SNAPSHOT taller_snap_20200513;
Pluggable database altered.
SQL> select con_name, snapshot_name, snapshot_scn from cdb_pdb_snapshots ;
CON_NAME SNAPSHOT_NAME SNAPSHOT_SCN
---------- ------------------------- ------------
TALLER TALLER_SNAP_20200513 2308750
SQL>
Escribe el SCN de este snapshot, lo vamos a utilizar como el punto de inicio de la replicación.
Crear el Integrated Extract
Prámetros del Extract
En GoldenGate crea el archivo de parámetros definiendo su nombre, las variables de Oracle, el alias de inicio de sesión, el extrail y las tablas a extraer:
[golden@patoracle golden]$ ./ggsci
GGSCI (patoracle) 1> edit params extpato
EXTRACT extpato
SETENV (ORACLE_SID='ORCLCDB')
SETENV (ORACLE_HOME = '/opt/oracle/product/19c/dbhome_1')
USERIDALIAS goldcontainer
LOGALLSUPCOLS
DDL INCLUDE MAPPED SOURCECATALOG taller
EXTTRAIL /golden/dirdat/tr
TABLE taller.perro.*;
Agregar el Extract a GoldenGate
Vamos a agregar el Integrated Extract empezando en el SCN del snapshot que tomamos a la base de datos pluggable.
GGSCI (patoracle) 2> ADD EXTRACT extpato, INTEGRATED TRANLOG, SCN 2308750
EXTRACT (Integrated) added.
GGSCI (patoracle) 3> ADD EXTTRAIL /golden/dirdat/tr, EXTRACT extpato
EXTTRAIL added.
Registrar el Extract en la Base de Datos
Necesitamos registrar nuesto Integrated Extract apuntando a un SCN anterior al momento del snapshot donde el diccionario del LogMiner haya iniciado:
SQL> SELECT max(first_change#) as extract_scn from v$archived_log
where dictionary_begin = 'YES' and first_change# < 2308750 ;
EXTRACT_SCN
-----------
2190137
entonces nos conectamos al contenedor multitenant y registramos el Extract con el SCN del diccionario, especificando además la base pluggable origen:
GGSCI (patoracle) 4> DBLOGIN USERIDALIAS goldcontainer
Successfully logged into database CDB$ROOT.
GGSCI (patoracle as c##golden@ORCLCDB/CDB$ROOT) 5> REGISTER EXTRACT extpato DATABASE CONTAINER (taller) SCN 2190137
2020-05-13 13:38:44 INFO OGG-02003 Extract EXTPATO successfully registered with database at SCN 2190502.
Crear el Integrated Replicat
Clonar la Base de Datos
Una vez que todo está hecho en el lado origen, empecemos en el lado destino clonando la base de datos pluggable taller
hacia una nueva base pluggable estudio
usando el snapshot taller_snap_20200513
:
[oracle@patoracle ~]$ sqlplus / as sysdba
SQL> CREATE PLUGGABLE DATABASE estudio FROM taller
USING SNAPSHOT TALLER_SNAP_20200513
STORAGE (MAXSIZE 2G)
DEFAULT TABLESPACE datos
CREATE_FILE_DEST = '/oradata/pdbs/estudio/'
2 3 4 5 6 ;
Pluggable database created.
SQL> alter pluggable database estudio open;
Pluggable database altered.
Agregar la Tabla de Checkpoint
Cuando la nueva base de datos esté creada debemos a agregar una tabla checkpointtable
para el control de la replicación.
[golden@patoracle golden]$ ./ggsci
GGSCI (patoracle) 1> DBLOGIN USERIDALIAS goldcontainer
Successfully logged into database CDB$ROOT.
GGSCI (patoracle as c##golden@ORCLCDB/CDB$ROOT) 2> ADD CHECKPOINTTABLE estudio.c##golden.checkpointable
Successfully created checkpoint table estudio.c##golden.checkpointable.
y luego agregamos el nombre de la tabla al archivo GLOBALS
:
GGSCI (patoracle) 1> EDIT PARAMS ./GLOBALS
CHECKPOINTTABLE estudio.c##golden.checkpointable
Parámetros del Replicat
En GoldenGate crea el archivo de parámetros definiendo su nombre, el alias de inicio de sesión, y el mapeo de las tablas del origen hacia el destino:
GGSCI (patoracle) 1> edit params repato
REPLICAT repato
DBOPTIONS INTEGRATEDPARAMS(parallelism 2)
USERIDALIAS goldestudio
ASSUMETARGETDEFS
DDL INCLUDE ALL
MAP taller.perro.*, TARGET estudio.perro.*;
Agregar el Replicat en GoldenGate
Vamos a agregar el Integrated Replicat especificando el extrail origen y poniendo que inicie en el principio del primer archivo trail. Además especificamos la tabla de control:
GGSCI (patoracle) 2> ADD REPLICAT repato, integrated, EXTTRAIL /golden/dirdat/tr, EXTSEQNO 0, EXTRBA 0, CHECKPOINTTABLE estudio.c##golden.checkpointable
REPLICAT (Integrated) added.
Probar la Replicación
Agregar Datos en el Origen
Antes de empezar la repliación vamos a agregar algunos datos para que sean capturados por el Extract y el Replicat cuando inicien:
[oracle@patoracle ~]$ sqlplus /nolog
SQL> conn perro@taller;
Enter password:
Connected.
SQL> insert into t1 values (100,'Before Replication',current_timestamp);
1 row created.
Iniciar la Replicación
Iniciemos la replicación y revisemos los archivos de reporte del Extract y el Replicat para validar que los datos son capturados y mapeados.
Iniciemos el Extract y validemos si está en ejecución:
GGSCI (patoracle) 1> start extract extpato
Sending START request to MANAGER ...
EXTRACT EXTPATO starting
GGSCI (patoracle) 2> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING EXTPATO 00:00:00 00:00:05
REPLICAT STOPPED REPATO 00:00:00 00:06:49
y entonces revisemos la salida del Extract en el directorio dirrpt
:
[oracle@patoracle ~]$ cd dirrpt
[golden@patoracle dirrpt]$ more EXTPATO.rpt
...
2020-05-13 14:39:11 INFO OGG-06508 Wildcard MAP (TABLE) resolved (entry taller.perro.*): TABLE "TALLER"."PERRO"."T1".
2020-05-13 14:39:11 WARNING OGG-02180 Table TALLER.PERRO.T1 will use legacy trail format to support parameter LOGALLSUPCOLS.
2020-05-13 14:39:11 INFO OGG-06509 Using the following key columns for source table TALLER.PERRO.T1: I1.
¡Podemos ver que los datos están siendo capturados!
Iniciemos el Replicat y validemos si está en ejecución:
GGSCI (patoracle) 3> start repato
Sending START request to MANAGER ...
REPLICAT REPATO starting
GGSCI (patoracle) 7> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING EXTPATO 00:00:00 00:00:05
REPLICAT RUNNING REPATO 00:00:00 00:00:09
y entonces revisemos la salida del Replicat en el directorio dirrpt
:
[golden@patoracle dirrpt]$ more REPATO.rpt
...
2020-05-13 14:46:24 INFO OGG-06506 Wildcard MAP resolved (entry taller.perro.*): MAP "TALLER"."PERRO"."T1", TARGET estudio.perro."T1".
2020-05-13 14:46:29 INFO OGG-02756 The definition for table TALLER.PERRO.T1 is obtained from the trail file.
2020-05-13 14:46:29 INFO OGG-06511 Using following columns in default map by name: I1, C2, D3.
2020-05-13 14:46:29 INFO OGG-06510 Using the following key columns for target table ESTUDIO.PERRO.T1: I1.
¡Podemos ver que los datos están siendo mapeados!
Validar la Replicación
Conéctate a la base de datos pluggable origen y generemos más datos y objetos:
[oracle@patoracle ~]$ sqlplus /nolog
SQL> conn perro@taller;
Enter password:
Connected.
SQL> insert into t1 values (101,'After Replication',current_timestamp);
1 row created.
SQL> create table t2 (i2 int, c2 varchar(20), d2 timestamp);
Table created.
SQL> alter table t2 add (constraint i2_pk primary key (i2) );
Table altered.
SQL> insert into t2 values (1,'New Table',current_timestamp);
1 row created.
SQL> commit;
y luego validemos que los datos y objetos han sido replicados en la base de datos pluggable destino:
[oracle@patoracle ~]$ sqlplus /nolog
SQL> conn perro@estudio
Enter password:
Connected.
SQL> select count(*) from t1;
COUNT(*)
----------
6
SQL> select * from t1 where i1 >= 100 order by 1;
I1 C2 D3
---------- -------------------- ------------------------------
100 Before Replication 13-MAY-20 14.11.20.045306 PM
101 After Replication 13-MAY-20 14.32.17.829542 PM
SQL> select * from t2 ;
I2 C2 D2
---------- -------------------- ------------------------------
1 New Table 13-MAY-20 14.35.22.792098 PM
¡Podemos ver que los datos y objectos están siendo replicados!
Conclusión
Hemos validado que podemos hacer un clon de nuestra basde datos pluggable y mantenerlo actualizado usando la replicación de GoldenGate. El proceso es similar al que seguimos en un ambiente no multitenant, solo tenemos que tomar en cuenta las particularidades del contenedor y la base de datos pluggable.