# [OCI] Proxy PDB

*El artículo también se encuentra publicado en Ingles* [***English version***](https://dbaintheshadow.com/oci-26ai-refreshable-clone-pdbs?showSharer=true)*.*

En el artículo de hoy, vamos a ver las **Proxy PDB.**

Pero, ¿Qué es un **proxy PDB**? Es hacer referencia a otra PDB pero de manera remota o en mismo CDB. Podríamos decir que es algo similar a los clásicos **DB Links** cuando hacemos referencia a una tabla, pero en este caso no se trata de una tabla, sino de una PDB.

Algunas notas que debemos tener en cuenta:

* El usuario que utilicemos debe tener el permiso de **CREATE PLUGGABLE DATABASE**.
    
* La PDB debe estar en **local undo mode**.
    
* La PDB debe estar en modo **ARCHIVELOG**.
    
* La PDB que hacemos referencia debe estar **OPEN READ WRITE** cuando el proxy PDB es creado. Una vez creada, puede ser cambiada.
    
* Debemos crear un **DB Link** que hace referencia tanto a la CDB como a la PDB.
    

Para poder llevar a cabo este laboratorio, vamos a definir dos máquinas virtuales, ambas con la última versión de Oracle en OCI.

Las máquinas que hemos definido son las siguientes:

* **Source**: 26ai VM DB System Oracle Cloud (*test\_ORI*).
    
* **Target**: 26ai VM DB System Oracle Cloud (*test\_TARGET*).
    

¡Vamos a ello!

1º: Definir la PDB PDB\_DAVID en TEST\_ORI:

```plaintext
SQL> 
CREATE PLUGGABLE DATABASE PDB_DAVID ADMIN USER ADMIN 
  IDENTIFIED BY ADMIN keystore identified by external store;
Pluggable database created.
SQL> ALTER PLUGGABLE DATABASE PDB_DAVID OPEN;
Pluggable database altered.
SQL> ALTER PLUGGABLE DATABASE PDB_DAVID SAVE STATE;
Pluggable database altered.
SQL> show pdbs
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         4 PDB_DAVID                      READ WRITE NO
SQL> ! hostname
source
```

2º: Definir un usuario común. El rol DBA ya incluye tanto *CREATE SESSION* como *CREATE PLUGGABLE DATABASE*. Haremos lo mismo en target.

```plaintext
SQL> CREATE USER C##MANAGER IDENTIFIED BY "XXXXXXX";
User created.
SQL> GRANT RESOURCE, DBA, UNLIMITED TABLESPACE TO C##MANAGER CONTAINER=ALL;
Grant succeeded.
```

3º: Revisamos que la PDB en origen se encuentra **local undo mode**. En caso que no se encuentre, debemos configurarlo.

```plaintext
SQL> r
  1* Select property_name, property_value 
       From database_properties 
      Where property_name='LOCAL_UNDO_ENABLED'

PROPERTY_NAME        PROPERTY_VALUE
-------------------- ----------------------------------------
LOCAL_UNDO_ENABLED   TRUE
```

4º: Definimos el **DB Links** en destino. Para hacerlo diferente, vamos a utilizar **easy connect** en vez de **local naming**:

```plaintext
SQL> 
CREATE DATABASE LINK SOURCE_PROXY CONNECT TO C##MANAGER 
  IDENTIFIED BY "XXXXX" 
    USING 'source:1521/pdb_david.XXXXXXXXXXXXXXXX';

Database link created.

SQL> 
SQL>  SELECT * FROM DUAL@SOURCE_PROXY;

D
-
X
```

5º: Definimos nuestra PDB incluyendo **AS PROXY** para indicar que vamos a crear una proxy PDB y **FROM** para especificar la PDB a la que vamos hacer referencia.

```plaintext
SQL> 
CREATE PLUGGABLE DATABASE PDB_DAVID AS PROXY 
  FROM PDB_DAVID@SOURCE_PROXY keystore identified by external store;
Pluggable database created.
SQL> alter pluggable database pdb_david open;
Pluggable database altered.
SQL> show pdbs

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

SQL> r
  1  SELECT pdb_name, is_proxy_pdb
  2* FROM   cdb_pdbs

PDB_NAME                       IS_PROXY_PDB
------------------------------ ----------------------------------------
PDB$SEED                       NO
PDB_DAVID                      YES
```

Cosas a tener en cuenta:

* **V$PROXY\_PDB\_TARGETS:** Muestra información sobre los detalles de conexión sobre la PDB a la que hace referencia nuestra Proxy PDB.
    

```plaintext
SQL> r
  1* select * from v$proxy_pdb_targets

    CON_ID TARGET_PORT TARGET_HOST          TARGET_SERVICE                                                                   TARGET_USER
---------- ----------- -------------------- -------------------------------------------------------------------------------- --------------------
         3        1521 source               4843e8f3860c707be063cfdf680abf32.XXXXXXX.XXXXXXX.XXXXXXX.com
```

* Los tablespace de **SYSTEM** y **SYSAUX** serán copiados y sincronizador con el origen.
    
* Solo admite **password authentication**, no permite **OS authentication**. Si nos fijamos en el ejemplo de abajo, vemos como funcionan ambos métodos de autenticación y que ocurre al consultar una tabla en nuestra **Proxy PDB**.
    

```plaintext
[oracle@target ~]$ sqlplus / as sysdba
Connected to:
Oracle AI Database 26ai EE High Perf Release 23.26.0.0.0 - for Oracle Cloud and Engineered Systems
Version 23.26.0.0.0
SQL> alter session set container= PDB_DAVID;
Session altered.
SQL>  Select * From C##MANAGER.CODIGO_POSTAL;
 Select * From C##MANAGER.CODIGO_POSTAL
                          *
ERROR at line 1:
ORA-00942: table or view "C##MANAGER"."CODIGO_POSTAL" does not exist
Help: https://docs.oracle.com/error-help/db/ora-00942/

SQL> conn C##MANAGER/"XXXXXXXX"@'target:1521/pdb_david.XXXXXXXX.XXXXXXXX.XXXXXXXX.com'
Connected.
SQL>  Select * From C##MANAGER.CODIGO_POSTAL;

ID    POBLACION                                                                                            PAIS
----- ---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
46000 Valencia                                                                                             Espa??a
08000 Barcelona                                                                                            Espa??a
28000 Madrid                                                                                               Espa??a
55500 Wisconsin                                                                                            U.S.A.
```

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