Parameter undo_retention und PDBs

Heute wollen wir auf ein geändertes Verhalten der Oracle Datenbank seit der Version 19.9 aufmerksam machen. Bisher war es so, dass Pluggable Databases (PDBs) die Einstellungen von der Container Database (CDB) geerbt haben. Das galt unter anderem auch für die undo_retention. Seit der Version 19.9 wird der Wert für die undo_retention aber nicht mehr an die PDBs weitergegeben. Das lässt sich leicht überprüfen. Initial ist gar kein Wert für undo_retention gesetzt und sowohl CDB als auch alle PDBs haben daher den Standardwert von 900.

 

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 MMI1                           READ WRITE NO
         4 MMI2                           READ WRITE NO

SQL> show parameter undo_retention

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_retention                       integer     900

SQL> select name, value from v$spparameter where name='undo_retention';

NAME                 VALUE
-------------------- ---------------------------
undo_retention

SQL> alter session set container=mmi1;

Session altered.

SQL> show parameter undo_retention

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_retention                       integer     900

SQL> alter session set container=mmi2;

Session altered.

SQL> show parameter undo_retention

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_retention                       integer     900

 

Setzt man nun explizit einen Wert für die undo_retention in der CDB, so wird diese Einstellung nicht mehr an die PDBs weitergegeben.

 

SQL> alter session set container=cdb$root;

Session altered.

SQL> alter system set undo_retention=14400 scope=both;

System altered.

SQL> select name, value from v$spparameter where name='undo_retention';

NAME                 VALUE
-------------------- ---------------------------
undo_retention       14400

SQL> show parameter undo_retention

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_retention                       integer     14400

SQL> alter session set container=mmi1;

Session altered.

SQL> show parameter undo_retention

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_retention                       integer     900

SQL> alter session set container=mmi2;

Session altered.

SQL> show parameter undo_retention

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_retention                       integer     900

 

Zum Glück hat Oracle aber eine Option für ALTER SYSTEM vorgesehen, mit der man den Wert in allen PDBs gleich mit ändern kann. Dann wird die Einstellung auch in alle PDBs übernommen.

 

SQL> alter session set container=cdb$root;

Session altered.

SQL> alter system set undo_retention=14400 container=all scope=both;

System altered.

SQL> alter session set container=mmi1;

Session altered.

SQL> show parameter undo_retention

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_retention                       integer     14400

SQL> alter session set container=mmi2;

Session altered.

SQL> show parameter undo_retention

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_retention                       integer     14400

 

Wird die CDB aber nun neu gestartet, dann sind die Einstellungen für die PDBs trotz SCOPE=BOTH wieder verschwunden. Offenbar werden die Einstellungen für die PDBs trotz SCOPE=BOTH nicht persistiert.

 

SQL> startup force
ORACLE instance started.

Total System Global Area 8589931480 bytes
Fixed Size                  9155544 bytes
Variable Size            2986344448 bytes
Database Buffers         5570035712 bytes
Redo Buffers               24395776 bytes
Database mounted.
Database opened.
SQL> show parameter undo_retention

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_retention                       integer     14400

SQL> alter session set container=mmi1;

Session altered.

SQL> show parameter undo_retention

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_retention                       integer     900

SQL> alter session set container=mmi2;

Session altered.

SQL> show parameter undo_retention

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_retention                       integer     900

SQL> alter session set container=cdb$root;

Session altered.

SQL> select c.name, p.name, p.value$
  2  from v$pdbs c
  3  join pdb_spfile$ p
  4    on (c.con_uid = p.pdb_uid)
  5  where p.name = 'undo_retention';

no rows selected

 

Man muss daher in jede einzelne PDB wechseln um die Einstellung dort explizit vorzunehmen. Dann wird diese auch persistiert und überlebt einen Neustart der CDB.

 

SQL> alter session set container=mmi2;

Session altered.

SQL> alter system set undo_retention=28800 scope=both;

System altered.

SQL> alter session set container=cdb$root;

Session altered.

SQL> select c.name, p.name, p.value$
  2  from v$pdbs c
  3  join pdb_spfile$ p
  4    on (c.con_uid = p.pdb_uid)
  5* where p.name = 'undo_retention'
SQL> /

NAME                 NAME                 VALUE$
-------------------- -------------------- --------------------
MMI2                 undo_retention       28800


SQL> startup force
ORACLE instance started.

Total System Global Area 8589931480 bytes
Fixed Size                  9155544 bytes
Variable Size            2986344448 bytes
Database Buffers         5570035712 bytes
Redo Buffers               24395776 bytes
Database mounted.
Database opened.
SQL> show parameter undo_retention

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_retention                       integer     14400
SQL> select c.name, p.name, p.value$
  2  from v$pdbs c
  3  join pdb_spfile$ p
  4    on (c.con_uid = p.pdb_uid)
  5  where p.name = 'undo_retention';

NAME                 NAME                 VALUE$
-------------------- -------------------- --------------------
MMI2                 undo_retention       28800

SQL> alter session set container=mmi2;

Session altered.

SQL> show parameter undo_retention

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_retention                       integer     28800

 

Es ist also wichtig, diese Änderung im Verhalten im Hinterkopf zu behalten. Denn gerade die undo_retention hat schon manches umfangreiche Point in Time Recovery erspart indem man geänderte Daten per Flashback Query restaurieren konnte. Sind die Informationen einmal aus dem UNDO verschwunden, besteht diese Möglichkeit nicht mehr.

Verwandte Blogbeiträge:

Kommentare

Keine Kommentare

Kommentar schreiben

* Diese Felder sind erforderlich