Local UNDO and Shared Undo
Ricordiamo che il Container DB contiene o solo un container root o un container root e almeno un pluggable database.
Il tablespace Undo può essere configurato in due modi:
- Shared: prevede un solo tablespace undo nel container root comune a tutti i pluggable database.
- Local: prevede un datafile undo nel container root e uno per ogni pluggable. Questa impostazione è di default nella versione 18c.
Nel secondo caso il parametro del database LOCAL_UNDO_ENABLED è impostato a true.
SQL> select * from database_propertieswhere lower(property_name) ='local_undo_enabled';
PROPERTY_NAME PROPERTY_VALUE DESCRIPTION
--------------------------------------------------------------------
LOCAL_UNDO_ENABLED TRUE true if local undo is enabled
In questo caso le transazioni non committate non vengono clonate.
Description: unable to create pluggable database from string
Cause: An attempt was made to clone a pluggable database that did not have local undo enabled.
Esraiamo dalla sguente query il path contenente i datafiles:
Se si vuole invece clonare un pdb con shared undo, compare il messaggio di errore:
Error code: ORA-65035Description: unable to create pluggable database from string
Cause: An attempt was made to clone a pluggable database that did not have local undo enabled.
Per passare da Shared Undo a Local Undo impostare il parametro LOCAL_UNDO_ENABLED a FALSE.
Accedi come sysdba al container root
1) SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> show user
USER is "SYS"
SQL> select * from database_properties
where lower(property_name) ='local_undo_enabled';
where lower(property_name) ='local_undo_enabled';
PROPERTY_VALUE
------------------------------
TRUE
3) SQL> shutdown immediate;
4) SQL> startup upgrade;
5) SQL> alter database local undo off;
6) SQL> shutdown immediate;
7) SQL> startup;
8) Verifica:
SQL> select property_value from database_properties where property_name='LOCAL_UNDO_ENABLED';
PROPERTY_VALUE
-----------------------
FALSE
Creiamo una tabella nel pdb "orclpdb" ed effettuatiamo una insert senza commit.
SQL> create table test1 (x number);
Table created.
SQL> insert into test1 values (1);
1 row created.
Apriamo una nuova sessione e cloniamo il pdb orclpdb.
SQL> alter session set container=ORCLPDB;
Esraiamo dalla sguente query il path contenente i datafiles:
SQL> select * from dba_data_files;
Creiamo una nuova direcotry contenente il pdb clonato
SQL> select * from dba_data_files;
SQL> ! mkdir /u01/app/oracle/oradata/ORCL/orclclone
SQL> alter session set container=cdb$root;
SQL> create pluggable database orclclone from orclpdb
file_name_convert = ('/u01/app/oracle/oradata/ORCL/orclpdb/','/u01/app/oracle/oradata/ORCL/orclclone/');*
ERROR at line 1:
ORA-65035: unable to create pluggable database from ORCLPDB
Ecco il risultato atteso: non può essere creato un clone perchè il pdb usa uno "shared undo".
Se infatti proviamo ad impostare nuovamente "local undo" seguendo i passi di prima con l'unica differnza del punto
5) SQL> alter database local undo on
la clonazione va a buon esito.Inoltre la insert effettuata e non committata non sarà presente nel nuovo pdb a conferma di quanto detto all'inizio del post: In questo caso le transazioni non committate non vengono clonate.