Unterschiedliche Benutzer, unterschiedliche Versionen, unterschiedliche Ergebnisse

23. Juni 2025 0 Von Markus Flechtner

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 🙂 .