In meinem letzten Blog „Flashback Functions – Ein Name, verschiedene Techniken“ habe ich über Flashback Funktionen geschrieben. In diesem Blog werde ich noch einmal über Flashback-Query schreiben.
Flashback-Query ist eigentlich die Fähigkeit den vergangenen Inhalt einer Tabelle zu lesen. Oracle Databases verwendet zwei Techniken um dies zu erreichen:
- Rollback/Undo Segmente
- Flashback Data Archive
Rollback/Undo Segmente
Seit Oracle 9i ist es möglich die „AS OF“ Klausel zu einem Select-Statement hinzuzufügen. Theoretisch kann man ein SCN benutzen, aber es ist realistischer einen Timestamp einzusetzen.
Beispiel:
Zu Beginn verwende ich eine Tabelle namens „PERSONEN“. Um das Flashback-Query zu zeigen, ändere ich den NACHNAME mit der PERSID 100389.
Von nun an wird jede Query – wie wir alle wissen und erwarten – den neuen Nachnamen „Ahrends“ lesen. Aber mit dem Flashback-Query können wir auch einen „alten“ Wert auswählen.
Um das Statement zu analysieren, verwende ich Toad for Oracle’s brilliante Tracing-Fähigkeiten:
Jetzt führe ich die beiden Statements aus:
- Den aktuellen Nachnamen
- Den „alten“ Nachnamen
Schaut man ins Trace, sieht man, dass das erste Statement sehr einfach ist, während das zweite Statement ein Subquery ausführt, da es den zugehörigen SCN für den Timestamp, den wir verwenden, finden muss.
Aber das Zeitfenster ist sehr klein um diese Änderungen zu erfassen. Also wenn die Daten nicht mehr in den UNDO-Segmenten verfügbar sind, bekommt man letztendlich ein „ORA-01555 snapshot too old“. Also keine Chance die Daten zu lesen, die älter sind als ein paar Stunden.
Flashback Data Archive
Hier kommt die zweite Technik ins Spiel: Flashback Data Archive. Dieses Feature wurde mit Oracle 11g als „Total Recall“-Option in der Enterprise Edition eingeführt. Aber es ist mittlerweile in allen Editionen seit 11.2.0.4 kostenlos verfügbar (natürlich auch in 12c).
Für das nächste Beispiel verwende ich meine Oracle Standard Edition Two 12.1.0.2 Datenbank mit dem PSU160419 (April 2016). Zuerst muss ich ein Flashback-Archiv erstellen. Wieder verwende ich hierfür Toad for Oracle. Ich nenne es „DEMOFDA“. Es ist Zufall, dass der Tablespace auch DEMOFDA heißt. Da ist nichts Besonderes an diesem Tablespace, also können sie nehmen, welchen Sie möchten (außer SYSTEM, SYSAUX, UNDO und TEMP natürlich).
Teil der Definition der Flashback-Area ist der Retentionszeitraum. In meinem Fall setze ich die Retention auf ein Jahr, also 365 Tage:
Die Flashback-Area ist nur ein Bereich, sie belegt also keinen Platz oder hat keine anderen Auswirkungen auf die Datenbank oder das Schema – und sie ist nicht einem Schema zugeordnet.
Flashback-Archive wird nur für bestimmte Tabellen aktiviert. In meinem Beispiel werde ich das gesamte Schema „DEMO“ auswählen.
Tipp: Mit „Viw/Edit Query“ kann man die Tabellen in Toad filtern.
Leider unterstützt Flashback-Archive keine Tabellen mit dem Datentyp LONG.
Tipp: Das Schema, das die Tabellen besitzt, muss Quota auf dem Flashback-Archive-Tablespace haben.
Jetzt habe ich Flashback-Archive für die Tabellen aktiviert. Schaut man auf die rechte Seite in Toad, ist der Flashback-Tablespace-Name leer und der gesamte Platz der Flashback-Tabelle ist 0. Das liegt daran, dass die Flashback-Tabellen spontan erstellt werden mit der ersten DML.
Wie man unten sieht, haben der Flashback-Tablespace- und die Gesamt-Platz-Spalten gültige Daten, sobald die erste Änderung geschieht:
Aber was ist mit den Queries?
Tracen wir es noch einmal.
Es ist ein großer Unterschied zum ersten Beispiel mit dem Undo-Tablespace. Statt einer Subquery haben wir jetzt 9 (!) und die Ausführungsdauer ist (obwohl in Millisekunden) bemerkenswert.
Wenn man das zweite Subquery anschaut, taucht eine Tabelle namens „SYS_FBA“ auf. Das ist die zugehörige Flashback-Archive-Tabelle. Um den Link zwischen den Tabellen zu sehen, kann man den view „DBA_FLASHBACK_ARCHIVE_TABLES“ verwenden.
Und dies ist das Dataset in der Flashback-Archive-Tabelle:
Nach diesem sehr erfolgreichen Beispiel, möchte ich einige zusätzliche Tests machen, um zu zeigen, was passiert, wenn man eine Spalte zu einer Tabelle hinzufügt. Als Beispiel habe ich die Spalte „CHANGEDATE“ zur Tabelle „STATUS“ hinzugefügt.
Und dies ist das Ergebnis:
Aber die Tabelle „STATUS“ existiert, wie man in Toad sieht. Aber leider gibt es die zugehörige Flashback-Tabelle noch nicht.
Das bedeutet, dass man die Tabelle nicht ändern kann, solange die zugehörige Flashback-Tabelle nicht existiert. Ein paar weitere Tests endeten im absoluten Durcheinander. Ich löschte die Flashback-Area und -Tabellen und erstellte sie erneut, aber ohne Erfolg.
Also ich vermute, ich muss noch etwas mehr Zeit investieren um herauszufinden, was schief gelaufen ist. Ich muss zugeben, dass es aus meiner Sicht immer noch „Verbesserungspotential“ gibt.