Logo Oracle Deutschland   DBA Community  -  Dezember 2013
Verlorene Datendateien in einer Pluggable Database Umgebung
von Sebastian Solbach ORACLE Deutschland B.V. & Co.KG

Mit der neuen Multitenant Datenbankarchitektur mit Container Datenbank (CDB) und den dazugehörigen Pluggable Datenbanken (PDB) kommen auf CDB Ebene einige neue Funktionalitäten hinzu. Zwar ändert sich für den Administrator einer einzelnen PDB kaum etwas, aber einige Spezialitäten sollte der Datenbank Administrator auf Ebene der PDB bzw. CDB doch kennen.

Eine dieser Auswirkungen ist der Umgang mit Datendateien. Denn entgegen der Annahme, dass der CDB Administrator auf alle Datendateien Zugriff hat, ist dem nicht so - zumindest nicht direkt. Wie man trotzdem einfach damit umgehen kann wird im folgenden kurz beschrieben.

Auswirkung "verlorener" Datendateien

Im Normalfall werden Datendateien der einzelnen PDBs nur dann benötigt, wenn versucht wird die einzelnen PDBs zu öffnen. Fehlen die Datendateien einer PDB, können diese auch bei laufender CDB aus einem Backup wiederhergestellt werden. Alternativ kann aber auch entschieden werden, diese zur Laufzeit mit dem Befehl "DROP PLUGGABLE DATABASE" einfach zu löschen.

Es gibt aber ein Szenario, welches gesondert betrachtet werden sollte:

  • Die PDB war geöffnet
  • Datendateien der PDB gehen verloren
  • Es liegt kein Backup der Datendateien vor oder die CDB läuft im NOARCHIVELOG Modus
  • Die CDB fällt aus oder wird mit "SHUTDOWN ABORT" heruntergefahren.
In diesem Fall kann die CDB nicht sofort wieder gestartet werden, da ein Mediarecovery für die Datendateien der betroffenen PDB erwartet wird. Wenn ein Recovery der PDB aber nicht möglich ist, zum Beispiel bei Fehlen eines Backups, stellt sich die Frage, wie die CDB mit den restlichen, intakten PDBs geöffnet werden kann.

So geschehen bei unserer Testdatenbank, in der wir mit vielen PDBs experimentierten: Die Datendateien einer PDB (pdb02), die zum Löschen anstand, wurden einfach und schnell mit Hilfe des Betriebssystems gelöscht. (rm -rf des kompletten Verzeichnisses). Das Löschen der PDB mit "DROP PLUGGABLE DATABASE" wurde aber versäumt und geriet in Vergessenheit.

Später kam es in unserer Umgebung nach einigen Logfile-Switches zu einem Datenbank Crash:
SQL> alter system switch logfile
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 29144
Session ID: 237 Serial number: 5

Alert.log:

ORA-01243: system tablespace file suffered media failure
ORA-01116: error in opening database file 36
ORA-01110: data file 36: '/opt/oracle/oradata/orcl/pdb02/system01.dbf'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
USER (ospid: 29078): terminating the instance due to error 1243
Ob Instance Crash oder "SHUTDOWN ABORT": der Versuch, die CDB wieder zu starten, wird mit folgender Fehlermeldung verhindert:
SQL> startup
ORACLE instance started.

Total System Global Area 1068937216 bytes
Fixed Size                  2296576 bytes
Variable Size             666895616 bytes
Database Buffers          394264576 bytes
Redo Buffers                5480448 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 36 - see DBWR trace file
ORA-01110: data file 36: '/opt/oracle/oradata/orcl/pdb02/system01.dbf'
In diesen Momenten lernt man den Vorteil eines guten Backup und Recovery schätzen, da das vorliegende Szenario nun mit einem RMAN Restore schnell behoben wäre. Allerdings braucht auch dies Zeit und wenn die betroffene PDB zum Löschen anstand, ist es nicht gerade effizient, diese erst einmal aus dem Backup wiederherzustellen, um sie dann korrekt zu löschen.

In Testumgebungen wird gelegentlich auf Backup & Recovery und auf die Verwendung des ARCHIVELOG Modus verzichtet. Stellt sich also die Frage nach einer Alternativlösung.

Normales Vorgehen in einer nonCDB für nicht vorhandene Datendateien

Das Grundproblem ist auch in der bisherigen Oracle Datenbank Architektur bekannt. Verlorene Datendateien können bei der Verwendung des NOARCHIVELOG Modus im MOUNT-Stadium der Instanz auf "OFFLINE FOR DROP" gesetzt werden. Im Falle der Verwendung von ARCHIVELOG reicht ein Setzen auf "OFFLINE". Die Datenbank lässt sich danach öffnen, wobei nicht versucht wird die verlorenen Datendateien zu öffnen. Bei geöffneter Datenbank können die Datendateien dann auch innerhalb der Datenbank entfernt werden.

SQL> alter database datafile 36 offline for drop;
alter database datafile 36 offline for drop
*
ERROR at line 1:
ORA-01516: nonexistent log file, data file, or temporary file "36"
Wie man an der Fehlermeldung sieht, funktioniert dies so aber nicht in der Multitenant Umgebung, da das Rechtekonzept vorsieht, dass die Datendateien einer PDB der Administration der PDB unterliegen und nicht der CDB.

Offline nehmen von Datendateien in PDBs

In der Multitenant Architektur ist zu beachten, dass die Verbindung als SYSDBA zum Starten der Instanz der CDB gilt und nicht der PDB. Demnach kann aus dieser Verbindung heraus auch keine Datendatei einer PDB auf "OFFLINE FOR DROP" gesetzt werden. Erschwerend kommt in diesem Augenblick hinzu, dass ein PDB Administrator noch keinen Zugriff auf die PDB hat, solange die CDB sich nur im MOUNT-Stadium befindet, da der Service der PDB noch nicht gestartet wurde. Wie kann man diesen Teufelskreis nun durchbrechen?

Eigentlich ist die Lösung des Problems recht einfach, dennoch denkt man nicht direkt daran: Der SYSDBA hat die Möglichkeit in jeden Container mit Hilfe von "ALTER SESSION SET CONTAINER" zu wechseln, auch wenn die Datenbank sich noch im Mount Status befindet, bzw. die PDBs noch gar nicht geöffnet sind.

SQL> startup mount
...
SQL> alter session set container = pdb02;
Session altered.
SQL> alter database datafile 36 offline for drop;
Database altered.
Bevor nun wieder in den Root Container gewechselt wird um die CDB zu öffnen, sollten auch die anderen gelöschten Datendateien auf "OFFLINE FOR DROP" gesetzt werden. Damit man nicht iterativ zwischen den Containern CDB$ROOT und dem PDB Container hin und her springen muss, ermittelt man die zu kennzeichnenden Datendateien über folgendes SQL:
SQL> select p.name, v.file#, v.name from v$datafile v, v$pdbs p
where v.con_id=p.con_id
and p.name = 'PDB02'

NAME     FILE#      NAME
-------- ---------- --------------------------------------------
PDB02    36         /opt/oracle/oradata/orcl/pdb02/system01.dbf
PDB02    37         /opt/oracle/oradata/orcl/pdb02/sysaux01.dbf
Nachdem alle entsprechenden Datendateien "OFFLINE FOR DROP" markiert sind, kann in die CDB zurück gewechselt werden und die Datenbank mit allen restlichen PDBs gestartet werden:
SQL> alter session set container = cdb$root;

Session altered.

SQL> alter database open;

Database altered.
Als Letztes sollte man dann noch daran denken die PDB richtig zu löschen, denn die Datendateien fehlen ja immer noch:
SQL> drop pluggable database pdb02;

Pluggable database dropped.

RMAN Besonderheiten

Sollte, wie es sich eigentlich für jede halbwegs produktive Datenbank gehört, der ARCHIVELOG Modus aktiviert sein und ein Backup verwendet werden, kann man im RMAN eine Besonderheit erkennen. Dieser kann nämlich die PDB eigentlich auch bei einer geöffneten CDB wiederherstellen (es sei denn man hat einen "SHUTDOWN ABORT" durchgeführt und kann die Datenbank im Moment nicht öffnen). RMAN besitzt in 12c nämlich die "ALTER SESSION SET CONTAINER" Funktionalität implizit, indem beim Befehl "SQL" die PDB mitgegeben wird, wie hier am Recovery Script erkennbar. Dieses wurde im Übrigen über die beiden Befehle "LIST FAILURE" und "ADVISE FAILURE" erstellt:

# restore and recover datafile
sql 'PDB02' 'alter database datafile 36, 37 offline';
restore ( datafile 36, 37 );
recover datafile 36, 37;
sql 'PDB02' 'alter database datafile 36, 37 online';
D.h. der Befehl in RMAN für eine Datenbank im NOARCHIVE Modus hätte auch so aussehen können:
RMAN> sql 'PDB02' 'alter database datafile 36, 37 offline for drop';

Fazit

Auch hier zeigt sich, dass die neue Multitenant Architektur zumindest für den DBA doch einige Neuerungen mitbringt. Umso wichtiger sich frühzeitig mit der künftigen Technologie auseinander zu setzen. Ebenfalls wird deutlich, dass im Umfeld von CDBs, die eindeutig Vorteile bei der Konsolidierung bieten, genau hierfür ein entsprechendes Backup und Recovery Konzept vorhanden sein muss. Definitiv gilt: eine konsolidierte Umgebung ohne RMAN Backup zu betreiben ist fast schon grob fahrlässig.

Nützliche Links und Referenzen

  • RMAN Pluggable Database Backup and Recovery (Doc ID 1521005.1)
  • Zurück zur Community-Seite