Aprovisionamiento de Bases de Datos “Pluggables” o PDB’s

Ahora con la versión 12c, y gracias a la opción “Multitenant“, disponemos de cuatro formas de aprovisionar/crear bases de datos plugables o PDB:

  1. Crear PDB a partir de la plantilla que dispone el “Container” o CDB: PDB raíz o seed (PDB$SEED)
  2. Clonar PDB a partir de otra PDB del mismo CDB
  3. Desconectar PDB de un CDB y re-conectarlo (unplug/plug)  a otro, como parte de migración a versiones superiores de la 12
  4. Conectar una Base de datos “NON-CDB” (lo que sería el formato pre-12) a un CDB como parte de un proceso de migración, convirtiéndola de esta forma en PDB.

Este sería el listado de acciones de mayor a menor agilidad de aprovisionado de PDB’s en la nueva versión y todas ellas las trataremos en este post. La cuarta partiremos de una BD versión pre-12 ya migrada  a la versión que nos atañe. Estos procesos se pueden realizar con SQL*Plus, SQL Developer, OEM12c y DBCA. Nosotros los abordaremos desde SQL*Plus.

 

METODO 1: Clonar de Plantilla

Antes de comenzar vamos a comprobar el estado de la PDB raíz (PDB$SEED) y explicar un par de cosas.

SQL>  select NAME, con_id, open_mode from v$PDBs;

NAME                               CON_ID OPEN_MODE
—————————— ———- ———-
PDB$SEED                                2 READ ONLY

SQL>  select tablespace_name, plugged_in, status, CON_ID from cdb_tablespaces;

TABLESPACE PLUGGED_IN STATUS        CON_ID
———- ———- ——— ———-
SYSTEM     NO         ONLINE             2
SYSAUX     NO         ONLINE             2
TEMP       NO         ONLINE             2
SYSTEM     NO         ONLINE             1
SYSAUX     NO         ONLINE             1
UNDOTBS1   NO         ONLINE             1
TEMP       NO         ONLINE             1
USERS      NO         ONLINE             1

La PDB$SEED siempre está en formato “READ ONLY” debido a que existe únicamente como plantilla para generar otras PDBs, no es accesible.

En la consulta de los tablespaces aparecen asociados únicamente los tablespaces SYSTEM, SYSAUX y TEMP ya que “UNDO” es un elemento común, junto con los controlfile, y los redolog, a las PDB y existe exclusivamente a nivel de CDB.

SQL> create pluggable database pdb1
2  admin user pdb1_admin identified by pdb1_admin roles=(connect)
3  file_name_convert=('C:APPDB12CORADATACDB1PDBSEED','C:APPDB12CORADATACDB1PDB1');

Base de datos de conexión creada.
SQL> select NAME, con_id, open_mode from v$PDBs;

NAME                               CON_ID OPEN_MODE
—————————— ———- ———-
PDB$SEED                                2 READ ONLY
PDB1                                    3 MOUNTED

SQL> select PDB_NAME, con_id, status from cdb_pdbs

PDB_NAME       CON_ID STATUS
———- ———- ————-
PDB1                1 NEW
PDB$SEED            1 NORMAL

Al crear las PDB en multitenant no se abren automáticamente, ya lo mencionamos en un post anterior, por lo que es necesario conectar a la PDB y abirla manualmente.

SQL> show con_name

CON_NAME
——————————
CDB$ROOT
SQL> alter session set container=pdb1
2  ;

Sesión modificada.

SQL> alter pluggable database open;

Base de datos de conexión modificada.

SQL> grant pdb_dba to pdb1_admin;

Concesi¾n terminada correctamente.

SQL> alter session set container=CDB$ROOT;

Sesión modificada.

SQL> select NAME, con_id, open_mode from v$PDBs;

NAME                               CON_ID OPEN_MODE
—————————— ———- ———-
PDB$SEED                                2 READ ONLY
PDB1                                    3 READ WRITE

METODO 2: clonar PDB

Las operaciones se realizan desde la CDB raíz. Para clonar PDBs lo primero que  es necesario hacer es poner la BD en modo read only.

SQL> select con_id, name, open_mode from v$pdbs;

CON_ID NAME                           OPEN_MODE
———- —————————— ———-
2 PDB$SEED                       READ ONLY
3 PDB1                           READ WRITE

SQL> alter pluggable database pdb1 close;

Base de datos de conexión modificada.

SQL> select con_id, name, open_mode from v$pdbs;

CON_ID NAME                           OPEN_MODE
———- —————————— ———-
2 PDB$SEED                       READ ONLY
3 PDB1                           MOUNTED

SQL> alter pluggable database pdb1 open read only;

Base de datos de conexión modificada.

SQL> select con_id, name, open_mode from v$pdbs;

CON_ID NAME                           OPEN_MODE
———- —————————— ———-
2 PDB$SEED                       READ ONLY
3 PDB1                           READ ONLY

creamos el directorio donde se copiarán los ficheros de BD.

SQL> host

Microsoft Windows [Versión 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. Reservados todos los derechos.

C:Usersana.ruiz>cd C:appDB12coradataCDB1

C:appDB12coradataCDB1>mkdir PDB1_2

C:appDB12coradataCDB1>exit

SQL>

Se modifica el parámetro db_create_file_dest apuntando a la ruta donde se ubicarán los datafile

alter system set db_create_file_dest='C:appDB12coradataCDB1PDB1_2';

y ya podemos clonar la BBDD

SQL> create pluggable database pdb1_2 from pdb1;

Base de datos de conexión creada.

SQL> select con_id, name, open_mode from v$pdbs;

CON_ID NAME                           OPEN_MODE
———- —————————— ———-
2 PDB$SEED                       READ ONLY
3 PDB1                           READ ONLY
4 PDB1_2                         MOUNTED

Cerramos y abrimos todas las BD juntas.

SQL> alter pluggable database all close;

Base de datos de conexión modificada.

SQL> select con_id, name, open_mode from v$pdbs;

CON_ID NAME                           OPEN_MODE
———- —————————— ———-
2 PDB$SEED                       READ ONLY
3 PDB1                           MOUNTED
4 PDB1_2                         MOUNTED

SQL> alter pluggable database all open;

Base de datos de conexión modificada.

SQL> select con_id, name, open_mode from v$pdbs;

CON_ID NAME                           OPEN_MODE
———- —————————— ———-
2 PDB$SEED                       READ ONLY
3 PDB1                           READ WRITE
4 PDB1_2                         READ WRITE

Comprobamos los ficheros generados para pdb1_2

SQL> select file_name from cdb_data_files where con_id=4;

FILE_NAME
————————————————————————————————————————
C:APPDB12CORADATACDB1PDB1_2CDB17EEA078F1B284422AAA677CC6CA1E0F3DATAFILEO1_MF_SYSTEM_BYLH72OH_.DBF
C:APPDB12CORADATACDB1PDB1_2CDB17EEA078F1B284422AAA677CC6CA1E0F3DATAFILEO1_MF_SYSAUX_BYLH72PD_.DBF
C:APPDB12CORADATACDB1PDB1_2CDB17EEA078F1B284422AAA677CC6CA1E0F3DATAFILEO1_MF_AVT_BYLH72OJ_.DBF

METODO 3: unplug/plug PDB

Para este método disponemos del container CDB1, versión 12.1.0.1,  y CDB2, versión 12.1.0.2. Realizaremos “unplug” de la PDB1 en el container CDB1 y  ejecutar “plug” en la CDB2.

SQL> select name, con_id from v$database;

NAME CON_ID
——— ———-
CDB1 0

SQL> select * from v$version;

BANNER CON_ID
——————————————————————————– ———-
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 – 64bit Production 0

Realizamos el unplug

SQL> alter pluggable database pdb1 close;

Base de datos de conexión modificada.

SQL> select con_id, name, open_mode from v$pdbs;

CON_ID NAME                           OPEN_MODE

———- —————————— ———-

2 PDB$SEED                       READ ONLY

3 PDB1                           MOUNTED

SQL> alter pluggable database pdb1 unplug into ‘C:appDB12coradataCDB1PDB1pdb1.xml’;

Base de datos de conexión modificada.

y la montamos en la CDB2, versión 12.1.0.2. Antes de poder conectarla a la versión 12.1.0.2 es necesario realizar ciertas tareas de comprobación de compatibilidad y de upgrade del diccionario. Estos pasos nos lo saltamos, ya que forman parte de migración y lo abordaremos en otro post.

SQL> select name, con_id from v$database;

NAME CON_ID
——— ———-
CDB2 0

SQL> select * from v$version;

BANNER CON_ID
——————————————————————————– ———-
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 – 64bit Production 0

Procedimiento PL/SQL terminado correctamente.
SQL> create pluggable database PDB1 using ‘C:appDB12coradataCDB1PDB1pdb1.xml’
2 FILE_NAME_CONVERT=(‘C:appDB12coradataCDB1‘,’C:appDB12coradataCDB2‘)
3 move
4 tempfile reuse;

Base de datos de conexión creada.

Con la sentencia anterior se especifica que se muevan los datafile y los tempfile a la nueva ubicación. Como paso final abrimos la BD

SQL> alter session set container=pdb1;

Sesión modificada.

SQL> startup;

Base de datos de conexión abierta.

SQL> select con_id, name, open_mode from v$pdbs;

CON_ID NAME OPEN_MODE
———- —————————— ———-
3 PDB1 READ WRITE

SQL> select file_name from cdb_data_files where con_id=3;

FILE_NAME
————————————————————–
C:APPDB12CORADATACDB2PDB1SYSTEM01.DBF
C:APPDB12CORADATACDB2PDB1SYSAUX01.DBF
C:APPDB12CORADATACDB2PDB1AVT01.DBF
SQL> select file_name from dba_temp_files;

FILE_NAME
—————————————————
C:APPDB12CORADATACDB2PDB1PDBSEED_TEMP01.DBF

METODO 4: transformar  NONCDB a PDB

En este método transformaremos un formato pre-12 o NON-CDB a PDB.

comprobamos que nuestra BD no es una CDB

SQL> select name, con_id, CDB from v$database;

NAME CON_ID CDB
——— ———- —
ORCL12 0 NO

Ponemos la BD en estado read-only. La paramos y la iniciamos en modo read-only

SQL> shutdown immediate
Base de datos cerrada.
Base de datos desmontada.
Instancia ORACLE cerrada.

SQL> startup open read only
Instancia ORACLE iniciada.

Total System Global Area 1068937216 bytes
Fixed Size 2410864 bytes
Variable Size 734004880 bytes
Database Buffers 327155712 bytes
Redo Buffers 5365760 bytes
Base de datos montada.
Base de datos abierta.

Para comenzar el proceso de convertirla a PDB utilizaremos el paquete dbms_pdb, concretamente usaremos el procedimiento “describe” para tener en un fichero XML la estructura de la BD.

SQL> exec dbms_pdb.describe('C:appDB12coradataorcl12orcl12.xml');

Procedimiento PL/SQL terminado correctamente.

y con el fichero XML ya podemos crear la PDB

SQL> create pluggable database pdb_orcl12 using 'C:appDB12coradataorcl12orcl12.xml'
nocopy;

Base de datos de conexión creada.

Para finalizar, nos conectamos a la PDB recién creada y ejecutamos el script “noncdb_to_pdb.sql“. Este paso es requisito indispensable, ya que ejecutándolo elimina metadatos relacionados con la estructura previa de la BD.

sqlplus sys/manager1@pdb_orcl12 as sysdba
SQL> @?/rdbms/admin/noncdb_to_pdb.sql

AL finalizar deja la BD abierta en modo restricted, por lo que es necesario pararla y abrirla de forma normal.

SQL> select con_id, name, open_mode, restricted from v$pdbs;

CON_ID NAME OPEN_MODE RESTRICTED
———- —————————— ———- ———-
3 PDB_ORCL12 READ WRITE YES

1 fila seleccionada.

SQL> shutdown immediate

Base de datos de conexión cerrada.

SQL> alter database open;

Base de datos modificada.

SQL> select con_id, name, open_mode, restricted from v$pdbs;

CON_ID NAME OPEN_MODE RESTRICTED
---------- ------------------------------ ---------- ----------
3 PDB_ORCL12 READ WRITE NO

1 fila seleccionada.

Comprobación de errores

Durante las operaciones sobre las PDBs se puede consultar la vista “PDB_PLUG_IN_VIOLATIONS” desde la base de datos contenedor (CDB) para comprobar los mensajes de error si durante cualquiera de los 4 métodos surgiesen problemas.

SQL> select name, message, status, action from PDB_PLUG_IN_VIOLATIONS;

NAME MESSAGE STATUS ACTION
———— ——————————- ——— ——————————
ORCL12 CDB parameter memory_target mismatch: Previous 1073741824 Current 0 PENDING Please check the parameter in the current CDB.

PDB_ORCL12 PDB plugged in is a non-CDB, requires noncdb_to_pdb.sql be run. RESOLVED Run noncdb_to_pdb.sql.

Twitter
LinkedIn
Evolución, innovación y transformación
37 Service Expertise avalados por Oracle 
Nuestra propuesta de valor
Posts 100% Oracle
Sigue nuestro día a día