Haben Sie nicht auch schon einmal einen SQL-Befehl abgesetzt (z.B. DROP TABLE oder DROP USER) und sich anschließend gewünscht, Sie könnten die Zeit wieder zurückdrehen?
Bislang war dies entweder nur mit dem Einspielen eines funktionierenden Backups und einem anschließenden unvollständigem Recovery (was in der Regel sehr zeitaufwändig war) oder mit dem Import einer zuvor angelegten Dump-Datei möglich.
Bereits in Version 9i wurde das Feature FLASHBACK eingeführt, mit dessen Hilfe es möglich ist, Daten zu einem in der Vergangenheit liegenden Zeitpunkt auf Session- bzw. Statementebene zur Verfügung zu stellen. Es konnten jedoch keine DDL-Anweisungen rückgängig gemacht werden.
In Version 10g wird dieses Feature nun um zusätzliche Konzepte erweitert, durch die sich u.a. auch schwerwiegende Anwenderfehler schnell und einfach beheben lassen.
Das FLASHBACK DATABASE-Konzept bietet eine schnelle und unkomplizierte Möglichkeit, ein unvollständiges Recovery durchzuführen und damit einen irrtümlich abgesetzten DROP TABLE oder DROP USER-Befehl zurück zu setzen. Dafür gibt es einen neuen Bereich in der Datenbank, die sog. FLASH RECOVERY AREA, in der spezielle FLASHBACK Log-Dateien abgelegt werden. Die Konfiguration dieses Bereichs wird durch verschiedene Initialisierungsparameter gesteuert:
Damit die FLASHBACK DATABASE-Option genutzt werden kann, muss FLASHBACK in der MOUNT-Phase der DB eingeschaltet werden (und sich die DB im Archivierungs-Modus befinden).
SQL> SHUTDOWN IMMEDIATE
SQL> STARTUP MOUNT
SQL> ALTER DATABASE ARCHIVELOG; -- Archivierung muss eingeschaltet sein
SQL> ALTER DATABASE FLASHBACK ON; -- ALTER DATABASE FLASHBACK OFF schaltet FLASHBACK wieder aus.
SQL> ALTER DATABASE OPEN;
Informationen zu Speicherplatz und Rücksprungzeit liefert Ihnen die View v$flashback_database_log:
SQL> SELECT * FROM v$flashback_database_log;
OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_ RETENTION_TARGET
-------------------- ----------------- ----------------
937657 17.03.05 13:41:56 1440
FLASHBACK_SIZE ESTIMATED_FLASHBACK_SIZE
-------------- ------------------------
12288000 122634240
Das Zurücksetzen der Datenbank im Fehlerfall erfolgt entweder anhand einer SCN oder eines Zeitstempels. Die aktuelle SCN kann über folgenden SELECT ermittelt werden:
SQL> SELECT current_scn FROM v$database;
CURRENT_SCN
-----------
937670
Beispielszenario:
Vor einer Stunde ist ein wichtiger Benutzer mitsamt seinen Objekten gelöscht worden. Das gesamte Benutzerschema muss unbedingt wieder hergestellt werden. Flashback ist bereits eingeschaltet worden.
SQL> SHUTDOWN IMMEDIATE
SQL> STARTUP MOUNT
SQL> FLASHBACK DATABASE TO TIMESTAMP (sysdate-1/24); -- 1 Stunde zurück
-- oder
SQL> FLASHBACK DATABASE TO SCN 937670;
Die Datenbank ist nun physikalisch in einen früheren, konsistenten Zustand versetzt worden und lässt sich nur noch mit OPEN RESETLOGS öffnen:
SQL> ALTER DATABASE OPEN RESETLOGS;
Muss nicht die gesamte Datenbank zurückgesetzt werden, sondern lediglich einzelne Tabellen, wird dies nun mit Hilfe des FLASHBACK TABLE-Kommandos erreicht:
Beispiel:
SQL> FLASHBACK TABLE scott.emp, scott.dept TO TIMESTAMP (SYSTIMESTAMP – INTERVAL '10' MINUTE);
Hinweise:
SQL> ALTER TABLE scott.emp ENABLE ROW MOVEMENT;
SQL> ALTER TABLE scott.dept ENABLE ROW MOVEMENT;
Ab Version 10g gibt es bei Oracle eine Art Papierkorb, den sog. RECYCLEBIN. Das normale Löschen einer Tabelle verschiebt die Tabelle lediglich in den RECYCLEBIN und der Speicher wird nicht freigegeben. Den Inhalt des Papierkorbs kann man sich anzeigen lassen:
SQL> SELECT * FROM recyclebin;
oder:
SQL> SELECT * FROM user_recyclebin;
oder:
SQL> SHOW RECYCLEBIN
SQL> SELECT * FROM dba_recyclebin;
Eine gelöschte Tabelle kann wiederhergestellt werden über:
SQL> FLASHBACK TABLE [<owner>.]<tab_name> TO BEFORE DROP [RENAME TO <tab_neu>];
Endgültig gelöscht wird eine Tabelle nun über folgende Befehle:
SQL> DROP TABLE <tab_name> PURGE; /* löscht die Tabelle sofort und gibt den Speicherplatz frei */
SQL> PURGE TABLE <tab_name>; /* löscht die Tabelle endgültig aus dem Papierkorb, wenn zuvor ein Drop auf sie abgesetzt wurde */
SQL> PURGE TABLESPACE <tbs_name>; /* alle bereits gelöschten Objekte aus dem TBS <tbs_name> werden nun endgültig gelöscht */
SQL> PURGE RECYCLEBIN; /* alle Objekte aus dem Benutzer-Papierkorb werden nun endgültig gelöscht */
Bitte nehmen Sie mich in den Verteiler der monatlichen Tipps & Tricks auf.