Skip to main content

Command Palette

Search for a command to run...

[OCI] Recreación PDB$SEED

Updated
•4 min read•View as Markdown
[OCI] Recreación PDB$SEED
D

Ingeniero informático, Oracle ACE, DBA y Arquitecto OCI, con más de 15 años de experiencia en plataformas Oracle. Certificado en OCI Certified Architect Professional y OCI Migration and Integration Certified Professional.

En el artículo de hoy vamos a ver como podemos recrear una PDB$Seed de manera fácil en caso que se quede corrupta y no tengamos backup.

sys@> alter pluggable database PDB$SEED open read only;
alter pluggable database PDB$SEED open read only
*
ERROR en lÝnea 1:
ORA-01173: el diccionario de datos indica que falta un archivo datos del tablespace SYSTEM

Los pasos que vamos a realizar para re-crearla son los siguientes:

  • Eliminar la PDB$Seed.

  • Crear una PDB vacía en otro CDB$Root para clonarla.

  • Crear PDB$Seed en base al punto anterior.

Sin más, vamos a ello.

1.- Eliminar PDB$Seed

Recibiremos un error en caso de que intentamos borrarla directamente:

sys@OSIALEPR>  drop pluggable database "pdb$seed" including datafiles;
 drop pluggable database "pdb$seed" including datafiles
                         *
ERROR en lÝnea 1:
ORA-65017: la base de datos de conexi¾n inicial no se puede borrar ni modificar

Para poder borrarla con éxito, debemos jugar con el parámetro "_oracle_script".

sys@> alter session set "_oracle_script"=true;
sys@> alter pluggable database "pdb$seed" close;
sys@> drop pluggable database "pdb$seed" including datafiles;
sys@> show pdbs

    CON_ID CON_NAME    OPEN MODE  RESTRICTED
---------- ----------- ---------- ----------
         3 PDB1        READ WRITE NO

SQL> alter session set "_oracle_script"=false;  

Ahí podéis ver la secuencia que he seguido, entre medias verifico que la PDB$Seed ha desaparecido.

2.- Pasos previos antes de la clonación de la PDB

Vamos a preparar en otro entorno la PDB que va servir como base a nuestra PDB$Seed.

Como vamos a tener dos máquinas, para diferenciarlo, vamos a llamar origen a donde tenemos que recrear la PDB$Seed y clonado donde vamos a definir la PDB que va servir para re-crearla.

Este seria el modelo que vamos a seguir:

Primero, definimos el usuario común C##CLONE en origen.


SQL> CREATE USER C##CLONE IDENTIFIED BY "XXXXX";
SQL> GRANT CONNECT, RESOURCE, DBA, SYSOPER, CREATE PLUGGABLE DATABASE TO C##CLONE CONTAINER=ALL;

Defino la pdb TEST en clonado.

SQL> create pluggable database TEST admin user pdb_admin identified by oracle;
SQL> alter pluggable database TEST open;
SQL> alter pluggable database TEST close;
SQL> alter pluggable database TEST open read only;

Creamos el DBLink en origen, habiendo incluido previamente la cadena de conexión en nuestro tnsnames.

SQL> CREATE DATABASE LINK REMOTE_SEED_LINK CONNECT TO C##CLONE IDENTIFIED BY "XXXXXX" using 'CLONADO';

Hasta aquí, ya tendríamos todo listo para crear de nuevo, nuestra PDB$Seed

Crear PDB$Seed

Una vez definido el DBLink, ya podremos clonar TEST con nombre de PDB$Seed.

SQL> CREATE PLUGGABLE DATABASE "PDB$SEED" FROM TEST@REMOTE_SEED_LINK;

Una vez finalizado, veifico que vemos ya PDB$Seed en origen.

sys@> show pdbs

    CON_ID CON_NAME    OPEN MODE  RESTRICTED
---------- ----------- ---------- ----------
         2 PDB$SEED    MOUNTED
         3 PDB1        READ WRITE NO

Perfecto, ya la vemos en origen. En este punto ya solo faltaría abrirla en READ ONLY.

SQL> alter session set "_oracle_script"=true;
Session altered.

SQL> alter pluggable database PDB$SEED open read write;
Pluggable database altered.

SQL> alter pluggable database PDB$SEED close;
Pluggable database altered.

SQL> alter pluggable database PDB$SEED open read only;
Pluggable database altered.

SQL> alter session set "_oracle_script"=false;
Session altered.

Volvemos a verificar:

sys@> show pdbs

    CON_ID CON_NAME    OPEN MODE  RESTRICTED
---------- ----------- ---------- ----------
         2 PDB$SEED    READ ONLY  YES
         3 PDB1        READ WRITE NO

Vaya, nuestra PDB$Seed tiene algún problemilla, tenemos que revisar PDB_PLUG_IN_VIOLATIONS para ver que sucede:

sys@> 
 Select Name, Cause, Type, Message, Status From Pdb_Plug_In_Violations Where  Status != 'RESOLVED' And Type='ERROR' Order By Name;

El error es claro, así que debemos ejecutar el datapatch para solucionarlo

[oracle@~]$ $ORACLE_HOME/OPatch/datapatch -verbose

Una vez finalizado, verificamos que el problema se ha solucionado:

SQL> 
select type, cause, message,CON_ID
from PDB_PLUG_IN_VIOLATIONS
where status != 'RESOLVED';

no rows selected

Ya no tenemos errores, así que ya solo faltaria dejar nuestra PDB$Seed en modo READ ONLY,

SQL> alter session set container=PDB$SEED;

Session altered.

SQL> alter session set "_oracle_script"=TRUE;

Session altered.

SQL> alter pluggable database PDB$SEED  close immediate instances=all;

Pluggable database altered.

SQL>  alter pluggable database  PDB$SEED OPEN READ ONLY;

Pluggable database altered.

SQL>  alter session set "_oracle_script"=false;

Session altered.

Verificamos de nuevo:

sys@> show pdbs

    CON_ID CON_NAME    OPEN MODE  RESTRICTED
---------- ----------- ---------- ----------
         2 PDB$SEED    READ ONLY  NO
         3 PDB1        READ WRITE NO

Espero que os guste. ¡Nos vemos en el próximo artículo!

J

Buenísimo David!! Espero no encontrarme con una de estas, pero si me ocurre, ya tengo tu guía de salvamento!!! Brutal!

More from this blog

DBA en la SOMBRA

104 posts

Tutoriales, scripts y casos prácticos que hacemos los DBA de desarrollos. Únase a mí en mi viaje para optimizar y aprender.