Oracle 12c Multitenant: Parameter NONCDB_COMPATIBLE

7. Dezember 2017 Aus Von Markus Flechtner

Mit Oracle 12c hat Oracle im Jahr 2013 eine neue Datenbank-Architektur, die Container-Datenbank-Architektur, auch „Multitenant Architektur” genannt, eingeführt. Aus Applikations-Sicht sollen diese Datenbanken – genauer: die Pluggable Datenbanken – kompatibel zur klassischen Datenbank-Architektur, jetzt „Non-CDB-Architektur“ genannt, sein. Mit Oracle 12c Release hat Oracle den Parameter NONCDB_COMPATIBLE eingeführt. Wofür gibt es diesen Parameter wenn die neuen Pluggable Datenbanken doch ohnehin kompatibel zur klassischen Architektur sind?

Technisch ist die neue Datenbankarchitektur unter anderem eine Aufteilung des Data Dictionaries in die Definitionen der Data Dictionary-Objekte im Root-Container CDB$ROOT und den Inhalten des Data Dictionaries, wie z.B. den Definitionen der Benutzer-Tabellen, in den Pluggable Datenbanken (PDBs). Die neue Architektur ist aber auch eine Aufteilung in einen Infrastrukturbereich (Instanz, Root-Container mit Redolog- und Control-Dateien) und einen Applikationsbereich, eben die PDBs. Diese Aufteilung gibt es in der klassischen Architektur in dieser Form nicht.

Aus den PDBs heraus hat man daher auch normalerweise keinen Zugriff auf die Redolog- und Control-Dateien. Dies zeigt folgendes Beispiel:

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT


SQL> show parameter noncdb_compatible

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
noncdb_compatible boolean FALSE

SQL> alter session set container=PDB01;
Session altered.

SQL> alter database backup controlfile to trace;
alter database backup controlfile to trace
*
ERROR at line 1:
ORA-65040: operation not allowed from within a pluggable database

SQL> alter system switch logfile;
alter system switch logfile
*
ERROR at line 1:
ORA-65040: operation not allowed from within a pluggable database

In der Standard-Einstellung mit dem Wert FALSE für NONCDB_COMPATIBLE sind aus einer PDB heraus die obigen Befehle “ALTER DATABASE BACKUP CONTROLFILE ..” und „ALTER SYSTEM SWITCH LOGFILE“ sowie der Befehl „ALTER SYSTEM ARCHIVE LOG ALL;“ nicht erlaubt.
Aber wie sieht es aus, der statische Parameter NONCDB_COMPATIBLE auf TRUE gesetzt ist?

SQL> alter session set container=CDB$ROOT;

Session altered.

SQL> alter system set noncdb_compatible=true scope=spfile;

System altered.

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area 2097152000 bytes
Fixed Size 8794696 bytes
Variable Size 553651640 bytes
Database Buffers 1258291200 bytes
Redo Buffers 7979008 bytes
In-Memory Area 268435456 bytes
Database mounted.
Database opened.

SQL> show parameter noncdb_compatible

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
noncdb_compatible boolean TRUE

SQL> alter session set container=PDB01;
Session altered.

SQL> alter database backup controlfile to trace;
Database altered.

SQL> alter system switch logfile;
System altered.


Und der Blick in die alert.log-Datei zeigt, dass diese Befehle auch wirklich ausgeführt wurden:

[..]
2017-12-07T23:37:37.718858+01:00
PDB01(7):alter database backup controlfile to trace
2017-12-07T23:37:37.728371+01:00
Backup controlfile written to trace file /u00/app/oracle/diag/rdbms/tvdcdb1/TVDCDB1/trace/TVDCDB1_ora_24813.trc
PDB01(7):Completed: alter database backup controlfile to trace
2017-12-07T23:37:43.475770+01:00
Thread 1 advanced to log sequence 126 (LGWR switch)
 Current log# 3 seq# 126 mem# 0: /u01/oradata/TVDCDB1/redo03.log
2017-12-07T23:37:43.637295+01:00
Archived Log entry 97 added for T-1.S-125 ID 0xfd6e8839 LAD:1
[..]

Damit sind die PDBs also in dem Sinne kompatibel zur Non-CDBs, dass auch von einer PDB aus auf Redolog- und Control-Dateien zugegriffen werden kann, obwohl diese Dateien dem übergreifenden Root-Container CDB$ROOT zugeordnet sind und von dort aus administriert werden.

Allerdings hat die Einstellung “NONCDB_COMPATIBLE=TRUE” nicht nur diesen Effekt, den der ein oder andere vielleicht als positiv ansehen wird.
Nachteilig ist, dass die mit Oracle 12.2 eingeführte Memory-Zuweisung und -Verwaltung auf PDB-Ebene, mit der die Größe der (Teil-)SGA auf die eine PDB zugreifen kann, beschränkt wird, durch diese Einstellung ausgeschaltet wird.
Spätestens in einer größeren Multitenant-Datenbank mit vielen PDBS und entsprechender Ressourcenverwaltung führt also kein Weg an “NONCDB_COMPATIBLE=FALSE” vorbei. Und das sollte meiner Meinung nach auch die normale Einstellung für alle Arten von Container-Datenbanken sein.
Allenfalls in einer Single-Tenant-Umgebung mit nur einer PDB ist die Einstellung “TRUE” eventuell (!) überlegenswert.


Oracle-Dokumentation zum Parameter NONCDB_COMPATIBLE:

https://docs.oracle.com/database/121/REFRN/GUID-F905BCD3-AF4E-4A15-8E6A-6A2F8D7642C4.htm#REFRN10339

MOS-Note:
How to Control and Monitor the Memory Usage (Both SGA and PGA) Among the PDBs in Mutitenant Database- 12.2 New Feature (Doc ID 2170772.1)

Werbung (Amazon-Partner-Link)