Oracle Container Datenbank
Seit einiger Zeit gibt es eine Neuauflage des SQL Datenbankklassikers von Oracle. Unter der Bezeichnung Oracle 12c (C wie Cloud) und der internen Versionsnummer 12.1 stehen einige neue Funktionen bereit.
Multitenant Architectur (CDB)
Mit der 12c Release hat Oracle eine neue Multitenant Architektur eingeführt, die es erlaubt eigenständig verwaltbare Datenbanken in einer gemeinsamen Datenbankinstanz zu betreiben. Damit verbunden sind einige neue Features wie der Transport der gesamten Datenbank (nicht nur einzelner Tablespaces) von einer Instanz in eine andere. Es erlaubt ebenfalls das bereitstellen von Clones der Datenbank für Entwicklung und QA. Das Hauptargument ist jedoch die Selbstverwaltung durch beschränken der Sichtbarkeit der Datenbankobjekte auf den jeweiligen Untermieter - alles was man für die Konsolidierung von Datenbanken so braucht.
Damit zieht Oracle mit dem Microsoft SQL Server gleich, bei dem Datenbanken ja schon länger eigenständige Objekte (mit eigenen Usern) waren. Allerdings wirkt es wie gewohnt bei Oracle etwas aufgesetzter. So gibt es die normalen Systemuser die in allen PDB gelten (z.B. DBSNMP) aber für weitere User empfiehlt Oracle eine Namenskonvention "C##USERNAME" für gemeinsam benutzte (Common) User.
Meiner Erfahrung nach heißt es Vorsicht beim Umstieg auf 12c (wenn die CDB aktiviert ist). Die neue Multitenant Architektur ist zwar praktisch, DBA sind es aber nicht gewöhnt. So ist es z.B. wichtig vorhandene User+Rollen Definitionsscripte entweder im richtigen Container aufzurufen. Entweder man benutzt einen Common DB User und ändert den Session Context:
ALTER SESSION SET CONTAINER = 'PDBTEST';
Dann muss man sich aber auch regelmäßig vergewissern, welches die gerade aktive PDB ist:
SELECT SYS_CONTEXT('USERENV', 'CON_NAME') FROM DUAL;
Oder man legt entsprechende Administrationuser in jeder PDB separat an. Dazu muss man dann auch einen TNS Connect String verwenden der auf einen Datenbank Service verweist, welcher der jeweiligen PDB zugeordnet ist. Wenn eine neue PDB angelegt wurde, wird auch ein neuer Service mit PDB Name + DB_Domain registriert:
> SELECT NAME,PDB,CON_ID from GV$SERVICES; NAME PDB CON_ID ---------------------- -------------------------- ---------- pdbtest.eckenfels.net PDBTEST 4 pdborcl.eckenfels.net PDBORCL 3 orcl.eckenfels.net CDB$ROOT 1 SYS$BACKGROUND CDB$ROOT 1 SYS$USERS CDB$ROOT 1
Die Arbeit mit CDBs macht Oracle nicht gerade einfach. Wenn man eine neue Container Datenbank mit dem Datebank Konfigurationsassistent (oder CREATE Statement) anlegt, so wird diese Datenbank bei einem Instanzstart nicht automatisch geöffnet. Man muss sich also mit einem Systemtrigger behelfen. Das hätte man wirklich komfortabler lösen können (und wenn Oracle in einer nächsten Version eine Lösung dafür anbietet wird man sich mit den Triggern wieder beschäftigen müssen).
Das ist übrigens ein sehr ärgerliches Problem, der Oracle SQL Developer gibt zwar in der Console eine entsprechende Fehlermeldung aus:
> ALTER SESSION SET container = PDBORCL; session SET geändert. > CREATE ROLE "NORMAL_USER"; Fehler beim Start in Zeile 1 in Befehl: CREATE ROLE "NORMAL_USER" Fehler bei Befehlszeile:1 Spalte:1 Fehlerbericht: SQL-Fehler: ORA-01109: Datenbank nicht geöffnet 01109. 00000 - "database not open" *Cause: A command was attempted that requires the database to be open. *Action: Open the database and try the command again > ALTER PLUGGABLE DATABASE PDBORCL OPEN READ WRITE; pluggable DATABASE geändert. > CREATE ROLE "NORMAL_USER"; role "NORMAL_USER" erstellt.
Wenn man das ganze allerdings im SQL Developer macht, so wird die Meldung durch ein Fehler Pop-Up mit unverständlicher Fehlermeldung verdeckt:
Bei der Ausführung des angeforderten Vorgangs ist ein Fehler aufgetreten: ORA-06550: Zeile 3, Spalte 35: PLS-00201: Bezeichner 'DBMS_SQL.OPEN_CURSOR' muss deklariert werden ORA-06550: Zeile 3, Spalte 19: PL/SQL: Item ignored ORA-06550: Zeile 13, Spalte 26: PLS-00320: Die Typ-Deklaration dieses Ausdruckes ist unvollständig oder fehlerhaft ORA-06550: Zeile 13, Spalte 9: PL/SQL: Statement ignored ORA-06550: Zeile 16, Spalte 17: PLS-00201: Bezeichner 'DBMS_SQL.LAST_ERROR_POSITION' muss deklariert werden ORA-06550: Zeile 16, Spalte 5: PL/SQL: Statement ignored ORA-06550: Zeile 18, Spalte 34: PLS-00320: Die Typ-Deklaration dieses Ausdruckes ist unvollständig oder fehlerhaft ORA-06550: Zeile 18, Spalte 11: PL/SQL: Statement ignored 06550. 00000 - "line %s, column %s:\n%s" *Cause: Usually a PL/SQL compilation error. *Action: Herstellercode 6550
Eine gute Zusammenfassung aller CDB spezifischen Punkte findet sich im Oracle Database Administrator's Guide im Kapitel 40 Administering a CDB with SQL*Plus.
Enterprise Manager Database Express
Eine neue Funktion ist das Enterprise Manager Database Express Modul. Statt einen abgespeckten Enterprise Manager (Database Control) mit eigenem Prozess und Ablaufumgebung zu installieren kann man das in der Datenbank eingebaute Express Modul verwenden. Dieses basiert auf der AppEx Infrastruktur. Das als Performance Hub getaufte Dashboard profitiert dann auch mit den Offline abspeicherbaren HTML Reports. Ansonsten ist die Funktionalität allerdings sehr eingeschränkt. Es gibt z.B. keine DDL Funktionen zum Anlegen oder verwalten von Tabellen.
EM DB Express unterstützt die Verwendung von Plugable Databases dahingehend, dass man für jeden Tenant ein eigener http oder https Listener (Port) anlegen kann. Wenn man sich dann nicht im Root Container anmeldet, so sieht man dann erst die jeweils in der PDB angelegten User (Und leider nur dann).
> select dbms_xdb_config.gethttpsport from dual; GETHTTPSPORT ------------ 5500 > alter session set container = PDBTEST; > select dbms_xdb_config.gethttpsport from dual; GETHTTPSPORT ------------ > exec DBMS_XDB_CONFIG.SETHTTPSPORT(5502); > select dbms_xdb_config.gethttpsport from dual; GETHTTPSPORT ------------ 5502
Wenn man sich mit einer PDB verbunden hat (in meinem Beispiel https://server:5502/em/) so wird in der Titelzeile des EM Express links oben nicht nur die SID, sondern auch den Namen der PDB angezeigt. Ebenso enthält die Userliste nicht mehr (nur) die Gemeinsamen User: