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.
- Desconectar una PDB usando un archivo XML de manifiesto.
- Eliminar la PDB.
- Conectar nuevamente la PDB usando un archivo XML de manifiesto.
- 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.
- 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