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