[OCI] Recreación PDB$SEED
![[OCI] Recreación PDB$SEED](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fuploads%2Fcovers%2F65605419d28f19cc44df7ef1%2F289ede5b-558c-4f93-b5c0-fa04680c91ca.png&w=3840&q=75)
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!
![[OCI] Clone PDB](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fuploads%2Fcovers%2F65605419d28f19cc44df7ef1%2F8ce0c665-4a5d-459d-91cf-ffe3f47d8176.png&w=3840&q=75)
![[OCI] Check Jobs DBCli](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fuploads%2Fcovers%2F65605419d28f19cc44df7ef1%2F1376a869-58fa-491e-926a-a6ead08f9c80.png&w=3840&q=75)
![[26ai] JOIN_TO_ME](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fuploads%2Fcovers%2F65605419d28f19cc44df7ef1%2F16a23f6e-ec4c-4f0a-9529-2c8a2af2ef5e.png&w=3840&q=75)
![[26ai] Limpieza de objetos obsoletos en desuso](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fuploads%2Fcovers%2F65605419d28f19cc44df7ef1%2F93181086-1008-4184-8454-33b7367ebedb.png&w=3840&q=75)