Skip to main content

Command Palette

Search for a command to run...

[OCI] Recreación PDB$SEED

Updated
4 min readView 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!