Logo Oracle Deutschland   DBA Community  -  April 2016
Data Guard und Multitenant
von Sebastian Solbach ORACLE Deutschland B.V. & Co.KG

Oracle Multitenant hat den Charme mehrere einzelne Pluggable Datenbanken mit einem einzigen Data Guard abzusichern, da Data Guard auf Container Datenbank Ebene funktioniert. Das erspart viel Verwaltungsaufwand und es muss nicht mehr wie früher für mehrere Datenbanken verschiedene Data Guard Umgebungen aufgebaut, überwacht und administriert werden. Weitere Vorteile und Grundlagen von Multitenant finden Sie auch in unserem Dojo #7: Oracle 12c Multitenant.

Dieser Vorteil, nur einige, wenige Data Guard Umgebungen pflegen zu müssen, birgt aber auch einige administrative Stolpersteine, derer man sich bewusst sein sollte. So sind mit der Version 12.1 noch einige Einschränkungen vorhanden: Das Flashback, gerne im Zusammenhang mit Data Guard Umgebungen gesehen, ist nicht für eine einzelne Pluggable Datenbank möglich, ebenso wenig das Umschalten einer einzelnen Pluggable Datenbank auf die Standby Seite. Auch dies funktioniert technisch, wie Data Guard selber, nur auf Container Datenbank Ebene.

Ein weiterer Knackpunkt ist das Verhalten beim Anlegen, Einstecken oder Duplizieren von PDBs. Erschwerend kommt hinzu, dass neben der unterschiedlichen Handhabung je nach PDB Erzeugung auch noch eine Unterscheidung gemacht wird, zwischen Standard Data Guard und Active Data Guard Umgebungen.

Multitenant Generic Unique Identifier

Die meisten Datenbanken werden heutzutage direkt auf ASM Basis betrieben. Damit einher geht, dass die sogenannten Oracle Managed Files eingesetzt werden, so dass die Datenbank sich selber um die Benennung und den Speicherort der einzelnen Datendateien kümmert. Aber auch auf generischen Dateisystemen oder dem ASM Cluster Filesystem, welches sich insbesondere für das schnelle Klonen von PDB Datenbanken auszeichnet, kommt das OMF Feature vermehrt zum Einsatz. Das Feature ACFS zum Klonen von PDBs einzusetzen, wurde in Community Tipp "Datenbank-Cloning - ACFS & 12c Multitenant" näher beleuchtet.

Im Umfeld von Multitenant wird jede einzelne PDB durch eine eindeutige ID gekennzeichnet, dem Generic Unique Identifier - kurz GUID. Diese GUID findet sich neben den Einträgen in V$CONTAINERS auch in der Verzeichnisstruktur und im ASM bei der Verwendung von OMF wieder.

SQL> select CON_ID, DBID, GUID, NAME from v$containers

    CON_ID       DBID GUID                             NAME
---------- ---------- -------------------------------- ------------------------------
         1 1427472112 169C2AD8F3D44879E05370F4A50AB460 CDB$ROOT
         2 3723424392 169C2AD8F3D34879E05370F4A50AB460 PDB$SEED
         3 2753064680 16A0C7F3EA950D21E05370F4A50A9346 SPDB
Sowohl in ASM, wie auch im Dateisystem taucht diese GUID dann in der Verzeichnisstruktur auf:
<DB_CREATE_FILE_DEST>/<DB_UNIQUE_NAME>/<GUID>/DATAFILE/<files>
Bei Befehlen um PDBs zu erzeugen, einzuhängen oder zu duplizieren erfordert Data Guard im Normalfall, dass die Dateien auf dem/den Standby Systemen ebenfalls vorhanden sind. Aber genau darin liegt nun das Problem bei Verwendung von OMF. Die GUID wird erst beim Anlegen der PDB erzeugt und damit ist der entsprechende, notwendige Dateisystempfad bzw. ASM Verzeichnisinformation nicht vorhanden, um die Dateien mit der entsprechenden GUID zur Verfügung zu stellen.

Je nachdem wie neue PDBs erzeugt werden, gibt es bei der Bereitstellung der Dateien für die Standby Datenbank Unterschiede. Diese werden im einzelnen näher beleuchtet:
  • Anlegen einer neuen PDB vom SEED
  • Duplizieren einer existierenden PDB in der gleichen CDB
  • Plugin einer PDB
  • Klonen einer PDB über Manifest oder von einer anderen CDB
Was geschieht nun, wenn die Datenbank die vorgesehenen Datendateien nicht vorfindet?

Bei 12.1.0.1 führte dies dazu, dass der Recovery Prozess auf der Standby Seite abgebrochen wird und erst dann weiterläuft, sobald die Dateien in der richtigen Version an die richtige Stelle kopiert worden sind. Das Problem damit ist, dass der "Plugin" auf der Primärseite meist schon erfolgreich ist, womit die Datendateien, wie diese zum Zeitpunkt des "Plugins" waren gar nicht mehr verfügbar sind. Eine ärgerliche Situation, die sich im schlimmsten Fall nur über eine Neuerzeugung der Standby Datenbank beheben lässt.

Aus diesem Grund wurde in 12.1.0.2 die Möglichkeit eingeführt, das Recovery der entsprechenden PDB Dateien auf der Standby Seite nicht durchzuführen oder zu einem späteren Zeitpunkt aufzunehmen. Dies kann auf Primärseite indiziert werden, indem man dem "Create PDB" Befehl die STANDBYS=NONE Klausel mitgibt.
SQL> create pluggable database doag from spdb STANDBYS=NONE;

Pluggable database created.
Alternativ kann nach dem Abbruch der Redo Anwendung auf der Standby, das Recovery einer PDB auch ausgeschaltet werden, um darauffolgend das Redo Apply wieder anlaufen zu lassen, ohne die Dateien kopieren zu müssen:
SQL> alter pluggable database disable recovery;

Pluggable database altered.
Näheres zur Verwendung von STANDBY=NONE und PDB Recovery findet sich unter MOS Note 1916648.1: Making Use Deferred PDB Recovery and the STANDBYS=NONE Feature with Oracle Multitenant.

PDB Erzeugung

Welche Unterschiede beim Anlegen einer PDB gibt es nun, wenn eine Data Guard Umgebung vorliegt, und was ist die empfohlene Vorgehensweise?

Anlegen einer neuen PDB vom SEED

Wird eine neue leere PDB von PDB$SEED erzeugt, so sind keine weiteren Maßnahmen notwendig. Sowohl bei Standard Data Guard, wie auch Active Data Guard, wurde der Redo Apply Mechanismus verbessert, den Kopiervorgang der PDB$SEED Dateien auf der/den Standby Seiten zu übernehmen. Deshalb muss man für diesen Fall keine besonderen Maßnahmen treffen.

Duplizieren einer existierenden PDB in der gleichen CDB

Bei dieser Variante muss man zwischen Standard Data Guard und Active Data Guard unterscheiden.

Bei einer Standby Datenbank, die Read Only geöffnet ist, während die Redo Änderungen angewandt werden (Active Data Guard), gibt es keine Besonderheiten. Die Standby Seite erzeugt bei Active Data Guard die Dateien automatisch. Sollte die Datenbank jedoch während des Redo Apply nicht Read Only geöffnet sein, wie es zum Beispiel bei Standard Data Guard der Fall ist, so bricht das Recovery ab, da die Dateien nicht kopiert bzw. erzeugt werden.

In diesem Falle empfiehlt es sich die PDB mit STANDBYS=NONE zu erzeugen und das Recovery der PDB später in Angriff zu nehmen. Genauere Informationen zur STANDBYS=NONE Funktion sind in
MOS Note 1916648.1: Making Use Deferred PDB Recovery and the STANDBYS=NONE Feature with Oracle Multitenant zu finden.

Einen Sonderfall nimmt noch die Erzeugung der PDB über einen Snapshot Copy ein, wie im Tipp "Datenbank-Cloning - ACFS & 12c Multitenant" beschrieben. Hier wird Active Data Guard wärmstens empfohlen da man dann auf beiden Seiten von Snapshots profitieren kann. Manuelles Erzeugen des Snapshots mit den richtigen GUID Informationen ist ein erheblicher Aufwand. Andererseits würde bei der Verwendung von STANDBYS=NONE beim nachträglichen Kopieren über RMAN die Snapshot Informationen verloren gehen und komplette Dateikopien erzeugt.

Plugin einer PDB

Wird eine PDB aus einer CDB ausgehängt um in eine andere CDB verschoben zu werden, so ist dies ein Sonderfall. In diesem besonderen Fall wird nämlich keine neue GUID erzeugt. Damit sind die entsprechenden Pfade bekannt, auch wenn diese vielleicht auf der Standby Seite über die Datenbank Parameter DB_FILE_CREATE_DEST und DB_FILE_NAME_CONVERT verändert wurden. Konkret bedeutet dies, dass vor einem Plugin Befehl, die benötigten Datendateien an den entsprechenden Ort kopiert werden können. Der Redo Apply Mechanismus wird beim Plugin Befehl dann versuchen, die entsprechenden Dateien zu finden.

Die Empfehlung von Oracle besagt, dass in diesem Fall, ähnlich wie in Note 1576755.1 Step by Step Examples of Migrating non-CDBs and PDBs Using ASM for File Storage (Doc ID 1576755.1) beschrieben, vorgegangen werden sollte. Ich persönlich ziehe aber das Vorgehen mit STANDBYS=NONE vor, da dieser Prozess dann für alle Fälle der gleiche ist.

Klonen einer PDB einer anderen CDB

Im Gegensatz zum Plugin erzeugt das Klonen einer PDB aus einer anderen PDB eine neue GUID. Dabei ist es egal, ob der Klon via. Plugin und Manifest Datei oder über den Remote Klon via. Datenbank Link geschehen ist. In beiden Fällen ist es nicht möglich den neuen Speicherort der Dateien auf der Standby Seite zu erahnen um diese vorher dorthin zu kopieren. Deswegen empfiehlt Oracle auch hier das Vorgehen mit STANDBYS=NONE: MOS Note 1916648.1: Making Use Deferred PDB Recovery and the STANDBYS=NONE Feature with Oracle Multitenant

Vorgehen mit STANDBYS=NONE

Die Behebung eines abgebrochenen Recovery ist nicht Bestandteil dieses Tipps und in der
MOS Note 2049127.1 Data Guard Impact on Oracle Multitenant Environments nachzulesen.

Wir konzentrieren uns dagegen auf das einfache Nachziehen der PDB Datendateien zu einem späteren Zeitpunkt, wenn mit STANDBYS=NONE gearbeitet wurde. Hierzu empfiehlt es sich die Archivelog Deletion Policy von RMAN auf Primär und Standby zu ändern, so dass für den kommenden Recovery Prozess nicht aus Versehen Redo Logs vom Primärrechner gelöscht werden:
RMAN> configure archivelog deletion policy to none;
Nun folgt das einfache Restore der Datendateien von der Primär-Datenbank. Dazu bedienen wir uns einer neuen 12c Syntax, die den Restore und das Recovery von einem "Service" erlaubt:
RMAN> connect target sys@stbycdb

RMAN> run {
      set newname for pluggable database spdb1 to new;
      restore pluggable database spdb1 from service spdb;
      switch datafile all;
      }
Das automatische Recovery der PDB ist im Moment in der Standby Datenbank aber noch ausgeschaltet. Um dies zu aktivieren muss zuerst das Redo Apply auf der Standby deaktiviert werden und die Standby Datenbank erneut in den Mount Status gestartet werden.
DGMGRL> edit database stbycdb set state='apply-off';

SQL> shutdown immediate;
SQL> startup mount;
Danach lässt sich das Recovery der PDB aktivieren und der automatische Recovery Mechanismus kann wieder gestartet werden (hier über Data Guard):
SQL> alter session set container = spdb1;

SQL> alter pluggable database enable recovery;

DGMGRL> edit database stbycdb set state='apply-on';

Fazit

Zumindest mit 12.1 sollte man beim Erzeugen neuer PDBs in Data Guard Umgebungen etwas Vorsicht walten lassen. Insbesondere wenn man auf die automatische Dateiverwaltung (OMF) von Oracle vertraut. Mit Active Data Guard geht es in der Regel zwar etwas einfacher, aber in den meisten Fällen ist der kleine Trick mit dem STANDBY=NONE beim Anlegen ausreichend, um alle Fälle zu meistern.

Im Endeffekt ist dies aber definitiv einfacher und schneller, als jedes mal eine neue Data Guard Umgebung für eine neue Datenbank aufzubauen.

Nützliche Links und Referenzen

  • Dojo #7: Oracle 12c Multitenant
  • "Datenbank-Cloning - ACFS & 12c Multitenant"
  • MOS Note 2049127.1 Data Guard Impact on Oracle Multitenant Environments
  • MOS Note 1916648.1: Making Use Deferred PDB Recovery and the STANDBYS=NONE Feature with Oracle Multitenant
  • MOS Note 1576755.1 Step by Step Examples of Migrating non-CDBs and PDBs Using ASM for File Storage
  • Zurück zur Community-Seite