1. Start
  2. Unternehmen
  3. Blog
  4. Hybrid Read-Only Mode für PDBs und Read-Only Benutzer

Hybrid Read-Only Mode für PDBs und Read-Only Benutzer

Überblick

In diesem Blogbeitrag werden der Hybrid Read-Only Mode für PDBs sowie Read-Only Benutzer vorgestellt.
Beide Funktionalitäten sind ab Oracle 23c verfügbar und werden auf der Oracle 23c FREE gezeigt.

OPEN MODE PDBs

Beginnen möchte ich mit einem Überblick der verschiedenen OPEN MODE der PDBs bis Oracle 21c und deren Anwendungsfällen.

1. OPEN MODE: MOUNTED

Nach dem Starten einer CDB sind alle PDBs anfangs standardmäßig im MOUNTED Mode. Dieser Mode wird beim Recovery von systemkritischen Daten vom SYSTEM- oder UNDO Tablespace genutzt.
Nur Benutzer mit speziellen Privilegien wie SYSDBA oder SYSBACKUP können sich anmelden.

 

$ echo $ORACLE_SID
FREE

$ sqlplus / as sysdba

SQL*Plus: Release 23.0.0.0.0 - Production on Wed Feb 21 16:17:58 2024
Version 23.3.0.23.09

Copyright (c) 1982, 2023, Oracle.  All rights reserved.


Connected to:
Oracle Database 23c Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.3.0.23.09

SYS@FREE:CDB$ROOT:> show pdbs

    CON_ID CON_NAME			  OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
	 2 PDB$SEED			  READ ONLY  NO
	 3 FREEPDB1			  MOUNTED
	 4 PDBORCL			  MOUNTED
	 5 PDB1 			  MOUNTED

 

2. OPEN MODE: READ WRITE

In diesem Mode haben sowohl Global User wie auch Local User den vollen Lese/Schreibzugriff entsprechend ihrer vorhanden Privilegien.
Dieser Mode ist hier als Standard Mode für den Start der CDB konfiguriert.

 

SYS@FREE:CDB$ROOT:> alter pluggable database all open;

Pluggable database altered.

SYS@FREE:CDB$ROOT:> alter pluggable database all save state;

Pluggable database altered.

SYS@FREE:CDB$ROOT:> startup force

SYS@FREE:CDB$ROOT:> show pdbs

    CON_ID CON_NAME			  OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
	 2 PDB$SEED			  READ ONLY  NO
	 3 FREEPDB1			  READ WRITE NO
	 4 PDBORCL			  READ WRITE NO
	 5 PDB1 			  READ WRITE NO

 

3. OPEN MODE: READ ONLY

Hier wird die PDB PDBORCL in den READ ONLY Mode gebracht. Damit sind in dieser PDB keine Schreibvorgänge möglich, weder für Global User noch für Local User, unabhängig von den vorhandenen Privilegien. Dieser Mode könnte für historischen Daten verwendet werden, die nicht mehr geändert werden müssen.
Nach einer initialen Sicherung entsprechend der jeweiligen RMAN Retention Policy ist keine weitere Sicherung notwendig.

 

SYS@FREE:CDB$ROOT:> alter pluggable database PDBORCL close immediate;

SYS@FREE:CDB$ROOT:> alter pluggable database PDBORCL open read only;

Pluggable database altered.

SYS@FREE:CDB$ROOT:> show pdbs

    CON_ID CON_NAME			  OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
	 2 PDB$SEED			  READ ONLY  NO
	 3 FREEPDB1			  READ WRITE NO
	 4 PDBORCL			  READ ONLY  NO
	 5 PDB1 			  READ WRITE NO

SYS@FREE:CDB$ROOT:> conn system/Welcome_1@localhost/pdborcl

SYSTEM@FREE:PDBORCL:> create table test_ro (sp1 number);
create table test_ro (sp1 number)
*
ERROR at line 1:
ORA-16000: Attempting to modify database or pluggable database that is open for read-only access.

 

Noch ein Hinweis zum SQL Prompt: Dort findet man im Beispiel:
User Name, Instance Name und Container Name, was eine häufige Abfrage nach dem aktuellen Container erspart (show con_name). Nähere Informationen dazu finden Sie im Blogbeitrag meines Kollegen Marco Pachaly-Mischke:
https://www.robotron.de/unternehmen/aktuelles/blog/vordefinierte-variablen-in-sqlplus-verwenden-teil-ii


4. OPEN MODE: MIGRATE

Diese Mode entsteht, wenn eine Migration notwendig ist. Im Beispiel wurde eine 12.2 Datenbank (NON-CDB oder PDB) in eine 19c Container Datenbank eingepluggt.
Die Migration der PDB kann z.B. durch das "dbupgrade" Kommando erfolgen.

 

SYS@CDB19:CDB$ROOT:> alter pluggable database pdb_noncdb open;

Warning: PDB altered with errors.

SYS@CDB19:CDB$ROOT:> show pdbs

CON_ID     CON_NAME                       OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2          PDB$SEED                       READ ONLY NO
3          PDB_NONCDB                     MIGRATE YES

SYS@CDB19:CDB$ROOT:> SELECT message, status, action 
                     FROM pdb_plug_in_violations 
                     WHERE name='PDB_NONCDB';

MESSAGE                                                                                        STATUS    ACTION
---------------------------------------------------------------------------------------------- --------- ----------------------------------------------------------
PDB's version does not match CDB's version: PDB's version 12.2.0.1.0. CDB's version 19.0.0.0.0.PENDING   Either upgrade the PDB or reload the components in the PDB.

$ mkdir /home/oracle/upgrade
$ dbupgrade -c 'PDB_NONCDB' -l /home/oracle/upgrade

 

5. OPEN MODE: READ WRITE RESTRICTED

In diesem Mode haben nur Nutzer Zugriff, die das Privileg "Restricted Session" besitzen (z.B. SYS und SYSTEM).
Im Beispiel ist dieser Mode entstanden, weil eine NON-CDB Datenbank eingepluggt wurde und die Konvertierung des PDB Dictionaries noch fehlt.
Für die Ausführung des Skripts "noncdb_to_pdb.sql" muss die PDB READ WRITE sein, aber "normale " Nutzer haben keinen Zugriff aufgrund des Restricted Mode.

 

SYS@CDB19:CDB$ROOT:> alter pluggable database PDB_NONCDB open;

Warning: PDB altered with errors.

SYS@CDB19:CDB$ROOT:> show pdbs

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

SYS@CDB19:CDB$ROOT:> SELECT message, status, action 
                     FROM pdb_plug_in_violations 
                     WHERE name='PDB_NONCDB';

MESSAGE                                                                                         STATUS    ACTION
---------------------------------------------------------------------------------------------- --------- ----------------------------------------------------------
PDB plugged in is a non-CDB, requires noncdb_to_pdb.sql be run.                                PENDING    Run noncdb_to_pdb.sql.

SQL> alter session set container=PDB_NONCDB;
SQL> @$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql
SQL> alter pluggable database PDB_NONCDB close immediate;
SQL> alter pluggable database PDB_NONCDB open;

Hybrid READ-ONLY Mode


Mit Oracle 23c gibt es den Hybrid READ-ONLY Mode für PDBs. Dieser Mode ermöglicht es Common User, schreibend auf eine PDB zuzugreifen, während die PDB für Local User READ-ONLY ist.

1. Einschalten Hybrid READ-ONLY Mode

Nach dem Einschalten zeigt das "show pdbs"-Kommando den neuen Mode nicht, dazu ist ein Blick in die View "v$container_topology", Spalte "IS_HYBRID_READ_ONLY" nötig.

 

SYS@FREE:CDB$ROOT:> alter pluggable database pdborcl close immediate;

SYS@FREE:CDB$ROOT:> alter pluggable database pdborcl open hybrid read only;

Pluggable database altered.

SYS@FREE:CDB$ROOT:> show pdbs

    CON_ID CON_NAME			  OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
	 2 PDB$SEED			  READ ONLY  NO
	 3 FREEPDB1			  READ WRITE NO
	 4 PDBORCL			  READ WRITE NO
	 5 PDB1 			  READ WRITE NO

SYS@FREE:CDB$ROOT:> 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
FREEPDB1   READ WRITE NO
PDBORCL    READ WRITE YES
PDB1	   READ WRITE NO

 

2. Nutzung durch Common User

Common User können entsprechend ihrer Privilegien READ-WRITE auf die PDB zugreifen.

 

SYS@FREE:CDB$ROOT:> create user c##dba_global identified by Welcome_1 container=all;

User created.

SYS@FREE:CDB$ROOT:> grant dba to c##dba_global container=all;

Grant succeeded.

SYS@FREE:CDB$ROOT:> select con_id, username 
                    from cdb_users 
                    where username ='C##DBA_GLOBAL';

    CON_ID USERNAME
---------- --------------------
	 1 C##DBA_GLOBAL
	 3 C##DBA_GLOBAL
	 4 C##DBA_GLOBAL
	 5 C##DBA_GLOBAL

SYS@FREE:CDB$ROOT:> conn c##dba_global/Welcome_1@localhost/pdborcl
Connected.

C##DBA_GLOBAL@FREE:PDBORCL:> select name, open_mode from v$pdbs;

NAME	   OPEN_MODE
---------- ----------
PDBORCL    READ WRITE

C##DBA_GLOBAL@FREE:PDBORCL:> create user pdb1_dba identified by Welcome_1;

User created.

C##DBA_GLOBAL@FREE:PDBORCL:> grant dba to pdb1_dba container=current;

Grant succeeded.

C##DBA_GLOBAL@FREE:PDBORCL:> create table pdb1_dba.t1 (sp1 number);

Table created.

C##DBA_GLOBAL@FREE:PDBORCL:> insert into pdb1_dba.t1 values(99);

1 row created.

C##DBA_GLOBAL@FREE:PDBORCL:> commit;

Commit complete.

 

3. Nutzung durch LOCAL USER

Local User haben unabhängig ihrer Privilegien nur eine READ-ONLY Zugriff auf die PDB.

 

C##DBA_GLOBAL@FREE:PDBORCL:> conn pdb1_dba/Welcome_1@localhost/pdborcl
Connected.
PDB1_DBA@FREE:PDBORCL:> select * from session_roles where role='DBA';

ROLE
----
DBA

PDB1_DBA@FREE:PDBORCL:> select name, open_mode from v$pdbs;

NAME	   OPEN_MODE
---------- ----------
PDBORCL    READ ONLY

PDB1_DBA@FREE:PDBORCL:> select con_name, open_mode, is_hybrid_read_only
                        from   v$container_topology;

CON_NAME   OPEN_MODE  IS_HYBRID_READ_ONLY
---------- ---------- --------------------
PDBORCL    READ WRITE YES

-- Local User koennen deshalb weder DDL noch DML ausführen

PDB1_DBA@FREE:PDBORCL:> create table pdb1_dba.t2 (sp1 number);
create table pdb1_dba.t2 (sp1 number)
*
ERROR at line 1:
ORA-16000: Attempting to modify database or pluggable database that is open for read-only access.

PDB1_DBA@FREE:PDBORCL:> insert into t1 values(100);
insert into t1 values(100)
            *
ERROR at line 1:
ORA-16000: Attempting to modify database or pluggable database that is open for read-only access.

 

4. Rückschalten auf READ-WRITE Mode

 

SYS@FREE:CDB$ROOT:PDBORCL> conn / as sysdba
SYS@FREE:CDB$ROOT:> alter pluggable database pdborcl close immediate;
SYS@FREE:CDB$ROOT:> alter pluggable database pdborcl open read write;

SYS@FREE:CDB$ROOT:> select con_name, open_mode, is_hybrid_read_only
                    from   v$container_topology
                    where  con_name = 'PDBORCL';

CON_NAME   OPEN_MODE  IS_HYBRID_READ_ONLY
---------- ---------- --------------------
PDBORCL    READ WRITE NO

Read-Only Nutzer

Ab Oracle 23c können auch Benutzer in PDBs READ-ONLY geschaltet wie das folgende Beispiel zeigt.
Allerdings können Common User nicht READ-ONLY geschaltet werden, weder im ROOT Container noch in PDBs.

 

SYSTEM@FREE:PDBORCL:> create user Toni identified by toni read only quota 5m on users;

User created.

SYSTEM@FREE:PDBORCL:> grant create session, select any table, delete any table to toni;

Grant succeeded.


SYSTEM@FREE:PDBORCL:> connect toni/toni@pdborcl

TONI@FREE:PDBORCL:> select empno,ename,job 
                    from scott.emp 
                    where  JOB='CLERK';

     EMPNO ENAME      JOB
---------- ---------- ---------
      7369 SMITH      CLERK
...

TONI@FREE:PDBORCL:> delete from scott.emp where  JOB='CLERK';
delete from scott.emp where  JOB='CLERK'
                  *
ERROR at line 1:
ORA-28194: Can perform read operations only

TONI@FREE:PDBORCL:> connect sys/Welcome_1@pdborcl as sysdba

SYS@FREE:PDBORCL:> select USERNAME,AUTHENTICATION_TYPE as AUTHENT, READ_ONLY "R/O" 
                   from dba_users 
                   where username='TONI';

USERNAME	     AUTHENT  R/O
---------------  -------- ---
TONI		     PASSWORD YES

-- Zurückschalten auf Read Write User

SYS@FREE:PDBORCL:> alter user toni read write;

User altered.

SYS@FREE:PDBORCL:> select USERNAME,AUTHENTICATION_TYPE as AUTHENT, READ_ONLY "R/O" 
                   from dba_users 
                   where username='TONI';

USERNAME	     AUTHENT  R/O
---------------- -------- ---
TONI		     PASSWORD NO

-- Hinweis: Common User im ROOT Container können nicht READ Only gesetzt werden

SYS@FREE:PDBORCL:> connect sys/Welcome_1@free as sysdba
Connected.
SYS@FREE:CDB$ROOT:> create user c##Toni identified by toni read only quota 5m on users;
create user c##Toni identified by toni read only quota 5m on users
*
ERROR at line 1:
ORA-28192: Enabling or disabling read-only property is not allowed on a common user.

Zusammenfassung

Mit Oracle 23c können PDBs in den Hybrid READ-ONLY Mode gesetzt werden. Damit können Applikationsadministratoren als Common User Anwendungen aktualisieren/patchen, ohne dass Anwender als Local User durch eigene Änderungen den Aktualisierungsprozess behindern können. Nach Ende der Änderungen kann die PDB wieder im READ-WRITE Mode geöffnet werden.

Weiterhin können auch einzelne Benutzer von PDBs (Loacl User) dauerhaft oder zeitweilig READ-ONLY geschaltet werden.

Kommentare

Keine Kommentare

Kommentar schreiben

* Diese Felder sind erforderlich