Flashback Query – Das SQL Statement in der Not

Versehentlich wurden wichtige Daten gelöscht. Natürlich nicht in einem Testsystem sondern im laufenden Betrieb. Der Puls und Blutdruck steigt. Aber keine Sorge – nicht immer muss ein Backup eingespielt werden. Zumindest nicht, wenn der Fehler zeitig bemerkt wird. Ausschlaggebend ist dafür die Flashback Query, welche auf den UNDO Tablespace basiert. 

Undo Tablespace

Im Undo Tablespace legt die Datenbank abgeänderte Datenblöcke ab. Diese „before“ Images werden genützt, um auf bereits geänderte Datensätze zuzugreifen. Dies bedeutet jedoch auch, dass der erste User immer Veränderungen an der Datenbank vornimmt. Ein zweiter User bekommt die Daten hingegen vom Undo Tablespace angezeigt. 

Geändert wird in der Datenbank. Ein Zugriff auf einen gesperrten Datenblock erfolgt über den Undo Tablespace. 

Wir ein Commit ausgeführt, so wird der Undo Tablespace zum Überschreiben freigegeben. Die richtigen Werte stehen somit bereits in der Datenbank. Bei einem Rollback hingegen werden die Datensätze aus dem Undo Tablespace in die Datenbank zurückgeschrieben. Durch dieses Konzept ist sichergestellt, dass sich lesende und schreibende User nicht gegenseitig blockieren und jeder lesende Nutzer die noch aktuell gültige Version sieht. 

Backup durch die Flashback Query

Aus Performancegründen wird der Undo Tablespace allerdings nicht gelöscht, sondern einfach nur überschrieben. Dies bedeutet, dass die Daten solange bestehen bleiben, bis der Buffer aufgebraucht ist. Danach beginnt die Datenbank mit dem Überschrieben. Ein guter Wert für die Wiederherstellung sind ca. 5-15 Minuten. 

Die Abfrage

Die Abfrage eines Wertes aus der Vergangenheit kann mit den Keywords „AS OF TIMESTAMP“ und einer Datumsangabe reproduziert werden. Die AS OF Klausel bezieht sich allerdings immer auf eine Tabelle, sodass bei einem JOIN bei jeder Tabelle eine AS OF Klausel mit Zeitangabe angegeben werden muss. Nachfolgend erfolgt ein demonstratives Beispiel

SELECT * 
FROM emp AS OF TIMESTAMP systimestamp - INTERVAL '5' MINUTE
WHERE empno = 1234

Sollte kein Image aus dem Undo Tablespace vorhanden sein, so liefert Oracle einen Fehler zurück. Nun muss wirklich zu einem Backup, Journaleintrag oder sonstigem gegriffen werden. Der Fehler lautet meist: 

ORA-08180: Kein Snapshot gefunden basierend auf angegebener Zeit