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) ypatodgstby
: 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.