Crear una Standby Física de Oracle DataGuard

Introducción

Esta vez vamos a construir un ambiente de DataGuard generando una Standby Física para nuestra instalación Oracle 19c multitenant.

Prerrequisitos

Tenemos una instancia Primaria Oracle 19c multitenant prmydb con una base de datos pluggable taller corriendo en la Virtual Machine Instance patodgprmy en Google Cloud Platform.

Para los pasos de creación de la base de datos revisar Crear una Base de Datos Oracle Multitenant en Modo Silencioso.

Asimismo necesitas otra Virtual Machine Instance patodgstby con el mismo sistema operativo y la misma versión instalada de software de Oracle la cual será nuestro servidor para la Standby Física.

Preparar la Base de Datos Primaria

Necesitamos hacer algunas ajustes en la base de datos tales como archive mode, force logging y standby redo, previo a iniciar la configuración de DataGuard.

Validar el Modo Archive

[oracle@patodgprmy prmydb]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Jun 17 18:20:33 2020
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SQL> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     2
Next log sequence to archive   4
Current log sequence           4

Habilitar el Logging

SQL> ALTER DATABASE FORCE LOGGING;

Database altered.

SQL> SELECT force_logging FROM v$database;

FORCE_LOGGING
---------------------------------------
YES

Configurar el Redo para un Futuro Switchover

SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/oradata/cdbs/PRMYDB/stbyredo1.rdo') SIZE 64M;

Database altered.

SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/oradata/cdbs/PRMYDB/stbyredo2.rdo') SIZE 64M;

Database altered.

SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/oradata/cdbs/PRMYDB/stbyredo3.rdo') SIZE 64M;

Database altered.

SQL> select group#, type, member from v$logfile order by 1;

    GROUP# TYPE    MEMBER
---------- ------- --------------------------------------------------
         1 ONLINE  /oradata/cdbs/PRMYDB/redo01.log
         2 ONLINE  /oradata/cdbs/PRMYDB/redo02.log
         3 ONLINE  /oradata/cdbs/PRMYDB/redo03.log
         4 STANDBY /oradata/cdbs/PRMYDB/stbyredo1.rdo
         5 STANDBY /oradata/cdbs/PRMYDB/stbyredo2.rdo
         6 STANDBY /oradata/cdbs/PRMYDB/stbyredo3.rdo
         7 STANDBY /oradata/cdbs/PRMYDB/stbyredo4.rdo

7 rows selected.

Configurar DataGuard en la Base Primaria

Definir los Parámetros de Inicialización en la Base Primaria

Definir la configuración del archiving para DataGuard con el nombre único de las base de datos miembros de la replicación:

alter system set LOG_ARCHIVE_CONFIG='DG_CONFIG=(prmydb,stbydb)' scope=both;

System altered.

Configura el destino de los archive logs, hacia la Primaria y hacia la Standby:

alter system set LOG_ARCHIVE_DEST_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=prmydb' scope=both;

System altered.

alter system set LOG_ARCHIVE_DEST_2='SERVICE=stbydb ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=stbydb' scope=both;

System altered.

Configura nuestra instancia Standby como el servidore de failover:

alter system set FAL_SERVER=stbydb scope=both;

System altered.

Configura el manejo automático de la creación/modificación de los archivos de datos y también define la conversión de nombres para los archive logs y los archivos de datos de acuerdo con el nombre del directorio de la instancia:

alter system set STANDBY_FILE_MANAGEMENT=AUTO scope=both;

System altered.

SQL> alter system set db_file_name_convert='/STBYDB/','/PRMYDB/' scope=spfile;

System altered.

SQL> alter system set log_file_name_convert='/STBYDB/','/PRMYDB/' scope=spfile;

System altered.

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

Preparar los Datos y Archivos para la Standby

Necesitamos generar un respaldo y algunos archivos de configuracion desde la instancia Primaria.

Generar un Respaldo

En esta ocasión vamos a hacer una respaldo y recuperación offline, siguiendo el procedimiento descrito en el documento Duplicar una Base de Datos Oracle con un Respaldo Offline pero tú puedes intentar otros métodos como el RMAN duplicate.

Entonces montemos la base de datos y hagamos el respaldo:

[oracle@patoracle ~]$ rman target /

Recovery Manager: Release 19.0.0.0.0 - Production on Wed Jun 17 18:32:14 2020
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

connected to target database (not started)

RMAN> startup mount

Oracle instance started
database mounted

RMAN> backup database ;

Starting backup at 17-JUN-20
using channel ORA_DISK_1
channel ORA_DISK_1: starting compressed full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00001 name=/oradata/cdbs/PRMYDB/system01.dbf
input datafile file number=00003 name=/oradata/cdbs/PRMYDB/sysaux01.dbf
input datafile file number=00014 name=/oradata/cdbs/PRMYDB/undotbsp.dbf
input datafile file number=00007 name=/oradata/cdbs/PRMYDB/users01.dbf
channel ORA_DISK_1: starting piece 1 at 17-JUN-20
channel ORA_DISK_1: finished piece 1 at 17-JUN-20
piece handle=/rman/respaldo/PRMYDB_20200617_1av30dhp.bkp tag=TAG20200617T183641 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:35
channel ORA_DISK_1: starting compressed full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00006 name=/oradata/cdbs/PRMYDB/pdbseed/sysaux01.dbf
input datafile file number=00005 name=/oradata/cdbs/PRMYDB/pdbseed/system01.dbf
input datafile file number=00008 name=/oradata/cdbs/PRMYDB/pdbseed/undotbs01.dbf
channel ORA_DISK_1: starting piece 1 at 17-JUN-20
channel ORA_DISK_1: finished piece 1 at 17-JUN-20
piece handle=/rman/respaldo/PRMYDB_20200617_1bv30dis.bkp tag=TAG20200617T183641 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:25
channel ORA_DISK_1: starting compressed full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00010 name=/oradata/pdbs/taller/sysaux01.dbf
input datafile file number=00009 name=/oradata/pdbs/taller/system01.dbf
input datafile file number=00012 name=/oradata/pdbs/taller/datos.dbf
channel ORA_DISK_1: starting piece 1 at 17-JUN-20
channel ORA_DISK_1: finished piece 1 at 17-JUN-20
piece handle=/rman/respaldo/PRMYDB_20200617_1cv30djl.bkp tag=TAG20200617T183641 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:15
Finished backup at 17-JUN-20

Starting Control File and SPFILE Autobackup at 17-JUN-20
piece handle=/rman/controlfile/c-2978577906-20200617-01.bkp comment=NONE
Finished Control File and SPFILE Autobackup at 17-JUN-20

RMAN>

escribe y guarda la etiqueta del backup TAG20200617T183641 para su futura referencia en la restauración.

Generar al Archivo de Control de la Standby

SQL> ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/home/oracle/stbydb.ctl';

Database altered.

Validar o Crear al Archivo de Contraseña

[oracle@patodgprmy ~]$ ls -l $ORACLE_HOME/dbs/orapw*
-rw-r-----. 1 oracle oinstall 6144 Jun 17 18:16 /opt/oracle/product/19c/dbhome_1/dbs/orapwprmydb

si no hay archivo de contraseña puedes crear uno usando la utilería orapwd:

[oracle@patodgprmy ~]$ orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID sysdg=y

Enter password for SYS:

Enter password for SYSDG:

[oracle@patodgprmy ~]$

Crear el Archivo de Inicio de la Standby

Genera un pfile desde el spfile actual:

SQL> CREATE PFILE='/home/oracle/initstbydb.ora' FROM SPFILE;

File created.

y entonces edítalo y modifica sólo los siguientes parámetros con los siguientes valores:

[oracle@patodgprmy ~]$ vi /home/oracle/initstbydb.ora


*.db_file_name_convert='/PRMYDB/','/STBYDB/'
*.db_name=prmydb
...
*.db_unique_name=stbydb
...
*.fal_server='STBYDB'
...
*.log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=stbydb'
*.log_archive_dest_2='SERVICE=prmydb ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=prmydb'
...
*.log_file_name_convert='/PRMYDB/','/STBYDB/'

Preparar la Comunicación

Nuestras máquinas las creamos usando las direcciones estáticas reservadas de nuestra subred patosubnet como se describe en el documento Usar IP Interna Personalizada, y les asignamos las siguientes direcciones IP:

patodgprmy: prmynet (10.20.0.10) y patodgstby: stbynet (10.20.0.20)

Configurar los Listener

Configura los Listener en ambas máquinas usando nuestras direcciones IP internas:

[oracle@patodgprmy ~]$ vi $ORACLE_HOME/network/admin/listener.ora
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.20.0.10)(PORT = 1521))

[oracle@patodgstby ~]$ vi $ORACLE_HOME/network/admin/listener.ora
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.20.0.20)(PORT = 1521))

Iniciar los Listeners

E iniciamos el listener en ambos servers:

[oracle@patodgstby ~}$ lsnrctl start

TNSLSNR for Linux: Version 19.0.0.0.0 - Production
System parameter file is /opt/oracle/product/19c/dbhome_1/network/admin/listener.ora
Log messages written to /opt/oracle/diag/tnslsnr/patodgstby/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.20.0.10)(PORT=1521)))
[oracle@patodgstby ~}$ lsnrctl start

TNSLSNR for Linux: Version 19.0.0.0.0 - Production
System parameter file is /opt/oracle/product/19c/dbhome_1/network/admin/listener.ora
Log messages written to /opt/oracle/diag/tnslsnr/patodgstby/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.20.0.20)(PORT=1521)))

Agregra la Otra Instancia en el TNSNAMES

Necesitamos accesar el servicio de la Primaria desde la Standby y el servicio de la Standby desde la Primaria entonces asegurémonos que ambas bases de datos están registradas en ambos archivos tnsnames.ora:

$ vi $ORACLE_HOME/network/admin/tnsnames.ora

prmydb =
  (DESCRIPTION =
    (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.20.0.10)(PORT = 1521)))
    (CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = prmydb))
  )

stbydb =
  (DESCRIPTION =
    (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.20.0.20)(PORT = 1521)))
    (CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = stbydb))
  )

y entonces probemos que podemos comunicarnos en ambos sentidos:

[oracle@patodgprmy ~]$ tnsping stbydb

TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 17-JUN-2020 19:01:09

Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.20.0.20)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = stbydb)))
OK (0 msec)
[oracle@patodgstby ~]$ tnsping prmydb

TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 17-JUN-2020 19:01:59

Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.20.0.10)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = prmydb)))
OK (0 msec)

Preparar el Servidor Standby

Crear la Estructura de Directorios

Crea los directorios donde los archivos de datos están alojados en la Primaria y también los directorios referidos por el archivo init.ora pero esta vez apuntando al nombre de la nueva instancia:

[oracle@patodgstby ~]$ sudo mkdir /oradata
[oracle@patodgstby ~]$ sudo chown oracle:oinstall /oradata

[oracle@patodgstby ~]$ mkdir /oradata/cdbs
[oracle@patodgstby ~]$ mkdir /oradata/pdbs
[oracle@patodgstby ~]$ mkdir /oradata/recovery
[oracle@patodgstby ~]$ mkdir /oradata/cdbs/STBYDB
[oracle@patodgstby ~]$ mkdir /oradata/recovery/STBYDB

[oracle@patodgstby ~]$ mkdir -p /opt/oracle/admin/stbydb/adump

Copiar los Archivos de Configuración

Copia el Standby init modificado, el Standby controlfile generado y el archivo de contraseña de Oracle hacia el nuevo servidor, en los siguientes lugares y con los siguientes cambios de nombre:

[oracle@patodgprmy ~]$ gcloud config set compute/zone us-central1-f
Updated property [compute/zone].
[oracle@patodgprmy ~]$ gcloud compute scp initstbydb.ora patodgstby:$ORACLE_HOME/dbs 
initstbydb.ora                                              100% 1708     2.3MB/s   00:00
[oracle@patodgprmy ~]$ gcloud compute scp stbydb.ctl patodgstby:/oradata/cdbs/STBYDB/control01.ctl
stbydb.ctl                                                  100%   18MB  36.3MB/s   00:00
[oracle@patodgprmy ~]$ gcloud compute scp stbydb.ctl patodgstby:/oradata/recovery/STBYDB/control02.ctl
stbydb.ctl                                                  100%   18MB  37.2MB/s   00:00
[oracle@patodgprmy ~]$ gcloud compute scp $ORACLE_HOME/dbs/orapwprmydb patodgstby:$ORACLE_HOME/dbs/orapwstbydb
orapwprmydb                                                 100% 6144     2.8MB/s   00:00

Compartir los Archivos de Respaldo

Se requiere que el respaldo generado esté disponible en el servidor Standby. Puedes copiar los archivos del respaldo hacia la otra máquina o hacia un directorio compartido, nosotros vamos a usar nuestro disco de Google para RMAN.
Agrega el disco de RMAN a la nueva Virtual Machine y entonces monta el directorio /rman para que podamos leer el respaldo de la Primaria:

[oracle@patodgstby ~]$ sudo mkdir /rman
[oracle@patodgstby ~]$ sudo chown oracle:oinstall /rman

[oracle@patodgstby ~]$ sudo mount -o discard,defaults /dev/sdb /rman
mount: /dev/sdb is write-protected, mounting read-only

[oracle@patodgstby ~]$ cd /rman
[oracle@patodgstby rman]$ ls
controlfile  lost+found  respaldo

Para más información sobre el disco de RMAN que estamos usando favor de revisar Disco de Google para respaldos de RMAN

Definir las Variables de Oracle

Exporta las siguientes variables de Oracle, para que persistan inclúyelas en tu .bash_profile:

[oracle@patodgstby ~]$ vi .bash_profile

# Database Variables
export ORACLE_BASE=/opt/oracle
export ORACLE_HOME=/opt/oracle/product/19c/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export ORACLE_SID=stbydb

Restaura el Respaldo de la Primaria en la Standby

Ahora que nuestro ambiente está preparado necesitamos conectarnos a RMAN para realizar la restauración.

Restaurar la Base de Datos

Levantamos la base de datos con la opción mount y restauramos nuestra base de datos usando la etiqueta del respaldo offline:

[oracle@patodgstby ~]$ rman target /

Recovery Manager: Release 19.0.0.0.0 - Production on Wed Jun 17 19:57:11 2020
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

connected to target database (not started)

RMAN> startup mount

Oracle instance started
database mounted


RMAN> restore database from tag 'TAG20200617T183641';

Starting restore at 17-JUN-20
Starting implicit crosscheck backup at 17-JUN-20
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=261 device type=DISK
Crosschecked 3 objects
Finished implicit crosscheck backup at 17-JUN-20

Starting implicit crosscheck copy at 17-JUN-20
using channel ORA_DISK_1
Crosschecked 2 objects
Finished implicit crosscheck copy at 17-JUN-20

searching for all files in the recovery area
cataloging files...
no files cataloged

using channel ORA_DISK_1

channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00001 to /oradata/cdbs/STBYDB/system01.dbf
channel ORA_DISK_1: restoring datafile 00003 to /oradata/cdbs/STBYDB/sysaux01.dbf
channel ORA_DISK_1: restoring datafile 00007 to /oradata/cdbs/STBYDB/users01.dbf
channel ORA_DISK_1: restoring datafile 00014 to /oradata/cdbs/STBYDB/undotbsp.dbf
channel ORA_DISK_1: reading from backup piece /rman/respaldo/PRMYDB_PRMYDB_20200617_1av30dhp.bkp
channel ORA_DISK_1: piece handle=/rman/respaldo/PRMYDB_20200617_1av30dhp.bkp tag=TAG20200617T183641
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:55
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00005 to /oradata/cdbs/STBYDB/pdbseed/system01.dbf
channel ORA_DISK_1: restoring datafile 00006 to /oradata/cdbs/STBYDB/pdbseed/sysaux01.dbf
channel ORA_DISK_1: restoring datafile 00008 to /oradata/cdbs/STBYDB/pdbseed/undotbs01.dbf
channel ORA_DISK_1: reading from backup piece /rman/respaldo/PRMYDB_20200617_1bv30dis.bkp
channel ORA_DISK_1: piece handle=/rman/respaldo/PRMYDB_20200617_1bv30dis.bkp tag=TAG20200617T183641
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:25
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00009 to /oradata/pdbs/taller/system01.dbf
channel ORA_DISK_1: restoring datafile 00010 to /oradata/pdbs/taller/sysaux01.dbf
channel ORA_DISK_1: restoring datafile 00012 to /oradata/pdbs/taller/datos.dbf
channel ORA_DISK_1: reading from backup piece /rman/respaldo/PRMYDB_20200617_1cv30djl.bkp
channel ORA_DISK_1: piece handle=/rman/respaldo/PRMYDB_20200617_1cv30djl.bkp tag=TAG20200617T183641
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:25
Finished restore at 17-JUN-20

RMAN> exit

Recovery Manager complete.

DataGuard en la Standby

Iniciar la Recuperación en la Standby

Inciamos la replicación usando el comando alter database recover:

[oracle@patodgstby ~]$ sqlplus / as sysdba

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;

Database altered.

SQL> select name, open_mode, database_role, switchover_status from v$database ;

NAME      OPEN_MODE            DATABASE_ROLE    SWITCHOVER_STATUS
--------- -------------------- ---------------- --------------------
PRMYDB    MOUNTED              PHYSICAL STANDBY TO PRIMARY

SQL>

Validar los Procesos de DataGuard

Revisa que los procesos de DataGuard están en ejecución y la última secuencia está aplicada:


SQL> SELECT ROLE, THREAD#, SEQUENCE#, ACTION FROM V$DATAGUARD_PROCESS;

ROLE                        THREAD#  SEQUENCE# ACTION
------------------------ ---------- ---------- ------------
RFS ping                          1          3 IDLE
recovery apply slave              0          0 IDLE
recovery apply slave              0          0 IDLE
managed recovery                  0          0 IDLE
RFS archive                       0          0 IDLE
archive local                     0          0 IDLE
archive redo                      0          0 IDLE
archive redo                      0          0 IDLE
redo transport timer              0          0 IDLE
archive redo                      0          0 IDLE
gap manager                       0          0 IDLE
redo transport monitor            0          0 IDLE
RFS async                         1          3 IDLE
log writer                        0          0 IDLE
recovery logmerger                1          3 APPLYING_LOG

15 rows selected.

y podemos ver en el registro de alertas que los archive logs están siendo transferidos y aplicados:

[oracle@patodgstby ~]$ cd $ORACLE_BASE/diag/rdbms/stbydb/stbydb/trace/
[oracle@patodgstby trace]$ tail -f alert_stbydb.log

2020-06-17T20:16:05.871028-05:00
 rfs (PID:4757): Primary database is in MAXIMUM PERFORMANCE mode
 rfs (PID:4757): Re-archiving LNO:6 T-1.S-2
2020-06-17T20:16:06.155055-05:00
ARC2 (PID:2756): Archived Log entry 2 added for T-1.S-2 ID 0xb1b5cab6 LAD:1
2020-06-17T20:16:06.219735-05:00
 rfs (PID:4757): Selected LNO:4 for T-1.S-3 dbid 2978577906 branch 1043350981
2020-06-17T20:16:07.082072-05:00
PR00 (PID:3761): Media Recovery Waiting for T-1.S-3 (in transit)
2020-06-17T20:16:07.082724-05:00
Recovery of Online Redo Log: Thread 1 Group 4 Seq 3 Reading mem 0
  Mem# 0: /oradata/cdbs/STBYDB/stbyredo1.rdo

Validar la Replication

Crear Datos y Objetos en la Primaria

En este ejemplo nuestro usuario se conectará a la base de datos pluggable y creará una tabla y le insertará un registro:

[oracle@patodgprmy ~]$ sqlplus /nolog

SQL> conn pato@taller;
Enter password:
Connected.
SQL> create table tdg1 (i1 int, c1 varchar(20), d1 timestamp);

Table created.

SQL> alter table tdg1 add (constraint i1_pk primary key (i1) );

Table altered.

SQL> insert into tdg1 values (1,'DataGuard Test',current_timestamp);

1 row created.

SQL> commit;

Commit complete.

Validar Datos Replicados en la Standby

Deshabilita la replicación y abre la base StandBy en modo lectura para validar que la nueva tabla y sus datos están presentes aquí:

[oracle@patodgstby ~]$ sqlplus / as sysdba

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

Database altered.

SQL> alter database open read only;

Database altered.

SQL> alter pluggable database taller open;

Pluggable database altered.

SQL> alter session set container = taller;

Session altered.

SQL> select * from pato.tdg1 ;

        I2 C2                   D2
---------- -------------------- ------------------------------
         1 DataGuard Test       17-JUN-20 08.20.14.216007 PM

¡Nuestro ambiente de DataGuard está trabajando y los datos y objetos están siendo recuperados de la Primaria hacia la Standby!

Conclusión

Hemos configurado exitosamente un ambiente DataGuard con una Standby Física usando bases de datos Oracle 19c multitenant corriendo en Virtual Machine Instances de la Google Cloud Platform.