# [OCI] Clone PDB

*El artículo también se encuentra publicado en Ingles* [***English version***](https://dbaintheshadow.com/oci-clone-pdb)*.*

En el artículo de hoy vamos a ver como podemos **clonar** una PDB usando **RMAN Active Duplicate** o bien usando una instrucción **DDL** entre diferentes **CDB$Root**.

![](https://cdn.hashnode.com/uploads/covers/65605419d28f19cc44df7ef1/c8bd4f6d-984b-47e8-ac7e-33eccef90736.png align="center")

### DDL

Para el primer caso tengo un script para automatizar este paso. Este script se debe ejecutar con el usuario **oracle** y en la máquina de destino.

Link a github:

[https://github.com/dbaenlasombra/OCI/blob/main/remote\_clonning.sh](https://github.com/dbaenlasombra/OCI/blob/main/remote_clonning.sh)

¿Qué hace el script?

*   Define un **usuario común** en origen con los permisos necesarios. El nombre es una cadena random **no** es estático, generada en unix "*tr -dc 'A-Za-z' </dev/urandom | head -c 5 | tr '\[:lower:\]' '\[:upper:\]'*" , así como la **password** , generada y cumpliendo los requisitos mínimos de seguridad de Oracle.
    
*   Define el **DB Link** en destino. Igual que el paso previo, se genera el nombre de manera aleatoria.
    
*   Creación de la **PDB**.
    

Una vez que se ha creado la PDB, el script eliminará el **usuario común** así como el **DB Link**.

Todos los nombres se generan **random** para **no** interferir con otros trabajos que haya en ese momento en nuestra PDB.

Como pasos previos antes de ejecutar el script, necesitamos hacer lo siguiente:

*   Configurar una clave **rsa** para el usuario **oracle** en destino con nombre **id\_rsa** y configurar esa clave en origen para permitir la comunicación entre ambas máquinas.
    
*   Configurar el **local naming** "*SOURCE*" en el tnsnames de **destino** con la cadena de conexión de nuestro origen.
    
*   Configurar en destino el parámetro **one\_step\_plugin\_for\_pdb\_with\_tde** a **true**.
    

Este script espera los siguientes parámetros en este orden:

*   **IP** del **origen**. El motivo, es que abre una conexión *ssh* con el usuario **oracle** para entrar como **sysdba** y ejecutar las instrucciones necesarias para definir el usuario común.
    
*   **Nombre** de la **PDB** que vamos a clonar.
    
*   **Password** de la **TDE**.
    

Lanzamos el sh en modo nohup:

```shell
[oracle@~]$ 
nohup ./remote_clonning.sh $1 $2 $3 > /tmp/remote_clonning.log 2>&1 &

```

Y esto sería la salida del sh:

![](https://cdn.hashnode.com/uploads/covers/65605419d28f19cc44df7ef1/f113fabc-b8c2-45ae-b0db-5b7ecfbed944.png align="center")

El script también nos informaría en caso de fallo:

![](https://cdn.hashnode.com/uploads/covers/65605419d28f19cc44df7ef1/1d9785d9-1dbc-4e4c-8bb9-fd6a748db379.png align="center")

### RMAN ACTIVE DUPLICATE

En este laboratio, también hay un script como en el paso anterior.

Link a github:

[https://github.com/dbaenlasombra/OCI/blob/main/rman\_clone\_pdb.sh](https://github.com/dbaenlasombra/OCI/blob/main/rman_clone_pdb.sh)

Como pasos previos necesitamos hacer lo siguiente

*   Incluir las cadenas de conexión de origen como destino en ambas máquinas.
    
*   Exportar la **wallet** en origen para importarla en destino.
    
*   Modificar el parámetro **remote\_recovery\_file\_dest** en destino:
    

```sql
SQL> alter system set remote_recovery_file_dest = '+RECO' scope = both sid = '*';
```

Este script espera los siguientes parámetros en este orden:

*   **Connector** para la base de datos que hace de **auxiliar**.
    
*   **Connector** para la base de datos que hace de **target**.
    
*   **Nombre** de la **PDB** que vamos a clonar.
    
*   **Nombre** de la DB.
    

Lanzamos el sh en modo nohup:

```shell
[oracle@ ~]$ nohup ./rman_clone_pdb.sh "user$/$pass@$local_name" "user$/$pass@$local_name" $pdb $db > /tmp/rman_clone_pdb.log 2>&1 &
```

Y esto sería la salida del sh:

![](https://cdn.hashnode.com/uploads/covers/65605419d28f19cc44df7ef1/1109564f-0b7a-44b0-9766-f4d4cb2a32fc.png align="center")

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