Oracle Database 12c: Cómo usar archivos “XML Manifest” para conectar y desconectar PDBs

Por OraWorld
Publicado en Julio 2014

Introducción:
Con la nueva arquitectura “Multi-tenant” de “Oracle Database 12c”,  la base de datos de tipo “Container (CDB)” puede tener múltiples “Pluggable Database (PDB)” lo cual, a su vez, hace posible que en cualquier momento se puedan conectar y desconectar PDBs. Usualmente las operaciones de conectar y desconectar PDBs son realizadas cuando se necesita realizar pruebas de rendimiento en el CDB cuando no existe ninguna PDB conectada o cuando se tiene varias PDBs y se requiere actualizar la versión de todas las PDBs excepto una en particular, en este caso, dicha PDB debe ser desconectada del CDB. Para poder utilizar la PDB que se ha desconectado, esta deberá conectarse a otro CDB con la misma versión u otra versión que esté debidamente soportada.  Todas las operaciones de conexión y desconexión de PDBs pueden realizarse en cualquier momento y son muy fáciles de administrar.
Para poder conectar una PDB o desconectarla se utiliza un archivo de manifiesto de tipo “eXtensible Markup Language (XML)”, en donde se mantiene la información relacionada a los “datafiles” y la localización de ellos, incluso información del archivo de parámetros. Manejar este archivo XML es muy sencillo pues únicamente contiene metadatos de la PDB.

Pasos a alto nivel: Para este artículo se asume que ya se tienen presentes los conceptos básicos de administración de PDBs, por lo que únicamente se darán los pasos a alto nivel para conectar y desconectar PDBs.

  1. Desconectar una PDB usando un archivo XML de manifiesto.

  1. Eliminar la PDB.
  2. Conectar nuevamente la PDB usando un archivo XML de manifiesto.
  1. La PDB puede conectarse de nuevo en el mismo CDB o también es posible conectarla hacia un CDB diferente, si la compatibilidad con dicho CDB es soportada.
  2. Para conectar una PDB, se puede utilizar los métodos “NOCOPY”, “COPY” o “CLONE MOVE”, todo depende de lo que se necesite realizar.

Para las prácticas realizadas en este artículo se utilizará una PDB con el nombre “MDGPDB” la cual está conectada al CDB con el nombre “MDGCDB”. Se demostrará como desconectar y conectar esta PDB incluyendo también la solución a problemas típicos relacionados en dicho proceso de conexión y desconexión de PDBs.

SQL> select pdb_name,status from cdb_pdbs;

PDB_NAME   STATUS
---------- -------------
MDGPDB     NORMAL
PDB$SEED   NORMAL

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

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

SQL>

Crear la tabla llamada “Mytab” en el esquema “OraWorld” antes de desconectar la PDB. Esta tabla servirá para comprobar que la PDB ha sido conectada de nuevo correctamente.

SQL> select owner,object_name,object_type from  dba_objects where object_name='MYTAB';

OWNER      OBJECT_NAM  OBJECT_TYPE
---------- ----------  -----------------------
ORAWORLD   MYTAB       TABLE

Ahora se desconectará la PDB, para poder realizar esto se necesita que la PDB esté cerrada y solo hasta entonces proceder a la desconexión utilizando el archivo XML de manifiesto.

SQL> alter pluggable database mdgpdb close  immediate;
Pluggable database altered.
SQL>
SQL> alter pluggable database mdgpdb unplug into '/home/oracle/OraWorld/mdgpdb_switch.xml';
Pluggable database altered.
SQL> select pdb_name, status from cdb_pdbs;
PDB_NAME      STATUS -------------- ------------- MDGPDB        UNPLUGGED PDB$SEED      NORMAL SQL> !ls -ltr /home/oracle/OraWorld/mdgpdb_switch.xml -rw-r--r-- 1 oracle oinstall 4038 Apr 23 17:05 /home/oracle/OraWorld/mdgpdb_switch.xml
SQL>

Tal como se indicó arriba, se puede utilizar el archivo XML de manifiesto para conectar la PDB en el mismo CDB o hacia otro CDB y es eso lo que a continuación se demostrará. Es bueno saber que si se tiene la PDB  ya desconectada, no se podría volver a conectar la PDB sin antes realizar la “eliminación” de la misma, de lo contrario se tendrían conflictos con el GUID dentro del CDB.

SQL> drop pluggable database mdgpdb;
Pluggable database dropped.
SQL> create pluggable database mdgpdb using '/home/oracle/OraWorld/mdgpdb_switch.xml' nocopy tempfile reuse; 
Pluggable database created.
SQL>

Ahora ya es posible volver a conectar la PDB al mismo CDB, en este caso el CDB con el nombre “MDGCDB”.

SQL>  alter pluggable database all open; 
Pluggable database altered.
SQL> SQL> select pdb_name,status from cdb_pdbs; PDB_NAME STATUS -------- ---------- MDGPDB   NORMAL PDB$SEED NORMAL SQL> select con_id,name,open_mode from v$pdbs; CON_ID NAME                    OPEN_MODE ------- ------------------------ ---------- 2 PDB$SEED                READ ONLY 3 MDGPDB                  READ WRITE

La operación fue realizada correctamente. La PDB con nombre “MDGPDB” ya está conectada nuevamente al CDB.
Ahora la pregunta es, ¿Qué pasaría si se elimina la PDB de nuevo y se usa el mismo archivo XML de manifiesto? Por favor, note que no se ha agregado/eliminado ningún “datafile” ni tampoco se ha agregado un nuevo “tablespace” a la PDB. Es decir, la PDB está intacta, sin cambios.

SQL>  drop pluggable database mdgpdb;
Pluggable  database dropped.
SQL>

Se usará el mismo archivo XML de manifiesto que se utilizó cuando se conectó dicha PDB al CDB.

SQL> create pluggable database mdgpdb using '/home/oracle/OraWorld/mdgpdb_switch.xml' nocopy tempfile reuse; 
create pluggable database mdgpdb using '/home/oracle/OraWorld/mdgpdb_switch.xml' nocopy tempfile reuse 
 * 
ERROR  at line 1: 
ORA-65139:  Mismatch between XML metadata file and data file 
/u02/app/oracle/oradata/mdgcdb/mdgpdb/system01.dbf 
for value of afn (73 in the
plug XML file, 76 in the data file)

Como indicamos anteriormente, la PDB no sufrió cambios y sin embargo, la sentencia falló. Estos errores son debido a que los metadatos de la base de datos y los metadatos proporcionados en el archivo XML de manifiesto no coinciden.
Primero se revisará el archivo XML de manifiesto y se buscará cual es la información que no coincide.  Al poner mucha atención a la información que hemos recibido, se ve que el mensaje está diciendo que el número de “datafile” para “system01.dbf” es 76 en la base de datos y en el archivo XML está indicando el 73, el cual es el número antiguo.

  -bash-3.2$ oerr ora 65139
  65139, 00000, "Mismatch between XML metadata file  and data file %s for value of %s (%s)"
  // *Cause:  Either the XML metadata file or the  data file was corrupt.
  // *Action: Verify that the XML metadata file and the  data file are consistent as of
  // the point when the unplug was done and retry the operation.
  //
  -bash-3.2$

Ahora aquí la cuestión podría ser ¿por qué el número de datafile es cambiado incluso si el “datafile” es el mismo?
Esto es debido a que en cualquier momento se puede eliminar la PDB lo cual hace que los números de los “datafiles” no sean usados y es por eso que se les asigna nuevos números. Como se ve, la información no ha coincidido por lo que se necesita corregir los valores tales como números de “datafiles”, “createscnbas” y “fcpsb”.

Información relacionada al datafile No. 8 (system01.dbf) en el archivo de manifiesto XML antiguo

 

Ahora es necesario cambiar los tres importantes valores (AFN, CREATESCNBAS, FCPSB) para cada datafile perteneciente a la PDB para que dicha PDB pueda ser conectada de nuevo al mismo CDB. 

Por supuesto, el mensaje de error que se recibió anteriormente muestra claramente el valor requerido para reemplazarlo en el archivo XML de manifiesto:

“afn (73 in the plug XML file, 76 in the data file)"

Para reparar todo el archivo XML de manifiesto se puede ejecutar varias veces la sentencia “create Pluggable Database” usando el XML erróneo hasta obtener los tres valores correctos para los “datafiles” requeridos mediante los mensajes de error que se han recibido. También, en lugar de eso se puede usar una consulta para obtener el número de “datafile” correcto y la información del SCN, pero estos datos deben ser recuperados antes de la eliminación.

AFN:
AFN se refiere al número de “datafile”. Estos valores pueden ser recuperados antes de eliminar la PDB mediante la siguiente consulta:

SQL>   select file#,name,blocks from v$datafile  where con_id=3;

FILE#  BLOCKS                                                    NAME                                                                  
-----  --------------------------------------------------        ---------
76     /u02/app/oracle/oradata/mdgcdb/mdgpdb/system01.dbf        33280
77     /u02/app/oracle/oradata/mdgcdb/mdgpdb/sysaux01.dbf        79360
78     /u02/app/oracle/oradata/mdgcdb/mdgpdb/mdgpdb_users01.dbf  5920

3 rows selected.
SQL>


Cada vez que se desconecta y vuelve a conectar una PDB el nuevo número de “datafile” será asignado y puede ser visto consultando la vista “v$datafile”.

CREATESCNBAS:

El valor del parámetro “createscnbas” indica el “creation_change#” del “datafile”. Si la PDB ha sido desconectada o conectada varias veces, entonces el valor es el “creation_change#” que se tenía antes que se desconectara la PDB. Para obtener el valor de “creation_change#” también se puede consultar la vista “v$datafile”.

SQL>  select file#, rfile#, creation_change#, creation_time, checkpoint_change#,  
checkpoint_time, name, status, enabled from v$datafile;

FILE# RFILE# CREATION_CHANGE# CREATION_TIME        CHECKPOINT_CHANGE#  CHECKPOINT_TIME      
----- ------ ---------------- -------------------- ------------------- --------------------   
1     1      7                24-MAY-2013 11:51:18 2582587             23-APR-2014 16:50:36 
3     3      3922             24-MAY-2013 11:51:30 2582587             23-APR-2014 16:50:36 
4     4      1717431          24-MAY-2013 13:29:31 2582587             23-APR-2014 16:50:36 
5     1      1720746          05-APR-2014 10:48:36 1737270             05-APR-2014 10:53:58 
6     6      26029            24-MAY-2013 11:52:13 2582587             23-APR-2014 16:50:36 
7     4      1720749          05-APR-2014 10:48:36 1737270             05-APR-2014 10:53:58 
76    1      2586148          23-APR-2014 17:07:28 2587833             23-APR-2014 17:11:33 
77    4      2586151          23-APR-2014 17:07:28 2587833             23-APR-2014 17:11:33 
78    32     2586154          23-APR-2014 17:07:28 2587833             23-APR-2014 17:11:33 

NAME                                                     STATUS  ENABLED
-------------------------------------------------------- ------- ----------
/u02/app/oracle/oradata/mdgcdb/system01.dbf              SYSTEM  READ WRITE
/u02/app/oracle/oradata/mdgcdb/sysaux01.dbf              ONLINE  READ WRITE
/u02/app/oracle/oradata/mdgcdb/undotbs01.dbf             ONLINE  READ WRITE
/u02/app/oracle/oradata/mdgcdb/pdbseed/system01.dbf      SYSTEM  READ WRITE
/u02/app/oracle/oradata/mdgcdb/users01.dbf               ONLINE  READ WRITE
/u02/app/oracle/oradata/mdgcdb/pdbseed/sysaux01.dbf      ONLINE  READ WRITE
/u02/app/oracle/oradata/mdgcdb/mdgpdb/system01.dbf       SYSTEM  READ WRITE
/u02/app/oracle/oradata/mdgcdb/mdgpdb/sysaux01.dbf       ONLINE  READ WRITE
/u02/app/oracle/oradata/mdgcdb/mdgpdb/mdgpdb_users01.dbf ONLINE  READ WRITE

9 rows selected.

SQL>
 

FCPSB:
El valor del parámetro “fcpsb” es el “checkpoint_chanage#” del “datafile”. Si la PDB ha sido desconectada o conectada varias veces, entonces el valor es el “checkpoint_change#” que se tenía antes que se desconectara la PDB.  Para obtener el valor de “checkpoint_change#” se puede consultar la vista “v$datafile_header”. 

SQL>  select file#, name, checkpoint_change#, checkpoint_time from v$datafile_header;

FILE#  NAME                                                       CHECKPOINT_CHANGE# CHECKPOINT_TIME
-----  ---------------------------------------------------------- ------------------ --------------------
1      /u02/app/oracle/oradata/mdgcdb/system01.dbf                2582587            23-APR-2014 16:50:36
3      /u02/app/oracle/oradata/mdgcdb/sysaux01.dbf                2582587            23-APR-2014 16:50:36
4      /u02/app/oracle/oradata/mdgcdb/undotbs01.dbf               2582587            23-APR-2014 16:50:36
5      /u02/app/oracle/oradata/mdgcdb/pdbseed/system01.dbf        1737270            05-APR-2014 10:53:58
6      /u02/app/oracle/oradata/mdgcdb/users01.dbf                 2582587            23-APR-2014 16:50:36
7      /u02/app/oracle/oradata/mdgcdb/pdbseed/sysaux01.dbf        1737270            05-APR-2014 10:53:58
76     /u02/app/oracle/oradata/mdgcdb/mdgpdb/system01.dbf         2587833            23-APR-2014 17:11:33
77     /u02/app/oracle/oradata/mdgcdb/mdgpdb/sysaux01.dbf         2587833            23-APR-2014 17:11:33
78     /u02/app/oracle/oradata/mdgcdb/mdgpdb/mdgpdb_users01.dbf   2587833            23-APR-2014 17:11:33

Resumiendo, en el script solamente los tres parámetros indicados anteriormente deben ser cambiados y los restantes deberían permanecer con el mismo valor. Ahora se puede utilizar el script actualizado para todos los “datafiles” de la PDB y emitir el comando “create Pluggable Database” para crear la PDB, el cual debería realizarse correctamente.

SQL> create pluggable database mdgpdb using '/home/oracle/OraWorld/mdgpdb_switch.xml' nocopy tempfile reuse; 
Pluggable  database created. 

SQL>  alter pluggable database mdgpdb open; 
Pluggable  database altered. 

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

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

SQL> 

Para propósitos de prueba, se creó la tabla con nombre “MYTAB” bajo el esquema “OraWorld”, ahora se verificará si los objetos en la PDB están correctos.

SQL> alter session set container=mdgpdb;
Session altered.

SQL> alter database open;
Database altered.

SQL> select count(*) from OraWorld.mytab;

COUNT(*)
--------
90775

SQL>
  

Conclusión: Al final de este artículo se debería tener todos los datos en el archivo XML de manifiesto establecidos correctamente y se debería poder conectar la PDB sin problemas, para esto se debe usar el nuevo archivo XML de manifiesto y no la versión antigua de dicho archivo, aunque no hayan habido cambios tales como agregar y/o eliminar “datafiles” bien se vio que el archivo XML de manifiesto debe ser modificado. Por supuesto, se puede usar el antiguo archivo XML de manifiesto pero se debe saber los datos necesarios como el “creation change”, la información de  “checkpoint change” antes de desconectar y eliminar la PDB o de lo contrario se deberá ejecutar el script de creación de la PDB y utilizar los datos correctos que  Oracle devolverá una vez haya fallado la sentencia.
 


OraWorld es un grupo que está constantemente trabajando con la comunidad de Oracle a través de artículos, conferencias, seminarios y cursos de Oracle Database. Los miembros OraWorld poseen "Certified Masters Oracle" y certificación "Oracle ACE".

Usted puede seguir este grupo a través de los siguientes links:
https://www.facebook.com/oraworldteam
https://twitter.com/oraworld_team
http://www.oraworld-team.com