Data-Dictionary- und V$-Views rund um die Multitenant-Architecture von Oracle Database 12c

21. Januar 2014 Aus Von Markus Flechtner

Die mit Oracle 12c eingeführte neue Multitenant-Architecture bringt auch einige neue Data-Dictionary- und V$-Views mit sich.

Wesentlich ist die Einführung einer neuen Ebene oberhalb der DBA_-Views, die CDB_-Views. Zu allen DBA_-Views gibt es korrespondierende CDB_-Views. Diese enthalten zusätzlich zu den Inhalten der jeweiligen DBA-View die Spalte CON_ID (= Container-ID).

Wenn man eine CDB-View vom root-Container aus selektiert, dann werden die Daten aller PDBs angezeigt:

SQL> select con_id,count(*) from cdb_users group by con_id;
CON_ID      COUNT(*)
---------- ----------
4           37
3           39
2           35
1           36

Die gleiche Abfrage auf PDB-Ebene ergibt:

SQL> select con_id,count(*) from cdb_users group by con_id;
CON_ID      COUNT(*)
---------- ----------
3           39

Sprich: die Abfrage ist auf den aktuellen Container eingeschränkt und entspricht in ihren Inhalten der jeweiligen DBA_-View.

Die Spalte CON_ID ist auch Bestandteil zahlreicher V$-Views geworden (z.B. V$SESSION, V$DATABASE oder V$PROCESS)

Darüberhinaus gibt es weitere hilfreiche Views rund um die Container-Datenbanken:

V$CONTAINERS
V$PDBS

Diese beiden Views haben die gleichen Spalten und (fast) den gleichen Inhalt. Bei V$PDBS wird allerdings der root-Container (CDB$ROOT, Container_ID=1) nicht angezeigt, denn der root-Container ist keine Pluggable-Database.

SQL> desc v$containers
Name Null? Type
------------------------------ –----- –---
CON_ID NUMBER
DBID NUMBER
CON_UID NUMBER
GUID RAW(16)
NAME VARCHAR2(30)
OPEN_MODE VARCHAR2(10)
RESTRICTED VARCHAR2(3)
OPEN_TIME TIMESTAMP(3)
CREATE_SCN NUMBER
TOTAL_SIZE NUMBER

SQL> select con_id,name,open_mode,total_size from v$containers;

CON_ID NAME OPEN_MODE TOTAL_SIZE
------- ------------------ ---------- ----------
1 CDB$ROOT READ WRITE 1420820480
2 PDB$SEED READ ONLY 393216000
3 CRM01 READ WRITE 419430400
4 CRM02 READ WRITE 419430400

SQL> select con_id,name,open_mode,total_size from v$pdbs;

CON_ID NAME OPEN_MODE TOTAL_SIZE
------- ------------------ ---------- ----------
2 PDB$SEED READ ONLY 393216000
3 CRM01 READ WRITE 419430400
4 CRM02 READ WRITE 419430400

DBA_PDBS
Die Data-Dictionary-View DBA_PDBS sieht diesen beiden V$-Views sehr ähnlich:

SQL> desc dba_pdbs
Name Null? Type
------------------------------- -------- ------------------------
PDB_ID NOT NULL NUMBER
PDB_NAME NOT NULL VARCHAR2(128)
DBID NOT NULL NUMBER
CON_UID NOT NULL NUMBER
GUID RAW(16)
STATUS VARCHAR2(13)
CREATION_SCN NUMBER

Nur die Spalte „STATUS“ (mögliche Werte lt. Oracle 12c-Reference: NEW, NORMAL, UNPLUGGED, NEEDS UPGRADE, CONVERTING und UNUSABLE) ist in den V$-Views nicht vorhanden.

PDB_SPFILE$
Einige Parameter (z.B. OPEN_CURSORS, OPTIMIZER_FEATURES_ENABLE u.v.m.) können auf PDB-Ebene anders gesetzt werden, als für die CDB im spfile definiert. Derart angepasste Parameter werden in PDB_SPFILE$ abgelegt:

SQL> show con_id

CON_ID
------------------------------
1
SQL> show parameter open_cursors

NAME TYPE VALUE
--------------------------------------------------------------
open_cursors integer 300
SQL> alter session set container=crm01;

Session altered.

SQL> alter system set open_cursors=500 scope=spfile;

System altered.

SQL> alter session set container=CDB$ROOT;

Session altered.

SQL> select v.name PDB,p.name PARAMETER,p.value$ VALUE
2 from v$pdbs v,pdb_spfile$ p
3 where v.con_uid=p.pdb_uid;

PDB PARAMETER VALUE
------- ------------------ ----------
CRM01 open_cursors 500

View PDB_PLUG_IN_VIOLATIONS
Gibt es Probleme, beim Einhängen (PLUG) einer PDB in eine CDB, so hilft diese View weiter. Sie enthält die inkompatiblen Einstellungen zwischen der CDB und der PDB, wie z.B. unterschiedliche DB-Blockgröße oder ein unterschiedlicher Datenbank-Zeichensatz.

V$PDB_INCARNATION
Analog zu den „klassischen Datenbanken“ muss eine PDB nach einem Point-In-Time-Recovery (PITR) mit „RESETLOGS“ geöffnet werden. Natürlich werden dabei nicht die Online-Redologs neu initialisiert, denn sie der Ebene der PDBs nicht vorhanden.
V$PDB_INCARNATION enthält alle Informationen zur den Resetlogs-Operationen auf PDB-Ebene (Timestamp, SCN etc.)

CDB_PDB_HISTORY bzw. DBA_PDB_HISTORY
Diese View enthält Informationen über die mit einer PDB durchgeführten Operationen (z.B. CREATE, PLUG, UNPLUG). Als DBA-View auf PDB-Ebene enthält sie die gleichen Informationen, natürlich eingeschränkt auf die jeweilige PDB.

SQL> select pdb_name,op_timestamp,operation from cdb_pdb_history;

PDB_NAME OP_TIMEST OPERATION
-------- --------- ----------------
CRM01 29-DEC-13 CREATE
CRM02 29-DEC-13 CREATE
CRM02 20-JAN-14 UNPLUG
CRM02 20-JAN-14 PLUG

DBA_CONTAINER_DATA
Diese View enthält Informationen zu „Container Data Objects“. Das sind Objekte, die zentral definiert sind und in einem oder mehreren Container sichtbar sein können (z.B. V$- oder DBA-Views).

Ein CDB-Administrator kann die Rechte von Common Users auf diese Container Objects einschränken, so dass Informationen zu einzelnen PDBs nicht sichtbar sind:

SQL> ALTER USER C##CDB_ADMIN SET CONTAINER_DATA=(CDB$ROOT,CRM01) FOR V_$WAITSTAT CONTAINER=CURRENT;

SQL> select * from cdb_container_data where username='C##CDB_ADMIN';

USERNAME D OWNER OBJECT_NAME A CONTAINER_ CON_ID
-------------- - ----- ----------- - ---------- ------
C##CDB_ADMIN N SYS V_$WAITSTAT N CDB$ROOT 1
C##CDB_ADMIN N SYS V_$WAITSTAT N CRM01 1

Dabei muss der root-Container immer angegeben werden. Die Einschränkung kann mittels der Variante „CONTAINER_DATA=ALL“ für den „ALTER USER“-Befehl wieder aufgehoben werden.

Weitere Informationen, wie man Informationen zu CDB und PDBs in SQL abfragt, gibt es im Kapitel 43 („Viewing Information About CDBs and PDBs with SQL*Plus“) des Oracle 12c Administrators Guide.