Multitenant: Conversión de NonCDB a PDB

#OracleTIPSSV

#OracleACEPRO

#26082024

En este ejercicio vamos a ver los pasos para convertir una BD Noncdb de cualquier version hacia PDB , para el caso, si la DB es 12c y la CDB destino es 19c, obvio yo sugiero que hay hacer el upgrade primero.

Primero validamos todos los componentes se encuentran en estado valido y mas importante, esta cantidad de componentes debe ser igual a los componentes que la CDB tiene instalados y funcionando.

DBA_REGISTRY

CATALOG Oracle Database Catalog Views 12.2.0.1.0 VALID
CATPROC Oracle Database Packages and Types 12.2.0.1.0 VALID
XDB Oracle XML Database 12.2.0.1.0 VALID
OWM Oracle Workspace Manager 12.2.0.1.0 VALID
JAVAVM JServer JAVA Virtual Machine 12.2.0.1.0 VALID
XML Oracle XDK 12.2.0.1.0 VALID
CATJAVA Oracle Database Java Packages 12.2.0.1.0 VALID
APEX Oracle Application Express 18.1.0.00.45 VALID
RAC Oracle Real Application Clusters 12.2.0.1.0 VALID

— Si es RAC asegurarse de tener solo una instancia encendida, asegurarse de que el OMF el db_create_file_dest este definido apuntando al diskgroup.

Procedimiento

Existen varias formas de pegar una NonCDB a PDB,

Copia , el método de copia se asegura de dejar la BD original intacta pero es mas tardado. El Reuso, método de reuso no tiene punto de retorno, pues utiliza los datafiles actuales.

Para realizar el procedimiento de reuso de archivos.

Procedimiento de clonación en bd01

1 Apagamos la BD y la ponemos en Read ONLY para que el SCN en la cabecera de todos los datafiles este sincronizado al mismo valor con el control file.

export ORACLE_SID=bd01
sqlplus / as sysdba
SHUTDOWN IMMEDIATE;
STARTUP OPEN READ ONLY;

2 crear manifiesto
el archivo que contiene el descriptivo de la bd sus datafiles, objetos, SCN , etc etc.

BEGIN
DBMS_PDB.DESCRIBE(
pdb_descr_file => ‘/tmp/bd01.xml’);
END;
/

En este caso activamos el modo archive, y creamos los redolog de 4g porque estaban de menos tamaño.

3 shutdown bd01

export ORACLE_SID=db12c
sqlplus / as sysdba
SHUTDOWN IMMEDIATE;

4 en cdb destino

Observar la respuesta de YES en el plsql anónimo siguiente:

SET SERVEROUTPUT ON;
DECLARE
compatible CONSTANT VARCHAR2(3) := CASE DBMS_PDB.CHECK_PLUG_COMPATIBILITY(pdb_descr_file => '/tmp/bd01.xml')
WHEN TRUE THEN 'YES'
ELSE 'NO'
END;
BEGIN
DBMS_OUTPUT.PUT_LINE(compatible);
END;
/
SQL> SQL> 2 3 4 5 6 7 8 9 YES

5. Para chequear imcompatibilidad de PDB a pegar

SQL> select message from PDB_PLUG_IN_VIOLATIONS where type='ERROR' and status ='PENDING';
no rows selected

6. Revisar los dbfiles de la cdb destino para que pueda albergar los datafiles que vienen de la NONCDB.

show parameter db_file, si no es suficiente aumentar valor

NOTA
CREATE PLUGGABLE DATABASE pbd01 USING ‘/tmp/bd01.xml’ nocopy;

LEER ADENDA AL FINAL

Cuando se ocupa nocopy en la sentencia de create plugable database, los tempfile si estan en asm u OMF daran error

1>CREATE PLUGGABLE DATABASE pbd01 USING '/tmp/bd01.xml' nocopy;
CREATE PLUGGABLE DATABASE pbd01 USING '/tmp/bd01.xml' nocopy
*
ERROR at line 1:
ORA-27038: created file already exists
ORA-01119: error in creating database file
'

Solucion ver documento: “Failure In Creating PDB With Temp Files Stored In ASM / OMF Format From Non-CDB Using NOCOPY Option (Doc ID 2778041.1)”
Below bug was opened with our development team:

BUG 26621022 – NEW TEMPFILES ARE CREATED NOT REUSED USING CREATE PLUGGABLE ..TEMPFILE REUSE
Above bug was closed by our development team stating it as expected behavior. In order to resolve this issue,
we can use either of below solutions:
Make sure sufficient free space available in the desired ASM disk group or filesystem (in case of OMF).
or
Delete the TEMP tablespace temp files from source Non-CDB database environment after generating
the XML file and then shutting down the Non-CDB database.


Hay que borrar los tempfiles de la bd origen en el FS datastore después de generar el xml, después de apagar la instancia y antes de pegarla en la cdb

Query para monitorear avance de copia en CDB

select opname, sid, serial#, sofar, totalwork, time_remaining,time_remaining/60 fm,time_remaining/60/60 fh, message
from v$session_longops where time_remaining > 0;

7. Cuando termine, se abre la PDB recién pegada

alter pluggable database pbd01 open;
alter session set container=pbd01 ;

8.Validar violación al pegar pdb

No debe devolver filas, si hay filas debe analizarse cada situación contra MOS.

column message format a50
column status format a9
column type format a9
column con_id format 9
select con_id, type, message, status
from PDB_PLUG_IN_VIOLATIONS
where status='PENDING' and type='ERROR' and con_id=3
order by time;
SQL> SQL> SQL> SQL> 2 3 4
no rows selected

9.Script de no marcha atrás: finalización de paso a PDB.

Este script se asegura de crear el diccionario de datos de los objetos permisos, etc que vienen de la NONCDB a PDB.

Yo no se pero en mi experiencia aun hay cositas que le faltan pulir a la PDB , aun en 19c.

@?/rdbms/admin/noncdb_to_pdb.sql

——- el TEMPFILE debe tener espacio suficient een la pdb. mas de 5g.
64GB en PDB y 32Gb en CDB y 20GB al tempo.
–para ejemplo:

alter database tempfile '+dg/tempfile.2.1106479113' resize 31g;

10.Validar fallas en pegado y script final

No debe devolver filas

Observese que hay restricciones de OPEN MODE

     2 PDB$SEED                       READ ONLY  NO
     3 pbd01                        MIGRATE    YES
SQL> column message format a50
column status format a9
column type format a9
column con_id format 9
select con_id, type, message, status
from PDB_PLUG_IN_VIOLATIONS
where status='PENDING' and type='ERROR' and con_id=3
order by time;SQL> SQL> SQL> SQL> 2 3 4
no rows selected

SQL> alter session set container=pbd01;

Session altered.

SQL> column message format a50
column status format a9
column type format a9
column con_id format 9
select con_id, type, message, status
from PDB_PLUG_IN_VIOLATIONS
where status=’PENDING’ and type=’ERROR’ and con_id=3
order by time;SQL> SQL> SQL> SQL> 2 3 4

no rows selected


11. validar open mode y que este RW sin restricciones

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
Version 19.12.0.0.0

SQL> show pdbs;

CON_ID CON_NAME                       OPEN MODE  RESTRICTED

     2 PDB$SEED                       READ ONLY  NO
     3 pbd01                        READ WRITE NO
SQL> alter session set container=pbd01;
Session altered.

PASO MIL.

Abrir la PDB en RW en todos los nodos en todas las instancias si fuera RAC y guardar el estatus.

alter pluggable database pbd01 open instances=all;
alter pluggable database pbd01 save state instances=all;
Pluggable database altered.

SQL> show pdbs;

CON_ID CON_NAME                       OPEN MODE  RESTRICTED

     2 PDB$SEED                       READ ONLY  NO
     3 pbd01                        READ WRITE NO

Espero les sea de utilidad

ADENDA

Puede usarse la instrucción de pegado que pega copiando los datafiles, dejando los originales intactos, esto facilita un método de reversa sin restaurar de backup.

CREATE PLUGGABLE DATABASE pdb6 USING '/tmp/db12c.xml'
COPY
FILE_NAME_CONVERT = ('/rutaCDB/', 'ruta_PDB/');

puede usarse OMF para definir la ruta de crecion, especialmente si es ASM Diskgroup.