Skip to main content

[OCI]19c Dataguard y Physical Standby desde una Custom Image.

Updated 7 min readMarkdown
Part of seriesOCI
[OCI]19c Dataguard  y Physical Standby desde una Custom Image.

En el artículo de hoy vamos a definir un laboratorio con Oracle Dataguard 19 en OCI. Con lo que necesitaremos definir dos IaaS.

La idea del laboratorio es la siguiente:

Como podemos ver, vamos a definir dg-primary y dg-standby. En este laboratorio, para no tener que hacer dos configuraciones, lo que haremos es configurar en dg-primary casi todo y crear una Custom image en OCI antes de crear la base de datos. Definiremos dg-standby basándonos en la imagen que hemos definido, tampoco vamos a crear ninguna base de datos ahí, sino que haremos directamente un rman duplicate from active database.

Así que vamos ello.

dg-primary

De esta máquina es donde vamos a definir nuestra Custom image. Pero antes de ese paso, necesitamos configurarlo todo sin crear la base de datos.

Los pasos que vamos hacer a grandes rasgos son:

Es decir:

  • Preinstall-19c. Una vez instalado, definiremos los directorios de oracle junto con la definición de las variables en el .bashrc.
[root@primary ~]$ dnf update -y
[root@primary ~]$ dnf install -y oracle-database-preinstall-19c
[root@primary ~]$ mkdir -p /u01/app/oracle/product/19.0.0/dbhome_1
[root@primary ~]$ mkdir -p /u01/app/oraInventory
[root@primary ~]$ mkdir -p /u01/software
[root@primary ~]$ chown -R oracle:oinstall /u01
[root@primary ~]$ chmod -R 775 /u01 
  • Unzip 19.3, descargamos de aquí la versión.
[oracle@primary ~]$ mv /tmp/LINUX.X64_193000_db_home.zip /u01/software/
[oracle@primary ~]$ cd $ORACLE_HOME
[oracle@primary ~]$ unzip /u01/software/LINUX.X64_193000_db_home.zip
  • Actualizamos oPatch (Path 6880880).
[oracle@primary ~]$ cd $ORACLE_HOME
[oracle@primary ~]$ mv OPatch OPatch.old
[oracle@primary ~]$ unzip /tmp/p6880880_190000_Linux-x86-64.zip 
[oracle@primary dbhome_1]$ $ORACLE_HOME/OPatch/opatch version
OPatch Version: 12.2.0.1.55

OPatch succeeded.
  • Unzip RU, en este caso la RU 19.32 (Path 39472050 ). Actualmente ya esta la RU 19.33, pero eso la dejaremos para más adelante.
[oracle@primary software]$ unzip /tmp/p39472050_190000_Linux-x86-64.zip 

Además vamos aplicar los siguientes one-offs que Oracle nos indica.

Esta información se puede consultar aquí.

Con lo que descargamos a mayores los parches: 39932578,39544247 y 39388682.

[oracle@primary software]$ unzip /tmp/p39388682_1932000DBRU_Generic.zip
[oracle@primary software]$ unzip /tmp/p39544247_1932000DBRU_Linux-x86-64.zip
[oracle@primary software]$ unzip /tmp/p39932578_1932000OCWRU_Linux-x86-64.zip
  • runInstaller en modo silent.
[oracle@primary software]$ cd $ORACLE_HOME
[oracle@primary software]$ ./runInstaller \
  -silent \
  -waitforcompletion \
  -applyRU /u01/software/39472050 \
  -applyOneOffs /u01/software/39932578,/u01/software/39544247,/u01/software/39388682 \
  oracle.install.option=INSTALL_DB_SWONLY \
  UNIX_GROUP_NAME=oinstall \
  INVENTORY_LOCATION=/u01/app/oraInventory \
  ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1 \
  ORACLE_BASE=/u01/app/oracle \
  oracle.install.db.InstallEdition=EE \
  oracle.install.db.OSDBA_GROUP=dba \
  oracle.install.db.OSOPER_GROUP=oper \
  oracle.install.db.OSBACKUPDBA_GROUP=backupdba \
  oracle.install.db.OSDGDBA_GROUP=dgdba \
  oracle.install.db.OSKMDBA_GROUP=kmdba \
  oracle.install.db.OSRACDBA_GROUP=racdba \
  SECURITY_UPDATES_VIA_MYORACLESUPPORT=false \
  DECLINE_SECURITY_UPDATES=true

Verificamos:

[oracle@primary ~]$ sqlplus -v

SQL*Plus: Release 19.0.0.0.0 - Production
Version 19.32.0.0.0

Custom image en OCI

Ahora que ya tenemos la máquina lista, es decir, sin crear la base de datos, es el momento de definir la imagen.

En OCI, en los detalles de la instancia, hacemos lo siguiente:

Una vez creada, para ver nuestra imagen vamos a Compute> Custom Images:

Ahí vemos la imagen que acabamos de definir:

dg-standby

Ahora definiremos la standby partiendo de la imagen que hemos definido previamente.

Cuando estamos definiendo la IaaS, donde pone change image, pulsamos ahí:

Ahí nos aparece la siguiente ventana, iríamos a My Images y seleccionamos la Custom image:

El resto de detalles lo ponemos acorde a nuestra tenancy.

Una vez terminado la creación de la IaaS, verificamos:

[oracle@dg-standby ~]$ sqlplus -v

SQL*Plus: Release 19.0.0.0.0 - Production
Version 19.32.0.0.0

Creación de CDB1

Vamos a definir la base de datos con dbca en modo silent en dg-primary.

[root@primary ~]# su - oracle
[oracle@primary ~]$ export ORACLE_SID=CDB1
[oracle@primary ~]$ 
$ORACLE_HOME/bin/dbca -silent -createDatabase \
  -templateName General_Purpose.dbc \
  -gdbName CDB1 \
  -sid CDB1 \
  -createAsContainerDatabase true \
  -numberOfPDBs 1 \
  -pdbName PDB1 \
  -useLocalUndoForPDBs true \
  -sysPassword 'XXXXXX' \
  -systemPassword 'XXXXXX' \
  -pdbAdminPassword 'XXXXXX' \
  -databaseConfigType SINGLE \
  -storageType FS \
  -datafileDestination /u01/app/oracle/oradata \
  -useOMF true \
  -recoveryAreaDestination /u01/app/oracle/fast_recovery_area \
  -recoveryAreaSize 10240 \
  -enableArchive true \
  -archiveLogMode AUTO \
  -memoryMgmtType AUTO_SGA \
  -characterSet AL32UTF8 \
  -emConfiguration NONE

Verificamos al finalizar:

[oracle@primary ~]$ sqlplus / as sysdba
SQL> 
   Select name, 
          db_unique_name, 
          database_role, 
          open_mode, 
          log_mode, 
          force_logging
    From v$database

NAME	  DB_UNIQUE_NAME		 DATABASE_ROLE	  OPEN_MODE	       LOG_MODE     FORCE_LOGGING
--------- ------------------------------ ---------------- -------------------- ------------ ---------------------------------------
CDB1	  CDB1				 PRIMARY	  READ WRITE	       ARCHIVELOG   NO

Activamos el Force Logging:

SQL> Alter Database Force Logging;

Database altered.

SQL> Select force_logging From v$database;

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

dg-primary: Pasos previos

El primer paso, es verificar la parte de los Redo Logs.

SQL> 
Select group#, 
       thread#, sequence#, bytes/Power(1024,2) as MB, 
       members, 
       status
  From v$log
 Order By thread#,group#;   

    GROUP#    THREAD#  SEQUENCE#	 MB    MEMBERS STATUS
---------- ---------- ---------- ---------- ---------- ----------------
	 1	    1	      16	200	     2 CURRENT
	 2	    1	      14	200	     2 INACTIVE
	 3	    1	      15	200	     2 INACTIVE

Definimos Standby Redo Logs con el mismo tamaño, es decir, 200Mb:

 Alter Database Add Standby Logfile Thread 1 Size 200M;
 Alter Database Add Standby Logfile Thread 1 Size 200M;
 Alter Database Add Standby Logfile Thread 1 Size 200M;
 Alter Database Add Standby Logfile Thread 1 Size 200M;

Configuramos el parámetro log_archive_config:

Alter System Set Log_Archive_Config='DG_CONFIG=(CDB1,CDB1_STBY)' Scope=Both;

Configuramos el parámetro log_archive_dest:

ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=CDB1' SCOPE=BOTH;

Configuramos el parámetro standby_file_management:

alter system set standby_file_management=AUTO scope=both;

Configuramos el parámetro fal_server:

alter system set fal_Server='CDB1_STBY' scope=both;

Modificamos el tnsnames para incluir ambas cadenas y probamos que tenemos conexión en ambos sentidos.

[oracle@primary ~]$ grep -E "CDB1" $ORACLE_HOME/network/admin/tnsnames.ora
CDB1 =
      (SERVICE_NAME = CDB1)
CDB1_STBY =
      (SERVICE_NAME = CDB1_STBY)

[oracle@primary ~]$ tnsping CDB1_STBY
...
...
OK (10 msec)

[oracle@dg-standby ~]$ tnsping CDB1
...
...
OK (0 msec)

Copiamos el password file de primary a standby:

[oracle@primary ~]$ scp $ORACLE_HOME/dbs/orapwCDB1 oracle@dg-standby:/tmp/orapwCDB1
[oracle@dg-standby ~]$ mv /tmp/orapwCDB1 $ORACLE_HOME/dbs/

Creamos un pfile en la standby para poder arrancar en nomount.

[oracle@dg-standby ~]$ cat $ORACLE_HOME/dbs/initCDB1.ora
*.db_name='CDB1'
*.db_unique_name='CDB1_STBY'
*.enable_pluggable_database=TRUE

[oracle@dg-standby ~]$ export ORACLE_SID=CDB1
[oracle@dg-standby ~]$ sqlplus / as sysdba
SQL> startup nomount;
ORACLE instance started.

Perfecto, ahora vamos a probar a conectarnos desde la primary a la standby:

[oracle@primary ~]$ sqlplus sys@CDB1_STBY as sysdba
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.32.0.0.0

Validamos al contrario, desde la standby a la primary

[oracle@dg-standby ~]$ sqlplus conn sys@CDB1 as sysdba
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.32.0.0.0

Genial, tenemos comunicación en ambos sentidos.

En este punto estamos así, es decir, listo para lanzar el duplicate.

RMAN ACTIVE DUPLICATE

Este es el comando que vamos a ejecutar:

[oracle@primary ~]$ rman target sys@CDB1 auxiliary sys@CDB1_STBY
RMAN>
DUPLICATE TARGET DATABASE
  FOR STANDBY
  FROM ACTIVE DATABASE
  USING BACKUPSET
  DORECOVER
  SPFILE
    SET DB_UNIQUE_NAME='CDB1_STBY'
    SET LOG_ARCHIVE_DEST_1=
      'LOCATION=USE_DB_RECOVERY_FILE_DEST
       VALID_FOR=(ALL_LOGFILES,ALL_ROLES)
       DB_UNIQUE_NAME=CDB1_STBY'
    SET FAL_SERVER='CDB1'
  NOFILENAMECHECK;

Una vez finalizado, verificamos en dg-standby:

[oracle@dg-standby ~]$ sqlplus / as sysdba
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.32.0.0.0

SQL> SELECT name, db_unique_name, database_role, open_mode FROM v$database;  

NAME	  DB_UNIQUE_NAME		 DATABASE_ROLE	  OPEN_MODE
--------- ------------------------------ ---------------- ------------------
CDB1	  CDB1_STBY			 PHYSICAL STANDBY MOUNTED

Habilitamos el envío de redo desde primary hacia dg-standby:

ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=CDB1_STBY ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=CDB1_STBY' SCOPE=BOTH;

ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE SCOPE=BOTH;

En dg-standby, arrancamos el redo apply :

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;

Activamos el broker tanto en primary como dg-standby.

ALTER SYSTEM SET DG_BROKER_START=TRUE SCOPE=BOTH;

Como último paso, configuramos el broker en la primary

[oracle@primary ~]$ dgmgrl sys@CDB1
DGMGRL> CREATE CONFIGURATION DG_CONFIG AS PRIMARY DATABASE IS CDB1 CONNECT IDENTIFIER IS CDB1;
DGMGRL> ADD DATABASE CDB1_STBY  AS CONNECT IDENTIFIER IS CDB1_STBY MAINTAINED AS PHYSICAL;
DGMGRL> ENABLE CONFIGURATION;
DGMGRL> SHOW CONFIGURATION;

Configuration - dg_config

  Protection Mode: MaxPerformance
  Members:
  cdb1      - Primary database
    cdb1_stby - Physical standby database 

Fast-Start Failover:  Disabled

Configuration Status:
SUCCESS   (status updated 40 seconds ago)

DGMGRL> 

Espero que os guste. ¡Nos vemos en el próximo artículo!

About the author

  • Ingeniero informático, Oracle ACE, DBA y Arquitecto OCI, con más de 15 años de experiencia en plataformas Oracle. Certificado en OCI Certified Architect Professional y OCI Migration and Integration Certified Professional.

No comments yet. Be the first to comment.