RMAN-Sicherung / Wiederherstellung einer Datenbank zu einer früheren Inkarnation
Um eine unvollständiges recovery zu einer früheren Inkarnation durchführen zu können, müssen wir zunächst einmal verstehen, was eine Datenbank Inkarnation ist.
Eine Inkarnation ist eine neue Version einer Datenbank. Durch das Öffnen der Datenbank mit der Option "resetlogs" , archived Oracle die aktuellen Redo-Log- Dateien und löscht sie alle durch zurücksetzen der "sequence number" auf 1. Diese Option wird häufig nach einem unvollständigen "recovery" durchgeführt. Bei diesem "recovery" sind die Informationen aus den archivierten Redo-Log- Dateien teilweise , aber nicht vollständig "applied" worden. Daher müssen die Online-Redo- Log-Dateien zurückgesetzt werden.
Wenn die Datenbank mit der Option "resetlogs" geöffnet wurde, ist es nicht möglich, Backups, die hinter der neu geschaffenen Inkarnation gesichert wurden, zu verwenden.
In diesem Beispiel läuft die Datenbank im "Archive Mode".
Wir erstellen ein Backup:
RMAN> backup database;
Wir erstellen ein Table:
SQL> create table t as select * from all_objects;
SQL> select count(*) from t;
COUNT(*)
----------
73123
und ermitteln die current_scn
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
1494553
Wir löschen zunächst den Ihnalt der Table
SQL> delete from t;
SQL> commit;
und ermitteln die current_scn
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
1495825
nun dropen wir die Table 1
SQL> drop table t;
und ermitteln die current_scn
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
1499733
und führen ein Logswitch durch:
SQL> alter system switch logfile;
Als nächstes ermitteln wir allen Inkarnationen der Datenbank:
SQL> select incarnation#, resetlogs_change# from v$database_incarnation;
INCARNATION# RESETLOGS_CHANGE#
------------ -----------------
1 1297455
2 1298116
3 1480405
4 1480374
Der DBA führt nun eine "incomplete recovery" durch. Er restoret die Datenbank vor dem dropen der Tabelle t, also bis scn 1495825
SQL> shutdown immediate
SQL> startup mount
RMAN> run{
set until scn 1495825;
restore database;
recover database;
}
RMAN> alter database open resetlogs;
Da die Datenbank mit der Option "resetlogs" geöffnet wurde, wurde eine neue Inkarnation geschaffen. Wir überprüfen die neue Inkarnation und die wiederhergestellte Tabelle:
SQL> select incarnation#, resetlogs_change# from v$database_incarnation;
INCARNATION# RESETLOGS_CHANGE#
------------ -----------------
1 1297455
2 1298116
3 1480405
4 1480374
5 1495826
SQL> select * from t;
no rows selected
Die neue Inkarnation wurde erstellt und die Tabelle erfolgreich wiederhergestellt, ohne Inhalt. Nach diesem recovery wiederherstellen wir die Datenbank bis zum Löschbefehl:
SQL> shutdown immediate
SQL> startup mount
RMAN> run{
set until scn 1494553;
restore database;
recover database;
}
Wir bekommen eine Fehlermeldung, dass die "until scn" Klausel, wo die Daten gesichert wurden, nicht "recoverd" werden können
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of restore command at 11/29/2013 15:49:13
RMAN-20208: UNTIL CHANGE is before RESETLOGS change
RMAN> list incarnation of database;
List of Database Incarnations
DB Key Inc Key DB Name DB ID STATUS Reset SCN Reset Time
------- ------- -------- ---------------- --- ---------- ----------
1 1 RAC02DB 1920955460 PARENT 1297455 2013-11-28:11:28:14
2 2 RAC02DB 1920955460 PARENT 1298116 2013-11-28:12:00:24
4 4 RAC02DB 1920955460 PARENT 1480374 2013-11-29:13:52:43
3 3 RAC02DB 1920955460 ORPHAN 1480405 2013-11-29:10:02:44
5 5 RAC02DB 1920955460 PARENT 1495826 2013-11-29:15:32:25
6 6 RAC02DB 1920955460 CURRENT 1499671 2013-11-29:15:44:13
RMAN> shutdown immediate
RMAN> startup mount
RMAN> reset database to incarnation 5;
RMAN> run {
set until scn 1494553;
restore database;
recover database;
}
SQL> select count() from t;
COUNT(*)
----------
72839
Artikelaktionen