Skip to main content

Command Palette

Search for a command to run...

[26ai] Hybrid Read-Only Mode PDB

Published
3 min read
[26ai] Hybrid Read-Only Mode PDB

El artículo también se encuentra publicado en Ingles English version.

En el artículo de hoy, vamos a ver el nuevo open-mode introducido en 26ai denominado Hybrid Read-Only .

Cuando usamos este modo, el common user seguirá teniendo acceso read-write, mientras que el local user solo tendrá acceso read-only.

Sin más, vamos a ello.

El primer paso es definir una nueva PDB.

SQL> CREATE PLUGGABLE DATABASE PDB_HYBRID ADMIN USER admin IDENTIFIED BY admin keystore identified by external store;

Pluggable database created.

SQL> ALTER PLUGGABLE DATABASE  PDB_HYBRID OPEN;
Pluggable database altered.

SQL> ALTER PLUGGABLE DATABASE  PDB_HYBRID SAVE STATE;
Pluggable database altered.

Definimos los diferentes usuarios:

SQL> CREATE USER c##hybrid IDENTIFIED BY "XXXXXXX";
User created.
SQL> GRANT DBA TO c##hybrid CONTAINER=ALL;
Grant succeeded.

SQL> alter session set container=pdb_hybrid;
SQL> create smallfile tablespace tb1 
      datafile size 1m autoextend on maxsize 10m;

Tablespace created.

SQL> CREATE USER hybrid IDENTIFIED BY "XXXXXXX"
  DEFAULT TABLESPACE tb1
  TEMPORARY TABLESPACE temp
  QUOTA UNLIMITED ON tb1;  

User created.

SQL> GRANT DBA TO hybrid;

Grant succeeded.

Perfecto, ya tenemos definidos tanto el common user (c##hybrid) como el local user (hybrid).

Antes de abrir la PDB con el nuevo estado, vamos a conectarnos con el usuario hybrid para definir un tabla con algo de información:

SQL> conn hybrid/"XXXXX"@X.X.X.X:1521/pdb_hybrid.XXXX.XXXX.XXXX.com
Connected.
SQL>      
SQL> 
 Create table T_TEST AS 
  SELECT OBJECT_NAME FROM ALL_OBJECTS;

Table created.

Nos conectamos a CDB$Root para poner en modo hybrid read-only la PDB.

SQL> alter pluggable database PDB_HYBRID close;

Pluggable database altered.

SQL> alter pluggable database PDB_HYBRID open hybrid read only;

Pluggable database altered.

SQL> r
    select con_name,
           open_mode,
           is_hybrid_read_only
    from   v$container_topology

CON_NAME             OPEN_MODE  IS_HYBRID_READ_ONLY
-------------------- ---------- --------------------
CDB$ROOT             READ WRITE NO
PDB$SEED             READ ONLY  NO
PDB_HYBRID           READ WRITE YES

Nos conectamos con el local user a la PDB e intentamos realizar operaciones DML (delete) y DDL (truncate).

SQL>  conn hybrid/"XXXXX"@X.X.X.X:1521/pdb_hybrid.XXXX.XXXX.XXXX.com
Connected.
SQL> set linesize 1000
SQL> col name format a20
SQL> select name, open_mode from v$pdbs;

NAME                 OPEN_MODE
-------------------- ----------
PDB_HYBRID           READ ONLY

SQL> delete T_TEST;
delete T_TEST
       *
ERROR at line 1:
ORA-16000: Attempting to modify database or pluggable database that is open for read-only access.
Help: https://docs.oracle.com/error-help/db/ora-16000/


SQL> truncate table T_TEST;
truncate table T_TEST
*
ERROR at line 1:
ORA-16000: Attempting to modify database or pluggable database that is open for read-only access.
Help: https://docs.oracle.com/error-help/db/ora-16000/

Han fallado ambas operaciones con el siguiente mensaje "ORA-16000: Attempting to modify database or pluggable database that is open for read-only access".

Ahora, nos conectamos con el common user y repetimos ambas operaciones.

SQL>  conn c##hybrid/"FJA_2026_Oracle19c" 
Connected.

SQL>  alter session set container=PDB_HYBRID;
Session altered.

SQL>  select name, open_mode from v$pdbs;

NAME                 OPEN_MODE
-------------------- ----------
PDB_HYBRID           READ WRITE

SQL> delete hybrid.T_TEST;

52165 rows deleted.

SQL> truncate table hybrid.T_TEST;

Table truncated.

Hemos podido hacer ambas operaciones.

Otro punto que hay que mirar es la v$pdbs, cuando estamos conectados con el local user el OPEN_MODE viene READ ONLY, en cambio, para el common user el valor es READ WRITE.

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