Reihe Oracle 9i New Features - Teil VI:
Flashback
Mit Hilfe des neuen Features Oracle Flashback ist es möglich, ein konsistentes Abbild der Datenbank zu einem bestimmten Zeitpunkt in der Vergangenheit zu erhalten. Es kann beispielsweise das Wiederherstellen von Datensätzen, die versehentlich gelöscht wurden, erleichtern. Ein Grund, Ihnen dieses neue Feature vorzustellen.
Grundlagen
Oracle Flashback ist mit der Version 9.0 erschienen und in der Version 9.2 erweitert worden. Mit diesem Feature können Daten aus der Vergangenheit abgefragt werden. Der Benutzer kann den Zeitpunkt entweder durch die Angabe einer bestimmten Zeit oder einer bestimmten System Change Number (SCN) angeben.
Oracle Flashback bietet unter anderem folgende Anwendungsmöglichkeiten:
- Trend Analyse: Es ist ein Vergleich zwischen aktuellen Daten und Daten aus der Vergangenheit möglich.
- Es können Daten, die gelöscht wurden, wiederhergestellt werden.
Oracle Flashback nutzt die Funktionalität des UNDO Managements. Das heißt, die Rollback Segmente werden automatisch von der Instanz verwaltet. Eingeschaltet wird das UNDO Management durch Setzen der init<SID>.ora Parameter UNDO_MANAGEMENT und UNDO_TABLESPACE (siehe ORDIX News 4/2002).
Mit Hilfe des Initialisierungsparameters UNDO_RETENTION wird festgelegt, wie lange die UNDO Informationen in den Rollback Segmenten festgehalten werden sollen.
Es gibt zwei Möglichkeiten, Oracle Flashback zu aktivieren:
- Der Flashback Modus wird mit Hilfe des Packages DBMS_FLASHBACK eingeschaltet. Wird er nicht explizit ausgeschaltet, so ist der Flashback Modus während der gesamten Session aktiv. DML-Statements sind in diesem Modus nicht möglich. Unterschiedliche Sessions können den Flashback - Modus zu unterschiedlichen Zeiten verwenden.
- Ab Oracle 9i Release 2 wird diese Funktionalität erweitert, indem Flashback Abfragen
erstellt werden können. Das SELECT Statement wird um die "AS OF" Klausel erweitert, so dass z. B. Joins, Subqueries und Views auf gleiche Tabellen zu unterschiedlichen Zeitpunkten möglich sind. Außerdem können Tabellen mit Hilfe INSERT oder CREATE TABLE AS SELECT Statements leicht wiederhergestellt werden. In diesem Modus sind DML-Statements möglich.
Für beide Aktivierungen gilt, dass der Benutzer das FLASHBACK Privileg für die Tabelle oder das Privileg FLASHBACK ANY TABLE haben muss.
DBMS_FLASHBACK Package
Zum Ausführen des Packages muss der Benutzer das Privileg EXECUTE DBMS_FLASHBACK besitzen.
Das DBMS_FLASHBACK Package enthält folgende Prozeduren:
ENABLE_AT _TIME
Das Oracle Flashback wird für den gewünschten Zeitpunkt aktiviert. Diesem Zeitpunkt wird eine SCN zugeordnet, die den konsistenten Zustand der Datenbank zu diesem Zeitpunkt widerspiegelt. Alle 5 Minuten wird die SCN intern aufgezeichnet, die angegebene Zeit wird abgerundet.
SQL> EXECUTE dbms_flashback.enable_at_time
(‘24-FEB-01 11:00:00‘);
ENABLE_AT_SYSTEM_CHANGE _NUMBER
Flashback wird für diese SCN aktiviert. Die aktuelle SCN kann mit der Prozedur GET_SYSTEM_CHANGE_NUMBER ermittelt werden.
SQL> EXECUTE dbms_flashback.enable_at_system_change_number
(345354);
GET_SYSTEM_CHANGE_NUMBER
Diese Funktion gibt die aktuelle SCN zurück. Möchte man später zu diesem Stand der Datenbank zurückkehren, so kann hier die aktuelle SCN ermittelt werden.
SQL> SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM dual;
DISABLE
Diese Funktion schließt die Flashback Session, so dass mit dem aktuellen Datenbestand weiter gearbeitet werden kann.
SQL> EXECUTE dbms_flashback.disable
Flashback Abfrage
Durch den Gebrauch der
"AS OF" Klausel in einer
SELECT Anweisung ist es möglich, die Daten von Tabellen zu unterschiedlichen Zeiten abzufragen. Es können jedoch nur Daten abgefragt werden, die nicht älter als 5 Tage sind. Ist die Datenbank zwischenzeitlich neu gestartet worden, so können die Daten nur noch mit Hilfe der SCN zurückgeholt werden.
SELECT ...
FROM ... AS OF [TIMESTAMP|SCN] <Ausdruck>
...
Es kann entweder ein Datum im Format TIMESTAMP oder die SCN angegeben werden. Die SCN erhält man mit Hilfe des DBMS_FLASHBACK Packages (siehe oben).
Hinweis: Wurde die Tabelle mit
DROP oder
TRUNCATE gelöscht oder die Tabellenstruktur mit
MODIFY geändert, so können die Daten nicht wiederhergestellt werden, da sich keine gültigen UNDO Informationen mehr in den Rollbacksegmenten befinden. DDL Statements, die Storage Parameter wie
PCTFREE oder
INITTRANS verändern, können auf die Tabelle ausgeführt werden, ohne dass die UNDO Informationen verloren gehen.
Beispiel: Flashback Abfrage
Das folgende Beispiel soll die Verwendung beider oben beschriebener Funktionalitäten verdeutlichen:
- Es muss zunächst sichergestellt werden, ob das automatische UNDO Management eingeschaltet ist. Ist das nicht der Fall, so müssen die entsprechenden Parameter UNDO_MANAGEMENT und UNDO_TABLESPACE in die init<SID>.ora eingetragen werden (siehe ORDIX News 4/2002).
- Der Standardwert für UNDO_RETENTION ist 900 Sekunden (entspricht 15 Minuten). Da in unserem Beispiel die UNDO Informationen 30 Minuten lang behalten werden sollen, wird die UNDO_RETENTION geändert:
SQL> ALTER SYSTEM SET
UNDO_RETENTION = 1800;
- Gehört die Tabelle nicht dem Benutzer, so muss ihm entweder das Privileg FLASHBACK ON <Tabellenname> oder FLASHBACK ANY TABLE erteilt werden.
- Der Benutzer USER1 besitzt die folgende Tabelle abt:
| VORNAME |
NAME |
ABT_NR |
| Michael |
Miller |
10 |
| Alexander |
Kijo |
20 |
| Den |
Raphaell |
30 |
| Tobias |
Siegel |
20 |
- Am 23.10.02 um 13:34 Uhr werden versehentlich alle Mitarbeiter der Abteilung 20 gelöscht.
| VORNAME |
NAME |
ABT_NR |
| Michael |
Miller |
10 |
| Den |
Raphaell |
30 |
- a. Die alten Daten können mittels DBMS_FLASHBACK zurückgewonnen werden.
SQL> execute dbms_flashback.enable_at_time
(‘23-OCT-02 13:30:00’);
SQL> select * abt;
b. Rückgewinnung mittels select .. as of.
SQL> SELECT * FROM abt AS OF TIMESTAMP
(SYSDATE – INTERVAL ‘4‘ MINUTE);
In beiden Fällen ist der ursprüngliche Inhalt wieder hergestellt:
| VORNAME |
NAME |
ABT_NR |
| Michael |
Miller |
10 |
| Alexander |
Kijo |
20 |
| Den |
Raphaell |
30 |
| Tobias |
Siegel |
20 |
Fazit
Mit Hilfe von Oracle Flashback ist es möglich, über relativ kurze Zeitintervalle Trendanalysen zu erzeugen. Außerdem erleichtert Oracle Flashback das Wiederherstellen von Daten, die kurz vorher gelöscht wurden. Eine sehr große UNDO-RETENTION führt allerdings zu
einem stark erhöhten Bedarf an Rollback-Blöcken, was zu Performance-Einbußen führen kann.
Stephan Sippel (info@ordix.de).