Aprovisionamiento de Bases de Datos “Pluggables” o PDB’s
02/10/2015 -
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:
- Crear PDB a partir de la plantilla que dispone el “Container” o CDB: PDB raíz o seed (PDB$SEED)
- Clonar PDB a partir de otra PDB del mismo CDB
- Desconectar PDB de un CDB y re-conectarlo (unplug/plug) a otro, como parte de migración a versiones superiores de la 12
- 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.