Pluggable Datenbanken – bei Oracle gibt es 10% extra – kostenlos!

28. Juli 2019 Aus Von Markus Flechtner

OK, das ist vielleicht ein etwas reißerischer Titel für einen Blog-Beitrag. Aber andererseits war mein Erstaunen über das Verhalten der Oracle Datenbank, wenn es um die Größenbeschränkungen von Pluggable Datenbanken geht, auch recht groß.

Aber zurück zum Start: Pluggable Datenbanken (PDBs) in ihrer Größe zu beschränken ist sicher eine sinnvolle Sache. Bei „Database as a Service“ sollen die Kunden nur soviel Platz belegen können, wie sie vorher angefordert haben. Und später bekommen Sie die Rechnung dafür. Und schon seit der Version 12.1 der Oracle-Datenbank kann man Größenbeschränkungen für PDBs mit angeben:

 CREATE PLUGGABLE DATABASE … STORAGE (MAXSIZE 2 GB … )

Und dann kam da die Frage eines Kursteilnehmers, was denn alles zu dieser maximalen Größe zähle – auch TEMP-Tablespace, SYSTEM-Tablespace oder SYSAUX-Tablespace?

Meine Testumgebung um diese Frage zu beantworten ist eine Oracle 19c-Datenbank (aber ich konnte das Verhalten auch mit Oracle 18c reproduzieren):

oracle@training19c:~/ [rdbms19000] $ORACLE_HOME/OPatch/opatch lspatches
29585399;OCW RELEASE UPDATE 19.3.0.0.0 (29585399)
29517242;Database Release Update : 19.3.0.0.190416 (29517242)

OPatch succeeded.

Legen wir dort in einer CDB einmal eine PDB an:

SQL> CREATE PLUGGABLE DATABASE PDBTEST
  2  ADMIN USER pdbadmin IDENTIFIED BY manager ROLES=(DBA)
  3  FILE_NAME_CONVERT = ('pdbseed','PDBTEST')
  4  ;
Pluggable database created.

Für diese PDB gibt es aktuell noch keinerlei Größenbeschränkung:

SQL> column name format a10
SQL> select name,trunc(TOTAL_SIZE/1024/1024) total_mb,
  2  trunc(MAX_SIZE/1024/1024) max_mb
  3  from v$pdbs where name='PDBTEST';

NAME	     TOTAL_MB	  MAX_MB
---------- ---------- ----------
PDBTEST 	 1590	       0

Daher hat die Spalte „MAX_SIZE“ in V$PDBs auch den Wert 0.

Wie errechnet sich nun die aktuelle Größe, in diesem Fall 1590 MB (gerundet)?

SQL> alter pluggable database PDBTEST open;
Pluggable database altered.

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

SQL> column FILE_NAME format a44
SQL> column ts_name format a10
SQL> select tablespace_name TS_NAME,FILE_NAME,trunc(bytes/1024/1024) size_mb from dba_data_files
  2  union
  3  select tablespace_name,FILE_NAME,trunc(bytes/1024/1024) size_mb from dba_temp_files;

TS_NAME    FILE_NAME					   SIZE_MB
---------- -------------------------------------------- ----------
SYSAUX	   /u01/oradata/TVDCDB1/PDBTEST/sysaux01.dbf	       500
SYSTEM	   /u01/oradata/TVDCDB1/PDBTEST/system01.dbf	       320
TEMP	   /u01/oradata/TVDCDB1/PDBTEST/temp01.dbf		60
UNDOTBS1   /u01/oradata/TVDCDB1/PDBTEST/undotbs01.dbf	       710

Insgesamt sind das 1590 MB. Damit ist erstmal klar: die Gesamtgröße in V$PDBS ergibt sich als Summe über alle Datafiles und Tempfiles.

Beschränken wir jetzt einmal die maximale Größe der PDB auf 2000 MB:

SQL> alter pluggable database PDBTEST storage (maxsize 2000M);
Pluggable database altered.

Diesen Wert sehen wir dann auch in der V$PDBS;

SQL> select name,trunc(TOTAL_SIZE/1024/1024) total_mb,
  2   trunc(MAX_SIZE/1024/1024) max_mb
  3  from v$pdbs where name='PDBTEST';

NAME	     TOTAL_MB	  MAX_MB
---------- ---------- ----------
PDBTEST 	 1590	    2000

Sobald es für eine PDB eine Größenbeschränkung gibt, gibt es auch einen entsprechenden Eintrag in der DATABASE_PROPERTIES der PDB:

SQL> column property_value format a20
SQL> select property_value from database_properties
  2  where property_name='MAX_PDB_STORAGE';

PROPERTY_VALUE
--------------------
2097152000

Die Beschreibung dazu ist „Maximum Space Usage of Datafiles and Local Tempfiles in Container“ und das entspricht ja der obigen Beobachtung.

Vergrößern wir jetzt einmal die PDB bis ans Limit:

SQL> alter database datafile '/u01/oradata/TVDCDB1/PDBTEST/system01.dbf' resize 730M;
Database altered.

SQL> select name,trunc(TOTAL_SIZE/1024/1024) total_mb,
  2   trunc(MAX_SIZE/1024/1024) max_mb
  3  from v$pdbs where name='PDBTEST';

NAME	     TOTAL_MB	  MAX_MB
---------- ---------- ----------
PDBTEST 	 2000	    2000

Die maximale Größe wäre somit erreicht, oder?

Versuchen wir einmal, die PDB über das Limit hinaus zu vergrößern:

SQL> alter database datafile '/u01/oradata/TVDCDB1/PDBTEST/system01.dbf' resize 930M;
Database altered.

SQL> select name,trunc(TOTAL_SIZE/1024/1024) total_mb,
  2   trunc(MAX_SIZE/1024/1024) max_mb
  3  from v$pdbs where name='PDBTEST';

NAME	     TOTAL_MB	  MAX_MB
---------- ---------- ----------
PDBTEST 	 2200	    2000

Wenn wir die PDB noch weiter vergrößern wollen, dann kommt eine Fehlermeldung:

alter database datafile '/u01/oradata/TVDCDB1/PDBTEST/system01.dbf' resize 931M
*
ERROR at line 1:
ORA-65114: space usage in container is too high

OK, wir dürfen das Limit also um 200 MB überschreiten. Was passiert aber, wenn wir die maximale Größe der PDB erhöhen?

SQL> alter pluggable database PDBTEST storage (maxsize 3000M);
Pluggable database altered.

SQL> select name,trunc(TOTAL_SIZE/1024/1024) total_mb,
  2   trunc(MAX_SIZE/1024/1024) max_mb
  3  from v$pdbs where name='PDBTEST';

NAME	     TOTAL_MB	  MAX_MB
---------- ---------- ----------
PDBTEST 	 2200	    3000

SQL> alter database datafile '/u01/oradata/TVDCDB1/PDBTEST/system01.dbf' resize 2030M;
Database altered.

SQL> select name,trunc(TOTAL_SIZE/1024/1024) total_mb,
  2   trunc(MAX_SIZE/1024/1024) max_mb
  3  from v$pdbs where name='PDBTEST';

NAME	     TOTAL_MB	  MAX_MB
---------- ---------- ----------
PDBTEST 	 3300	    3000

SQL> alter database datafile '/u01/oradata/TVDCDB1/PDBTEST/system01.dbf' resize 2031M;
alter database datafile '/u01/oradata/TVDCDB1/PDBTEST/system01.dbf' resize 2031M
*
ERROR at line 1:
ORA-65114: space usage in container is too high

==> Auch hier gilt: wir bekommen 10% gratis, aber kein Byte mehr

Fazit: Durch dieses Vorgehen, zu dem ich in der Oracle-Dokumentation nichts gefunden habe, wird in gewisser Weise der Overhead durch die systemnahen Tablespaces (SYSTEM, SYSAUX, UNDO und TEMP) kompensiert. Ab einer gewissen PDB-Größe wird dieser Overhead wohl tendenziell sogar über-kompensiert. Allerdings muss dieses Verhalten bei der Bereitstellung des Plattenplatzes berücksichtigt werden – der verfügbare Plattenplatz sollte immer (mindestens) 10% mehr als die maximale Größe aller PDBs.