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.
Kommentare
Keine Kommentare