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.