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_properties
       where lower(property_name) ='local_undo_enabled';


PROPERTY_NAME         PROPERTY_VALUE   DESCRIPTION
--------------------------------------------------------------------
LOCAL_UNDO_ENABLED     TRUE            true if local undo is enabled


Il vantaggio nell'uso del Local Undo è la posssibilità di clonare i pdb senza riscontrare errori. 
In questo caso le transazioni non committate non vengono clonate.

Se si vuole invece clonare un pdb con shared undo, compare il messaggio di errore:
Error code: ORA-65035
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.


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';

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.



Post popolari in questo blog

ORA-12154: TNS: il listener non è attualmente a conoscenza del servizio richiesto nel descrittore di connessione

Create e Drop Pluggable Database