Unterschiedliche Benutzer, unterschiedliche Versionen, unterschiedliche Ergebnisse
Bei der Aktualisierung meines Beitrages zum SYSAUX-Tablespace habe ich ein SQL-Skript ergänzt, mit dem man in einer Container-Datenbank die Belegung des SYSAUX-Tablespaces in allen PDBs anzeigen lassen kann. Getestet als SYS mit einer 23ai-FREE-Datenbank, funktioniert, fertig, … – oder?
Worum geht es?
Die View V$SYSAUX_OCCUPANTS enthält Informationen über die Belegung des SYSAUX-Tablespaces. Leider zeigt sie nur die Informationen aus dem aktuellen Container:
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB19C READ WRITE NO
5 TESTPDB READ WRITE NO
SQL> select distinct con_id from v$sysaux_occupants;
CON_ID
----------
1
Das ist im ersten Moment ärgerlich, denn es gibt auch genug V$-Views, die Informationen zu allen Containern enthalten, aber es gibt ja eine Lösung für dieses Problem, die CONTAINERS-Klausel. Kurz gesagt: wenn CDB$ROOT und alle PDBs eine Tabelle „A“ enthalten, die überall die gleiche Struktur hat, dann kann man sich mit
select con_id,<spaltenliste> from containers(A);
alle Daten der Tabelle A aus allen Containern anzeigen lassen.
Wenn also eine Abfrage auf V$SYSAUX_OCCUPANTS mit dieser Container-Klausel versieht, dann bekommt man Daten aus allen Containern:
Bei einer 23ai-FREE-Edition sieht das Ergebnis dann so aus:
markus@kereru ~ % sqlplus sys@127.0.0.1:1521/FREE as sysdba
SQL*Plus: Release 23.0.0.0.0 - Production on Mon Jun 23 18:57:41 2025
Version 23.3.0.23.09
Copyright (c) 1982, 2023, Oracle. All rights reserved.
Enter password:
Connected to:
Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.5.0.24.07
SQL> set linesize 140
SQL> set pagesize 100
SQL> ALTER SESSION SET "_exclude_seed_cdb_view" = false;
Session altered.
SQL> column occupant_name format a25
SQL> column occupant_desc format a53
SQL> column con_name format a10
SQL> SELECT
c.con_id,
c.name con_name,
o.occupant_name,
o.occupant_desc,
o.space_usage_kbytes used_kb
FROM
CONTAINERS ( v$sysaux_occupants ) o,
v$containers c
WHERE
c.con_id = o.con_id
AND o.space_usage_kbytes > 0
ORDER BY
c.con_id,
o.space_usage_kbytes DESC;
CON_ID CON_NAME OCCUPANT_NAME OCCUPANT_DESC USED_KB
---------- ---------- ------------------------- ----------------------------------------------------- ----------
1 CDB$ROOT SM/OPTSTAT Server Manageability - Optimizer Statistics History 1499776
[...]
2 PDB$SEED XDB XDB 88640
[...]
3 PLAYPDB SM/OPTSTAT Server Manageability - Optimizer Statistics History 855488
3 PLAYPDB SM/AWR Server Manageability - [...]
4 HECTORPDB SM/OPTSTAT Server Manageability - Optimizer Statistics History 47808
[...]
5 RMANCAT SM/OPTSTAT Server Manageability - Optimizer Statistics History 246976
[...]
89 rows selected.
Wie erwartet zeigt die Abfrage Daten aus allen PDBs.
Bei Oracle 21c zeigt die gleiche Abfrage als SYS nur Daten aus dem Container CDB$ROOT (CON_ID=1), ebenso bei Oracle 19c. Bug, Feature oder Änderung in 23ai?
Mein erster Gedanke: Oracle hat da etwas bei der Einstellung für CONTAINER_DATA geändert. Mit dem Parameter „CONTAINER_DATA“ kann man konfigurieren, welcher Benutzer welche Daten aus welchen Containern sehen kann. Aber da waren alle Versionen gleich und man kann die CONTAINER_DATA-Einstellungen für SYS auch nicht ändern („ORA-65041: CONTAINER_DATA attribute for this user cannot be modified“).
Also gut, wenn man da an dem SYS-User nichts ändern kann, dann probieren wir es mal mit einem anderen Benutzer, nämlich als SYSTEM. Und siehe da: in allen Versionen werden die Daten aus allen PDBs angezeigt.
Das zeigt wieder einmal, dass man den Benutzer SYS nicht für Alltagsarbeiten verwenden sollte. Und warum sich 23ai, 21c und 19c unterschiedlich verhalten, sagt mir vielleicht der Oracle Support, wenn ich einen SR dazu eröffne. Ich werde berichten 🙂 .