# [OCI] Recreación PDB$SEED

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.

```oracle-sql
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:

```sql
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**".

```oracle-sql
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:

![](https://cdn.hashnode.com/uploads/covers/65605419d28f19cc44df7ef1/3b44131d-8d3f-49f9-9398-4643b00912f8.png align="center")

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

```sql

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
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
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
SQL> CREATE PLUGGABLE DATABASE "PDB$SEED" FROM TEST@REMOTE_SEED_LINK;
```

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

```sql
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
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:

```sql
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:

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

![](https://cdn.hashnode.com/uploads/covers/65605419d28f19cc44df7ef1/8d6c955d-ecee-4da1-aad0-c6fffd83c276.png align="center")

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

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

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

```sql
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
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:

```sql
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!
