Restore und Recovery mit dem Recovery Manager (RMAN for Beginners Teil 2)
von Sebastian Solbach, ORACLE Deutschland GmbH

Nachdem im letzten Recovery Manager Tipp das Thema Backup ausführlich behandelt wurde, geht es in diesem Tipp darum, wie Sie mit Hilfe dieser Backups ein Recovery durchführen.
Zwar sollte mit Oracle 11g der Recovery Advisor verwendet werden, um die optimale Wiederherstellungsstrategie zu finden, aber es gibt ein paar nützliche Funktionalitäten, wenn das Restore manuell durchgeführt wird. Hierzu gehört unter anderem das Restore an einen anderen Speicherort bzw. auf eine andere Diskgruppe in ASM.

Der Vollständigkeit halber werden die Grundlagen des Restores nochmals aufgelistet, wie das Recovery nach Verlust des SPFiles, eines Controlfiles, einer Datendatei und eines Redolog Members.

Als Basis für die erweiterten Themen und den Umzug während des Restores dient wieder die "Minimalkonfiguration" einer Datenbank anhand derer die unterschiedlichen Ausfallszenarien dargestellt werden:


Minimalkonfiguration

Wie im vorhergehenden Tipp besprochen, sollte eine Minimalkonfiguration aus mindestens 3 unabhängigen Platten bzw. 3 unabhängigen RAID Systemen bestehen, ob nun mit oder ohne ASM. Rot gekennzeichnete Dateien werden dabei nicht von RMAN mit gesichert:

Speicherort 1 (Erste Platte z.B. sda1) Speicherort 2 (Zweite Platte z.B. sda2) Speicherort 3 (Dritte Platte z.B. sda3)
Flash Recovery Area enthält:
Software
Passwortfile
Logfiles/Diag Verzeichnis
SPFile
1. Controlfile
2. Controlfile
Datenfiles (System-, Undo-, User- Tablespaces)
Redolog Member 1
3. Controlfile
Redolog Member 2
Archivierte Redologs
Backup

Diese Konfiguration gewährleistet, dass beim kompletten Verlust eines Speicherortes immer ein vollständiges Restore ohne jeglichen Datenverlust erfolgen kann. Deswegen sind Szenarien wie der "Verlust aller Controlfiles" und der "Verlust aller Online Redologs" sehr unwahrscheinlich. Maximal ein "Worst Case Szenario", d.h. der Verlust aller Platten und das Zurückgreifen auf ein Backup von Band/externe Platte sollte noch näher betrachtet werden.
Alle Szenarien basieren hierbei auf den Informationen des RMAN Katalog im Controlfile und dem damit verbundenen automatischem Backup von SPFile und Controlfile (Autobackup). Des Weiteren gehen die Szenarien von der Verwendung der FRA aus. Beachten Sie, dass sich einige der Restore Szenarien unterscheiden, wenn eine Datenbank als Recovery Katalog verwendet wird oder wenn nicht die FRA das Backup und Autobackup enthält.
Bevor Sie selber mit Testen anfangen, sollte geprüft werden, ob Ihr Backup auch vollständig ist und den Anforderungen Ihrer Backupstrategie entspricht.

RMAN> REPORT UNRECOVERABLE
...
RMAN> REPORT NEED BACKUP

Recovery nach Verlust oder Korruption des SPFiles

Ist das SPFile korrupt oder gelöscht, so kann die Datenbank nicht mehr gestartet werden. Folgende Fehler deuten auf ein Problem mit dem SPFile hin: "ORA-01078" gefolgt von einem "LRM-00109: could not open parameter file". Mit wenigen RMAN Befehlen wird das SPFile aus dem Autobackup wiederhergestellt. Da in folgendem Beispiel die FRA verwendet wird, ist kein SET DBID notwendig.

RMAN> STARTUP
RMAN> RESTORE SPFILE FROM AUTOBACKUP RECOVERY AREA 'd:\oracle\fra' DB_NAME 'ORCL';
RMAN> SHUTDOWN IMMEDIATE
RMAN> STARTUP

Recovery nach Verlust oder Korruption eines Controlfile

Sind nicht alle Controlfiles korrupt oder gelöscht, empfiehlt es sich, von einem funktionierenden Controlfile einfach eine Kopie über RMAN zu erzeugen. Welches Controlfile noch funktioniert, bzw. welche Controlfiles korrupt sind, erfährt man aus dem Alert.log der Datenbank. Ein "RESTORE FROM AUTOBACKUP" ist nur beim Verlust aller Controlfiles empfohlen, da nach einem solchen Recovery die Datenbank mit "RESETLOGS" geöffnet werden muss. Ein "ORA-00205: error in identifying control file , check alert log for more info" deutet auf den Verlust eines Controlfile hin.

RMAN> RESTORE CONTROLFILE FROM 'D:\ORACLE\ORADATA\ORCL\CONTROL02.CTL';
RMAN> STARTUP

Recovery nach Verlust, Korruption einer Datendatei oder eines Tablespaces

Korrupte oder nicht vorhandene Tablespaces werden mit einem "ORA-01157", gefolgt von einem "ORA-01110: data file 4" quittiert.
Es gibt sehr elegante Möglichkeiten korrupte Tablespaces / Datendateien auch online wiederherzustellen (Siehe hierzu auch die RMAN Dokumentation). Dies funktioniert aber nicht für SYSTEM oder UNDO Tablespace. Deswegen ist hier die Variante aufgelistet, die beliebige Tablespaces/Datendateien wiederherstellt:

RMAN> RESTORE DATAFILE 'D:\ORACLE\ORADATA\ORCL\USERS01.DBF';
RMAN> RECOVER DATAFILE 'D:\ORACLE\ORADATA\ORCL\USERS01.DBF';
Das Wiederherstellen von Datenfiles / Tablespaces passiert immer in 2 Schritten: Dem Restore, um das Datenfile aus dem Backup hervorzuholen und dem Recovery, um das Datenfile mit Hilfe der Archive und Online Redologs auf den aktuellen Stand zu bringen. Alternativ kann auch mit der Datenfile Nummer (RESTORE DATAFILE 4) oder dem Tablespace Namen (RECOVER TABLESPACE USERS) gearbeitet werden.
Eine Ausnahme bildet hierbei der TEMP Tablespace. Dieser wird von RMAN nicht mit-gesichert, da er keine persistenten Daten enthält. Seit 10g wird der TEMP Tablespace automatisch angelegt, falls er beim Startup nicht vorhanden ist.

Recovery nach Verlust, Korruption eines Redolog Members

Anders als bei den vorhergehenden Fällen hat der Verlust / die Korruption eines Redolog Members keine direkt sichtbaren Auswirkungen beim Datenbank Startup. Ein Fehler ist nur anhand eines ORA-00313 im Alert.log der Datenbank sichtbar. Trotzdem sollte der Fehler so schnell wie möglich behoben werden, da ansonsten im Falle eines Plattenausfalles keine Garantie mehr besteht, die aktuellsten Transaktionen retten zu können.
Dieser Fehler wird nicht direkt in RMAN behoben, sondern während des laufenden Betriebs in SQL:

SQL> ALTER DATABASE DROP LOGFILE MEMBER 'D:\ORACLE\ORADATA\ORCL\REDO03B.LOG';
SQL> ALTER DATABASE ADD LOGFILE MEMBER 'D:\ORACLE\ORADATA\ORCL\REDO03B.LOG' REUSE TO GROUP 3;

Beim Droppen der aktiven Log Gruppe kommt es zu einer Fehlermeldung:
ALTER DATABASE DROP LOGFILE MEMBER 'D:\ORACLE\ORADATA\ORCL\REDO03B.LOG'
*
ERROR at line 1:
ORA-01609: log 1 is the current log for thread 1 - cannot drop members
ORA-00312: online log 1 thread 1: 'D:\ORACLE\ORADATA\ORCL\REDO03.LOG'
ORA-00312: online log 1 thread 1: 'D:\ORACLE\ORADATA\ORCL\REDO03B.LOG'

Zur Abhilfe muss vorher die Log Gruppe gewechselt werden
SQL> ALTER SYSTEM SWITCH LOGFILE;
Hinweis: Man sollte darauf achten, dass neu angelegte Log Members erst einmal inaktiv sind. Dies sieht man am Status INVALID im STATUS Feld von V$LOGFILE.
Gerade wenn man weitere Recovery Tests macht, kann es durch die ungültigen Redologs (Status: INVALID) zu unvorhergesehenen Problemen kommen, da die Logfile Spiegelung erst dann wieder aktiv ist, wenn alle Logfiles aktiv sind. Daher wird empfohlen, nach den Änderungen an den Redologs in jedem Fall mit ALTER SYSTEM SWITCH LOGFILE alle Redologs einmal neu zu initialisieren.

Recovery nach Verlust des kompletten 1. Speicherortes

In diesem Fall bedeutet das den Verlust des Software Home, Passwort File, SPFile und einer Controldatei und wahrscheinlich auch des Betriebssystems. Die Wiederherstellung des OS und die Installation der Oracle Software (mit denselben Patches!) ist hierbei nicht Gegenstand dieses Artikels und kann im Notfall über eine Neuinstallation bewerkstelligt werden.
Die Passwortdatei lässt sich unter /database folgendermaßen erzeugen. Bei Unix/Linux unter /dbs und mit einfachen Hochkommata ' ':

orapwd file="PWDorcl.ora" password=oracle entries=5 force=y ignorecase=y nosysdba=n
Ist Ihr Betriebssystem Windows, so muss noch der Service mit Hilfe von oradim angelegt werden:
oradim -NEW -SID ORCL -SYSPWD oracle
Zuletzt holt man mit Hilfe des RMAN das SPFile aus dem Autobackup zurück und die fehlende Controldatei aus einer Kopie:
RMAN> STARTUP
RMAN> RESTORE SPFILE FROM AUTOBACKUP RECOVERY AREA 'd:\oracle\fra' DB_NAME 'ORCL';
RMAN> SHUTDOWN IMMEDIATE;
RMAN> STARTUP
RMAN> RESTORE CONTROLFILE FROM 'D:\ORACLE\ORADATA\ORCL\CONTROL02.CTL';
RMAN> STARTUP
Nun läuft die Datenbank wieder. Hat man jedoch auch Database Control im Einsatz, ist durch den Verlust des Software Home auch die Konfiguration von DBControl nicht mehr vorhanden und muss neu erstellt werden:
$ emca -config dbcontrol db 
Unter Umständen sollte noch die alte Verzeichnisstruktur unter /admin wiedererstellt werden.

Recovery nach Verlust des kompletten 2. Speicherortes

Sollte dieser Speicherort eine ASM Diskgruppe sein, muss natürlich erst wieder eine Diskgruppe mit dem entsprechenden Namen erstellt werden, damit alle Datendateien, ein Controlfile und die Online Redolog Members wieder zurück gesichert werden können. Bei einem Real Application Cluster, wo das SPFile ebenfalls in ASM liegt, muss natürlich dasselbe auch wiederhergestellt werden (siehe hierzu vorhergehender Abschnitt).

SQL> STARTUP
RMAN> RESTORE CONTROLFILE FROM '+FRA/orcl/controlfile/current.256.711977159';
RMAN> STARTUP MOUNT;
RMAN> RESTORE DATABASE
RMAN> RECOVER DATABASE;
RMAN> ALTER DATABASE OPEN;
Als letztes müssen noch über "ALTER DATABASE DROP LOGFILE MEMBER" und "ALTER DATABASE ADD LOGFILE MEMBER" die Redolog Members neu erzeugt werden (wie weiter oben beschrieben). Auch hier ist es empfohlen, mit mehreren "ALTER SYSTEM SWITCH LOGFILE" alle Logfile Members aktiv zu setzten.

Alternativ kann bei einem Restore natürlich auch der Filename Convert Parameter mitgegeben werden, der das Rücksichern an einen anderen Speicherort bzw. in eine andere Diskgruppe erlaubt.
Das SET NEWNAME FOR DATABASE und SET NEWNAME FOR TABLESPACE ist hierbei eine erhebliche Erleichterung in 11gR2, da nicht mehr für jedes Datenfile und Tempfile separat das NEWNAME Kommando ausgeführt werden muss. Auch für Filesysteme birgt dies eine Erleichterung, da auch die Formatspezifikationen um %b erweitert wurden. %b steht für den Dateinamen ohne Pfad und erlaubt somit eine schnelle Änderung der Pfade bei einem Restore.
SQL> STARTUP NOMOUNT;
SQL> ALTER SYSTEM SET CONTROL_FILES='+FRA/orcl/controlfile/current.256.711977159','+NEUDATA' SCOPE=spfile SID='*';
SQL> SHUTDOWN IMMEDIATE
SQL> STARTUP NOMOUNT;
RMAN> RESTORE CONTROLFILE FROM '+FRA/orcl/controlfile/current.256.711977159';
Speziell für ASM muss nach einem erneuten Startup, der CONTROL_FILES Parameter nochmals angepasst werden
SQL> STARTUP MOUNT
SQL> ALTER SYSTEM SET CONTROL_FILES='+FRA/orcl/controlfile/current.256.711977159',
     '+NEUDATA/orcl/controlfile/current.256.XXXXXX' SCOPE=spfile SID='*'
SQL> SHUTDOWN IMMEDIATE
RMAN> STARTUP MOUNT;
RMAN> RUN {
RMAN> SET NEWNAME FOR DATABASE TO '+NEUDATA';
RMAN> RESTORE DATABASE;
RMAN> SWITCH DATAFILE ALL;
RMAN> SWITCH TEMPFILE ALL;
RMAN> RECOVER DATABASE;
RMAN> }
RMAN> ALTER DATABASE OPEN;

Der Restore der Redolog Members passiert nun natürlich auf die andere ASM Diskgruppe:
SQL> ALTER DATABASE DROP LOGFILE MEMBER '+DATA/orcl/onlinelog/group_1.257.711977165';
...
SQL> ALTER DATABASE ADD LOGFILE MEMBER '+NEUDATA' TO GROUP 1;
...
Bei den älteren Oracle Versionen muss beim Restore für jedes Datenfile und Tempfile ein eigener SET NEWNAME Eintrag vorhanden sein.

Recovery nach Verlust des 3. Speicherortes (FRA)

Der Verlust der FRA stellt für die Datenbank im ersten Augenblick keinen wirklich kritischen Zustand dar. Zwar müssen auch das Controlfile und die Online Redologs wieder erstellt werden, aber die Datenbank läuft theoretisch auch ohne FRA. Denken Sie nur daran, dass Sie in diesem Fall ohne jegliches Netz und doppelten Boden weiterarbeiten. Deswegen sollte auch der Verlust der FRA schnellst möglichst behoben werden.

RMAN> STARTUP NOMOUNT;
RMAN> RESTORE CONTROLFILE FROM '+DATA/orcl/controlfile/current.256.711977159';
RMAN> ALTER DATABASE OPEN;
Auch hier müssen nun die Redolog Members wieder neu erstellt werden.

Es ist möglich, dass beim Öffnen der Datenbank ein "ORA-38760: This database instance failed to turn on flashback database" auftritt, falls Flashback Database aktiviert war. Dies lässt sich relativ leicht durch ein "ALTER DATABASE FLASHBACK OFF;" und "ALTER DATABASE FLASHBACK ON;" im Mount Status der Datenbank beheben.

Sollte die FRA nicht mehr an derselben Stelle stehen, muss ein Parameter im SPFile überschrieben werden, da die Datenbank mit einem "ORA-01261: Parameter db_recovery_file_dest destination string cannot be translated" nicht mehr startet. Aber wie geht das, wenn mein SPFile auf ASM liegt?
Eine INIT.ORA kann durchaus nur einen Parameter aus einem SPFile überschreiben und ansonsten alle anderen Einstellungen aus dem SPFile verwenden. Hierzu muss einfach der zu überschreibende Parameter in der INIT.ORA nochmals auftauchen (Reihenfolge beachten!):
$ cat initorcl.ora
SPFILE='+DATA/orcl/spfileorcl.ora'
*.db_recovery_file_dest='+FRANEU'

RMAN> STARTUP PFILE=initorcl.ora
SQL> ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='+NEUFRA';
SQL> ALTER SYSTEM SET CONTROL_FILES='+DATA/orcl/controlfile/current.256.711977159','+NEUFRA' SCOPE=spfile SID='*'             
SQL> SHUTDOWN IMMEDIATE;

RMAN> STARTUP MOUNT;
RMAN> RESTORE CONTROLFILE FROM '+DATA/orcl/controlfile/current.256.711977159';
SQL> ALTER SYSTEM SET CONTROL_FILES='+DATA/orcl/controlfile/current.256.711977159',
     '+NEUFRA/orcl/controlfile/current.256.XXXXXX' SCOPE=spfile SID='*'             
SQL> SHUTDOWN IMMEDIATE;
RMAN> STARTUP

Zuletzt die Online Redologs wieder richtig stellen
SQL> ALTER DATABASE DROP LOGFILE MEMBER '+FRA/orcl/onlinelog/group_1.257.711977165';
...
SQL> ALTER DATABASE ADD LOGFILE MEMBER '+NEUFRA' TO GROUP 1;
...
Da alle Backups durch den Verlust der FRA gelöscht wurden, sollte danach dringend ein erneutes Backup und eine Säuberung des Recovery Kataloges passieren (DELETE OBSOLETE, CROSSCHECK, DELETE EXPIRED BACKUP, BACKUP DATABASE PLUS ARCHIVE LOG).

Hinweise: V$LOGFILE einhält eine Spalte IS_RECOVERY_DEST_FILE. Enthält diese ein YES, so rechnet die Oracle Datenbank die Logfiles zu dem verwendeten Platz der FRA. Diese Spalte wird aber nur bei der Verwendung von OMF (was mit ASM fast immer der Fall ist) genutzt. Leider erkennt Oracle das nicht automatisch, wenn nur ein Logfile Member hinzugefügt wird. Im Moment ist es ebenfalls noch nicht möglich, dies beim ADD LOGFILE MEMBER mit anzugeben. Soll dies nach einem Ausfall der FRA wieder richtig hergestellt werden, so müssen die kompletten Logfile Gruppen über ALTER DATABASE DROP/ADD LOGFILE [THREAD X] GROUP Y erstellt werden. Dann sorgt die Datenbank dafür, dass die Werte in IS_RECOVERY_DEST_FILE richtig gefüllt werden.

Das "Worst Case Szenario"

Im Gegensatz zu den vorhergehenden Szenarien, besitzt man bei diesem Szenario keine Online Redologs mehr. Das heißt ein komplettes Recovery ist nicht möglich. Um auf einen konsistenten Stand der Datenbank zu kommen, ist eine Sicherung eines Backups + Archivelogs und dazugehörigem Autobackup aus der FRA auf Tape oder auf einem Fileserver notwendig.
Das Restore ist erheblich einfacher, wenn das Backup in der Ordnerstruktur der FRA vorliegt. Im Tipp wird davon ausgegangen, dass die Software wie unter "Verlust des 1. Speicherortes" beschrieben wiederhergestellt wurde und das Tape Backup in der Struktur der FRA wieder in den FRA Ordner zurückkopiert wurde. Unterverzeichnisse unterhalb ARCHIVELOG, AUTOBACKUP, etc. (die das Datum enthalten) sind dabei nicht notwendig.

RMAN> STARTUP
LRM-00109: could not open parameter file 'D:\ORACLE\DB\DATABASE\INITORCL.ORA'

RMAN> RESTORE SPFILE FROM AUTOBACKUP RECOVERY AREA 'd:\oracle\fra' DB_NAME 'ORCL';
RMAN> SHUTDOWN IMMEDIATE
RMAN> STARTUP NOMOUNT;
RMAN> RESTORE CONTROLFILE FROM AUTOBACKUP DB_NAME 'ORCL';
RMAN> ALTER DATABASE MOUNT;

RMAN> LIST ARCHIVELOG ALL
Key     Thrd Seq     S Low Time
------- ---- ------- - ---------
155     1    51      A 05-MAR-10
        Name: D:\ORACLE\FRANEU\ORCL\ARCHIVELOG\O1_MF_1_51_5S22FOGM_.ARC

156     1    52      A 05-MAR-10
        Name: D:\ORACLE\FRANEU\ORCL\ARCHIVELOG\O1_MF_1_52_5S22FRF5_.ARC

Das Archivelog mit der höchstens Logsequenz +1 ist unser Ziel
RMAN> RESTORE DATABASE UNTIL LOGSEQ 53;
RMAN> RECOVER DATABASE UNTIL LOGSEQ 53;
RMAN> ALTER DATABASE OPEN RESETLOGS;
Dies sollte im allgemeinen die gängigen Szenarien beim Recovery abdecken, und Sie können beruhigt in die Zukunft blicken, und müssen sich um Server- und Plattenausfälle keine Sorgen mehr machen.
Nochmals der Hinweis: Ab Oracle 11g ist die Verwendung des Recovery Advisor empfohlen. Dieser analysiert Fehler, bietet die optimale Recovery Strategie und kann Ihnen sogar die eigentliche Reparatur abnehmen. Aber selbst für 10g kann der Recovery Advisor hilfreich sein. Hierfür stellen Sie einfach den Fehler bei einer 11g Datenbank nach und lassen sich die Empfehlung anzeigen.

Nützliche Links und Referenzen

  • Oracle Dokumentation: Backup and Recovery Reference
  • Backup mit dem Recovery Manager (RMAN for Beginners Teil 1)
  • Recovery Advisor Tipp
  • Zurück zur Community-Seite