Oracle Data Guard 12c en Arquitectura “Multitenant”: Comportamiento de PDBs (Parte II)

Por César Aguilar & Joel Pérez
Publicado en Junio 2017


Oracle Data Guard 12c en Arquitectura “Multitenant”: Comportamiento de PDBs (Parte I)

En el artículo anterior: Oracle Data Guard 12c en Arquitectura “Multitenant”: Comportamiento de PDBs (Parte I) observamos cómo se reduce el proceso de configuración Data Guard 12c en arquitectura multitenant, simplificando así tareas habituales de las versiones anteriores a 12c, tuvimos un Escenario 1 en el que se procedió a crear una nueva base de datos plugaggable PDB_SERA en la CDB1 y comprobamos como automáticamente formaba parte de la configuración.

En el siguiente artículo continuaremos analizando el comportamiento de las bases de datos pluggables en Oracle Data Guard12c y las respectivas ventajas de estas en arquitectura multitenant.

Plantearemos el siguiente objetivo y escenario:

Escenario 1:

“Unplug” una base de datos pluggable PDB_FINA de una base de datos container CDB2 en la que no hay configuración Data Guard, para posteriormente conectarla (“plug”) en la base de datos container CDB1 con Data Guard configurado.

Crearemos un usuario en la pluggable PDB_FINA llamado “ca”, en este usuario se creara una tabla con un registro.

Configuraremos la opción de “Active Data guard” y verificaremos la disponibilidad de los objetos creados en la pluggable PDB_FINA en el container standby.

Herramienta de Uso: SQL*Plus

Nuestro entorno de prueba:

  • Una base de datos CDB1 con Data Guard configurado la cual poseera tres bases de datos pluggables: PDB1, PDB2 y PDB_SERA.
  • Ahora tendremos un container CDB2 en el que no existe configuración de Data Guard con una base de datos pluggable llamada PDB_FINA, ambas bases de datos container (CDB1 y CDB2) residen en el mismo servidor y la base de datos container standby CDB1 que forma parte del Data Guard.

Escenario 1:

Procederemos a desconectar la base de datos pluggable PDB_FINA del container CDB2.


[oracle@rfcg ~]$ export ORACLE_SID=CDB2
[oracle@rfcg ~]$ sqlplus / as sysdba

SQL*Plus: Release 12.1.0.2.0 ProductiononTueApr 4 15:44:07 2017Copyright (c) 1982, 2014, Oracle.  Allrightsreserved.
Connected to:

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, OLAP, 
Advanced Analytics and Real Application Testing options SQL>select name, cdb from v$database; NAME CDB --------- --- CDB2 YES SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB_FINA READ WRITE NO SQL> alter pluggable database PDB_FINA close immediate; Pluggable database altered. SQL> alter pluggable database PDB_FINA UNPLUG INTO '/home/oracle/pdb_fina.xml'; Pluggable database altered. SQL> show pdbs; CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB_FINA MOUNTED

Verificamos la ubicación de los datafiles de la base de datos pluggable PDB_FINA; esto lo podemos obtener del archivo xml generado.

[oracle@rfcg~]$ grepdbf /home/oracle/pdb_fina.xml
 
/u01/app/oracle/oradata/cdb2/pdb_fina/system01.dbf
/u01/app/oracle/oradata/cdb2/pdb_fina/sysaux01.dbf
/u01/app/oracle/oradata/cdb2/pdb_fina/pdb_fina_temp012017-04-04.dbf
/u01/app/oracle/oradata/cdb2/pdb_fina/SAMPLE_SCHEMA_users01.dbf
/u01/app/oracle/oradata/cdb2/pdb_fina/example01.dbf

Cuando se crea una nueva pluggable en el container primario tal como lo observamos en el artículo Oracle Data Guard 12c en Arquitectura “Multitenant”: Comportamiento de PDBs (Parte I) los datafiles de la nueva pluggable son automáticamente creados en el container standby y el proceso de sincronización es transparente, sin embargo el comportamiento de la pluggable es distinto en el Data Guard cuando conectamos “plug” una pluggable en el container primario, los datafiles de la pluggable deben ser copiados al container primario y al container standby antes de ser enchufada.

Previamente se debe crear el directorio en donde se ubicaran los datafiles de la pluggable PDB_FINA.

[oracle@rfcg2~]$ mkdir -p /u01/app/oracle/oradata/CDB1/FINA/

Procedemos a copiar los datafiles de la base de datos pluggable PDB_FINA al servidor standby

[oracle@rfcg~]$cd/u01/app/oracle/oradata/cdb2/pdb_fina
 
[oracle@rfcgpdb_fina]$ scp *.dbf oracle@rfcg2:/u01/app/oracle/oradata/CDB1/FINA
oracle@rfcg2's password:
 
example01.dbf                                     100% 1244MB  11.1MB/s   01:52
pdb_fina_temp012017-04-04.dbf 100%   20MB  20.0MB/s   00:00
SAMPLE_SCHEMA_users01.dbf                         100% 5128KB   5.0MB/s   00:01
sysaux01.dbf                                      100%  520MB  16.8MB/s   00:31
system01.dbf                                      100%  260MB  13.0MB/s   00:20

En el servidor primario donde se encuentra la CDB1 también creamos el directorio en el que se ubicarán los datafiles de la base de datos pluggable PDB_FINA.

[oracle@rfcg ~]$ mkdir -p /u01/app/oracle/oradata/CDB1/FINA/

Ingresamos a la CDB1, procederemos a conectar la pluggable PDB_FINA, utilizamos el parámetro “copy” para copiar los datafiles de la pluggable PDB_FINA a la CDB1 del Data Guard y el parámetro “file_name_convert” debido a que los directorios entre los container CDB1 y CDB2 son diferentes.

[oracle@rfcg ~]$ export ORACLE_SID=CDB1
[oracle@rfcg~]$ sqlplus / as sysdba
 
SQL*Plus: Release 12.1.0.2.0 ProductiononTueApr 4 17:08:08 2017Copyright (c) 1982, 2014, Oracle.  Allrightsreserved.
 
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, OLAP,
Advanced Analytics and Real Application Testing options SQL>select name, cdb from v$database; NAME CDB --------- --- CDB1 YES SQL>select database_role from v$database; DATABASE_ROLE ---------------- PRIMARY SQL>create pluggable database pdb_fina 2 using '/home/oracle/pdb_fina.xml' 3 copy 4 file_name_convert=('/u01/app/oracle/oradata/cdb2/pdb_fina/', 5 '/u01/app/oracle/oradata/CDB1/FINA/'); Pluggable database created. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB1 READ WRITE NO 4 PDB2 READ WRITE NO 5 PDB_SERA READ WRITE NO 6 PDB_FINA MOUNTED

Luego de conectar la PDB_FINA a la CDB1, procedemos a colocarla en modo lectura, escritura.

SQL> alter pluggable database pdb_fina open read write;
 
Pluggable database altered.
 
 
SQL> show pdbs
 
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB1                           READ WRITE NO
         4 PDB2                           READ WRITE NO
         5 PDB_SERA                       READ WRITE NO
6 PDB_FINA                       READ WRITE NO|

Ingresamos a la pluggable PDB_FINA del container primario y creamos un usuario llamado “ca”, con este usuario vamos a crear una tabla con un registro y luego verificaremos que estos objetos estén disponibles en la pluggable PDB_FINA del container standby.

Creamos el usuario “ca” en PDB_FINA del container primario.

[oracle@rfcg ~]$ sqlplus system/oracle@rfcg:1521/pdb_fina
 
SQL*Plus: Release 12.1.0.2.0 Production on Tue Apr 4 17:28:09 2017
 
Copyright (c) 1982, 2014, Oracle.  All rights reserved.
 
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, OLAP,
Advanced Analytics and Real Application Testing options SQL> create user ca identified by oracle; User created. SQL> grant connect, resource, dba to ca; Grant succeeded.

Ingresamos a la pluggable PDB_FINA con el usuario “ca”, creamos una tabla llamada “clientes” y agregamos un registro.

[oracle@rfcg ~]$ sqlplus ca/oracle@rfcg:1521/pdb_fina
 
SQL*Plus: Release 12.1.0.2.0 Production on TueApr 4 17:33:182017
 
Copyright (c) 1982, 2014, Oracle.  All rights reserved.
 
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit 
ProductionWith the Partitioning, OLAP, Advanced Analytics and Real 
Application Testing options
 
SQL> CREATE TABLE clientes
( id number(10) NOT NULL,
  nombre varchar2(50) NOT NULL,
  ciudad varchar2(50)
);  2    3    4    5
 
Table created.
 
SQL> insert into clientes values(1,'test','caracas');
 
1 row created.
 
SQL> commit;
 
Commit complete.

Ingresamos al servidor standby en el que tenemos la CDB1.

[oracle@rfcg2 ~]$ export ORACLE_SID=CDB1
[oracle@rfcg2 ~]$ sqlplus / as sysdba
 
SQL*Plus: Release 12.1.0.2.0 ProductiononTue Apr 4 17:37:40 
2017Copyright (c) 1982, 2014, Oracle.  Allrightsreserved.
 
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 
64bit Production With the Partitioning, OLAP, Advanced 
Analytics and Real Application Testing options
 
SQL>select status, instance_name fromv$instance;
 
STATUS       INSTANCE_NAME
------------ ----------------
MOUNTED      cdb1
 
SQL>select database_role fromv$database;
 
DATABASE_ROLE
----------------
PHYSICAL STANDBY

Como podemos observar, al listar las bases de datos pluggables de nuestro servidor standby ya se encuentra la PDB_FINA formando parte de la solución Data Guard; la pluggable PDB_FINA está en estado “mount”.

SQL> show pdbs
 
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       MOUNTED
         3 PDB1                           MOUNTED
         4 PDB2                           MOUNTED
         5 PDB_SERA                       MOUNTED
6 PDB_FINA                       MOUNTED

Procedemos abrir las pluggables en modo lectura, escritura y tendríamos la configuración de un “Active Data Guard”

SQL> alter pluggable database all open read only;
 
SQL> show pdbs
 
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB1                           READ ONLY  NO
         4 PDB2                           READ ONLY  NO
         5 PDB_SERA                       READ ONLY  NO
         6 PDB_FINA                       READ ONLY  NO

Ingresamos a la PDB_FINA del container standby y verificamos que el registro creado en la tabla clientes esta disponible.

[oracle@rfcg2 ~]$ sqlplus ca/oracle@rfcg2:1521/pdb_fina
 
SQL*Plus: Release 12.1.0.2.0 Production Tue Apr 4 17:50:15 2017
 
Copyright (c) 1982, 2014, Oracle.  All rights reserved.
 
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
 
SQL> select * from clientes;
 
  ID NOMBRE  CIUDAD
--- --------------
   1 test    caracas

Conclusión:

Tal como se pudo observar, cuando poseemos una configuración con Oracle Data Guard en arquitectura “Multitenant”, el mecanismo de obtener una base de datos “Standby” de una PDB es bastante sencillo, solo debemos agregar la misma al “container” primario, dependiendo del caso tendremos o no que copiar los datafiles hacia el o los servidores standby y completar el proceso de “plug” de la misma, una de las principales ventajas que nos brinda esta arquitectura es que podemos tener el correspondiente de las bases de datos “Standby” sin configurar nuevamente la solución.


César Aguilar es un DBA (OCP12c, OCP/OCA 11g, Oracle Database12c Certified Implementation Specialist) con experiencia en Data Guard y otras soluciones de alta disponibilidad. Actualmente se encuentra radicado en Ecuador y trabaja para la compañía Refundation Consulting Group “http://www.refundation.com” como consultor DBA.

Joel Pérez es un experto DBA (Oracle ACE Director, MaximumAvailability OCM, OCM Cloud Admin. & OCM12c/11g) con más de 16 años de experiencia real en el mundo de tecnología Oracle, especializado en diseño e implementación de soluciones de: Cloud, Alta disponibilidad, Recuperación contra desastres, Upgrades, Replicación y toda área relacionada con bases de datos Oracle. Joel se desempeñacomo "Chief Technologist & MAA, HA Architect" para www.Enmotech.com YunheEnmo (Beijing) Technology Co. Ltd. Beijing, China. Perfil OCM Joel Pérez: http://education.oracle.com/education/otn/JoelPerez.htm

Este artículo ha sido revisado por el equipo de productos Oracle y se encuentra en cumplimiento de las normas y prácticas para el uso de los productos Oracle.