Logo Oracle Deutschland   DBA Community  -   Februar 2012 (zuletzt ergänzt Juli 2015)
Flashback Technologien
von Ulrike Schwinn, Oracle Deutschland B.V. & Co. KG

Zurückgehen in der Zeit ist schon lange ein Feature, das die Oracle Datenbank unterstützt. Flashback in Oracle bedeutet Daten eines früheren Zeitpunkts zur Verfügung zu stellen. Schon in Oracle 9i wurde begonnen diese Anforderung durch das Flashback Query Konzept in der Datenbank zu implementieren. Damit ist es möglich, Daten zu einem früheren Zeitpunkt auf Session- bzw. Statement- Ebene zur Verfügung zu stellen. In Oracle Database 10g wurde diese Technologie um neue Konzepte erweitert, die es erlauben, Flashback von Tabellen bis auf Datenbankebene zu nutzen. In 11g sind Erweiterungen im Bereich Transaktionen (siehe Flashback Transaction) und das Monitoren von Daten über ihren gesamten Lebenszyklus (siehe Flashback Data Archive) implementiert worden.

Einige Beispiele für die Nutzung der Flashback Technologien sind:

  • Abfragen um Informationen aus der Vergangenheit zu selektieren
  • Rollback von Transaktionen
  • Wiederherstellen von gelöschten Tabellen
  • Zurücksetzen der gesamten Datenbank ohne Point-in-Time Recovery
Alle Flashback Features stehen automatisch ohne zusätzliche Installation zur Verfügung. Die Nutzung speziell der Flashback Query Technologie ist sogar in Oracle Werkzeugen wie APEX als Standard implementiert und ohne Kenntnis der entsprechenden Syntax verwendbar.

Folgende Abschnitte geben einen kurzen Überblick und eine kurze Beschreibung über die einzelnen Techniken.
  • Flashback Query: Hiermit wird die Abfrage von Daten zu einem früheren Zeitpunkt ermöglicht. Dabei kann immer nur eine einzige Version der Daten pro Statement selektiert werden. Eine fehlerhaften Dateneingabe, die schon mit COMMIT festgeschrieben ist, kann auf diese Weise rückgängig gemacht werden. Ein anderer Anwendungsfall wäre, einen Datenvergleich zu verschiedenen Zeitpunkten zu ermöglichen.

    Implementiert ist diese Technik über die AS OF Klausel im SELECT Statement oder über das Package DBMS_FLASHBACK für eine gesamte Session. Mit DBMS_FLASHBACK.ENABLE_AT_TIME oder DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER kann Flashback Query auf alle Statements einer Session ausgeweitet werden. Mit der Prozedur DBMS_FLASHBACK.DISABLE wird dieser Zustand für die Session beendet.

    Einzige Voraussetzung ist die Nutzung von UNDO Management, d.h. das Setzen von UNDO_MANAGEMENT=AUTO. Um Flashback Query Feature zu nutzen, ist es generell wichtig, Zugriff auf ältere (schon mit Commit abgeschlossene) Daten zu haben. Daher verwendet Oracle die sogenannte Undo Retention - das ist die Dauer, die die Undo Daten nach Abschluss einer Transaktion gehalten werden. Der Parameter UNDO_RETENTION, falls gesetzt, fungiert dabei als untere Grenze, damit die Undo Daten mindestens so lange vorgehalten werden, wie der Parameter in Sekunden angibt.
    Hinweis: Seit 10g gibt es ein automatisches Undo Tuning für die Bestimmung der Undo Retention. Die Datenbank (MMON) sammelt Statistiken und tunt die Undo Retention Periode basierend auf diesen Statistiken. Für AUTOEXTEND Undo Tablespaces bedeutet dies, dass das System Undo für mindestens den Zeitraum von UNDO_RETENTION beibehalten wird, für "fixed-size" Tablespaces hingegen wird die maximale UNDO Periode berechnet, und der UNDO_RETENTION Parameter ignoriert. Mehr Informationen dazu finden Sie auch in der Note 461480.1. Die folgende Query listet die getunte Undo Retention:
    SQL> SELECT TO_CHAR(BEGIN_TIME, 'MM/DD/YYYY HH24:MI:SS') BEGIN_TIME, TUNED_UNDORETENTION 
         FROM V$UNDOSTAT
    BEGIN_TIME          TUNED_UNDORETENTION
    ------------------- -------------------
    05/11/2013 18:13:16                3600
    05/11/2013 18:03:16                3600
    05/11/2013 17:53:16                3600
    05/11/2013 17:43:16                3600
    


    Falls der UNDO Platz nicht ausreichend vorhanden ist, werden die DML Operationen trotzdem durchgeführt, und es kann beim Flashback Query zum "Ora-1555 "snapshot too old" Fehler kommen. Gibt man zusätzlich beim Anlegen des UNDO Tablespaces RETENTION GUARANTEE mit, wird im Gegensatz zum Default Verhalten garantiert, dass zugunsten der Vorhaltezeit (UNDO_RETENTION) der Platz reserviert bleibt. DML-Operationen, die den UNDO-Platz benötigen, könnten dann allerdings aus Platzmangel fehlschlagen.

    Im folgenden Beispiel untersuchen wir die Operationen auf der Tabelle DEPT. Versehentlich wurden einige DML-Kommandos durchgeführt, die auch noch mit einem COMMIT abgeschlossen wurden. Der aktuelle Stand der Tabelle sieht folgendermassen aus:
    SQL>SELECT * FROM dept;
    
        DEPTNO DNAME          LOC
    ---------- -------------- -------------
            10 ACCOUNTING     FRANKFURT
            20 RESEARCH       DALLAS
            30 SALES          CHICAGO
            40 OPERATIONS     BOSTON
            50 DEV            STUTTGART
    
    Mit folgender Abfrage kann man sich nun einen "älteren" Stand der Daten ansehen.
    SQL> SELECT * FROM dept AS OF TIMESTAMP to_timestamp('02-02-2012 10:15','dd-mm-yyyy hh24:mi:ss');
    
        DEPTNO DNAME          LOC
    ---------- -------------- -------------
            10 ACCOUNTING     NEW YORK
            20 RESEARCH       DALLAS
            30 SALES          CHICAGO
            40 OPERATIONS     BOSTON
    

    Folgendes Beispiel zeigt die out-of-the-box Implementierung von Flashback Query in APEX (Application Express). Der Anwender kann im Menü "Aktionen" den Menüpunkt "Flashback" auswählen. Danach können die Daten zu einem älteren Zeitpunkt (Angabe in Minuten) abgefragt werden.



  • Flashback Versions Query: Im Unterschied zu Flashback Query werden bei Flashback Versions Query die verschiedenen Versionen einer Zeilen in einem gegebenen Zeitintervall angezeigt. Metadaten der Versionen werden in den Pseudospalten wie VERSIONS_OPERATION und VERSIONS_STARTTIME usw. abgelegt und sind einfach zu selektieren.

    Das Beispiel von oben sieht dann folgendermassen aus.
    SQL> SELECT deptno, dname, versions_operation o, versions_xid, versions_starttime 
         FROM dept VERSIONS BETWEEN TIMESTAMP 
         to_timestamp('02-02-2012 10:13','dd-mm-yyyy hh24:mi:ss') AND 
         to_timestamp('02-02-2012 10:20','dd-mm-yyyy hh24:mi:ss');
    
        DEPTNO DNAME          O VERSIONS_XID     VERSIONS_STARTTIME
    ---------- -------------- - ---------------- ---------------------
            10 ACCOUNTING     U 040014007ADD0000 02-FEB-12 10.18.27 AM
            10 ACCOUNTING
            20 RESEARCH
            30 SALES
            40 OPERATIONS
            60 CONSULTING     D 0A0017002BDF0000 02-FEB-12 10.18.27 AM
            60 CONSULTING     I 0300010075E20000 02-FEB-12 10.18.27 AM
            50 DEV            I 02000800E1DF0000 02-FEB-12 10.18.24 AM
            30 SALES
            40 OPERATIONS
    6 rows selected.
    
  • Flashback Transaction Query: Wie der Name schon andeutet, kann Flashback Transaction Query die Änderungen an den Daten auf Transaktionsebene anzeigen. Dabei wird die Tabelle FLASHBACK_TRANSACTION_QUERY verwendet, die nicht nur Rowids, Operationstypen und Logon User anzeigt, sondern auch die entsprechende Undo SQL Statements der zugehörigen Transaktionen (VERSIONS_XID). So können Transaktionen analysiert und auditiert und darüberhinaus Probleme behoben werden. Das Beispiel von oben kann mit folgender Abfrage erweitert werden.
    SQL> SELECT xid, logon_user,  operation, row_id,  undo_SQL
         FROM flashback_transaction_query
         WHERE xid IN (
         SELECT versions_xid FROM sh.dept VERSIONS BETWEEN TIMESTAMP
         to_timestamp('02-02-2012 10:13','dd-mm-yyyy hh24:mi:ss') AND
         to_timestamp('02-02-2012 10:20','dd-mm-yyyy hh24:mi:ss'))
    
    XID              LOGON_USER      OPERATION    ROW_ID
    ---------------- --------------- ------------ ----------------------
    UNDO_SQL
    ------------------------------------------------------------------------------------
    0A0017002BDF0000 SH              DELETE       AAA18uAAEAAAA6/AAB
    insert into "SH"."DEPT"("DEPTNO","DNAME","LOC") values ('60','CONSULTING','MUNICH');
    
    0A0017002BDF0000 SH              BEGIN
    
    
    0300010075E20000 SH              INSERT       AAA18uAAEAAAA6/AAB
    delete from "SH"."DEPT" where ROWID = 'AAA18uAAEAAAA6/AAB';
    
    0300010075E20000 SH              BEGIN
    
    
    040014007ADD0000 SH              UPDATE       AAA18uAAEAAAA67AAA
    update "SH"."DEPT" set "LOC" = 'NEW YORK' where ROWID = 'AAA18uAAEAAAA67AAA';
    
    040014007ADD0000 SH              BEGIN
    
    
    02000800E1DF0000 SH              INSERT       AAA18uAAEAAAA6/AAA
    delete from "SH"."DEPT" where ROWID = 'AAA18uAAEAAAA6/AAA';
    
    02000800E1DF0000 SH              BEGIN
    
    8 rows selected.
    
    Flashback Transaction Query ist im SQL Developer für Tabellen in Oracle Version 11g implementiert. Im Tabellen-Menü muss einfach nur der Reiter Flashback selektiert werden.



  • Flashback Table: Möchte man alle versehentlich abgesetzten DML-Operationen einer Tabelle "auf einen Schlag" zurücksetzen, eignet sich die Flashback Table Technologie. Flashback Table ermöglicht über ein einziges Kommando das Zurücksetzen einer Tabelle oder mehrere Tabellen auf einen bestimmten Zeitpunkt, der durch eine SCN oder eine bestimmte Zeitangabe (TIMESTAMP) definiert ist. Wichtig zu wissen ist, dass keine DDL Operationen in diesem Zeitraum erfolgt sein dürfen und ROW MOVEMENT für die Tabelle eingeschaltet sein muss.
    SQL> ALTER TABLE dept ENABLE ROW MOVEMENT;
    Table altered.
    
    SQL> FLASHBACK TABLE dept TO TIMESTAMP to_timestamp('02-FEB-2012 10:14','dd-mon-yyyy hh24:mi');
    Flashback complete.
    
    SQL> SELECT * FROM dept;
    
        DEPTNO DNAME          LOC
    ---------- -------------- -------------
            10 ACCOUNTING     NEW YORK
            20 RESEARCH       DALLAS
            30 SALES          CHICAGO
            40 OPERATIONS     BOSTON
    
    
  • Flashback Drop: Hiermit wird das DROP TABLE Kommando rückgängig gemacht. Die Nutzung erfolgt in Verbindung mit dem Recyclebin. In 11g ist der Parameter RECYCLEBIN per Default auf ON gesetzt. Um dieses Feature zu nutzen, sollte diese Einstellung beibehalten werden. Bei einem DROP TABLE Kommando werden automatisch die Tabellen und zugehörige Objekte wie Indizes, Constraints (ausser referentielle Integrität) und nested tables im sogenannten Recyclebin zur Verfügung gestellt. Dies führt keineswegs zu Performance-Einbussen, da ein einfaches Umbenennen der zugehörigen Objekte und kein explizites Kopieren in einen neuen Bereich erfolgt. Somit ist auch klar, dass im Gegensatz zu den oben genannten Flashback Funktionalitäten Flashback Drop nicht von der UNDO Retention Zeit abhängig ist, sondern vom verfügbaren Platz im Tablespace. Die Extents der gelöschten Tabelle werden nur als gelöscht markiert und erst dann überschrieben, wenn der Platz im Tablespace dies erfordert.
    SQL> show parameter recyclebin
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ---------------------
    recyclebin                           string      on
    
    SQL> SELECT object_name, original_name, type, droptime 
         FROM user_recyclebin;
    
    OBJECT_NAME                    ORIGINAL_NAME
    ------------------------------ --------------------------------
    TYPE                      DROPTIME
    ------------------------- -------------------
    BIN$t/kXbz50fOzgQ5j0pQq5SA==$0 DEPT
    TABLE                     2012-02-02:10:47:59
    
    SQL> FLASHBACK TABLE "BIN$t/kXbz50fOzgQ5j0pQq5SA==$0" TO BEFORE DROP RENAME TO dept;
    Flashback complete.
    
    SQL> SELECT * FROM dept;
    
        DEPTNO DNAME          LOC
    ---------- -------------- -------------
            10 ACCOUNTING     NEW YORK
            20 RESEARCH       DALLAS
            30 SALES          CHICAGO
            40 OPERATIONS     BOSTON
    
    Hinweis: Möchte man die Objekte vollständig aus dem Recyclebin löschen, kann man dies mit PURGE RECYCLEBIN oder mit PURGE DBA_RECYCLEBIN für alle Objekte manuell erreichen.

    Flashback Drop bzw. Flashback Table sind übrigens auch über den Enterprise Manager verwendbar. Unter "High Availability => Perform Backup" finden sich die Operationstypen "Flashback Existing Tables" für die Flashback Table und "Flashback Dropped Tables" für die Flashback Drop Operationen.



  • Flashback Transaction: Diese Technologie ist erst in 11g eingeführt worden. Die Idee ist, Transaktionen in ihrer Gesamtheit, d.h. zusammen mit den zugehörigen abhängigen Transaktionen, mit einem einzigen Kommando zurückzusetzen. Flashback Transaction ist im laufenden Datenbankbetrieb ausführbar. Notwendig ist allerdings das Einschalten von Supplemental Logging und der Archive Log Mode. Ab 11g ist ein minimales Supplemental Logging als Default für neuangelegte Datenbanken eingeschaltet. Um die Rückführung aller abhängigen Transaktionen sicherzustellen, sollte auch noch das Primary und Foreign Key Supplemental Logging eingeschaltet werden.
    SQL> SELECT supplemental_log_data_fk, supplemental_log_data_pk, supplemental_log_data_min 
         FROM v$database;
    
    SUP SUP SUPPLEME
    --- --- --------
    YES YES YES
    
    SQL> archive log list
    Database log mode              Archive Mode
    Automatic archival             Enabled
    Archive destination            USE_DB_RECOVERY_FILE_DEST
    Oldest online log sequence     4881
    Next log sequence to archive   4883
    Current log sequence           4883
    
    Zur Durchführung wird das Package DBMS_FLASHBACK verwendet. Als Eingabeparameter werden die Transaktionen bzw. die zugehörigen XIDs (Transaction Identifiers) benötigt, die zurückgesetzt werden sollen. Die abhängigen Transaktionen werden dabei automatisch ermittelt und gleichermassen zurückgeführt. Die XIDs der Transaktionen können, wie schon im oberen Abschnitt erläutert, über die Pseudospalte VERSIONS_XID ermittelt werden (siehe Flashback Query).
    SQL> SELECT deptno, dname, versions_operation o, versions_xid, versions_starttime
         FROM sh.dept
         VERSIONS BETWEEN TIMESTAMP 
         to_timestamp('02-02-2012 11:05','dd-mm-yyyy hh24:mi:ss') AND
         to_timestamp('02-02-2012 11:11','dd-mm-yyyy hh24:mi:ss');
    
        DEPTNO DNAME          O VERSIONS_XID     VERSIONS_STARTTIME
    ---------- -------------- - ---------------- ---------------------
            10 ACCOUNTING     U 06001500AFDE0000 02-FEB-12 11.10.16 AM
            10 ACCOUNTING
            20 RESEARCH
            30 SALES
            40 OPERATIONS
    
    SQL> execute DBMS_FLASHBACK.TRANSACTION_BACKOUT(NUMTXNS=>1, XIDS=>XID_ARRAY('06001500AFDE0000'));
    PL/SQL procedure successfully completed.
    
    Ein zusätzlicher Parameter OPTIONS gibt vor, wie mit den abhängigen Transaktionen verfahren werden soll. Der Default ist NOCASCADE. Genauere Informationen dazu finden sich im Oracle Database PL/SQL Packages and Types Reference Handbuch. TRANSACTION_BACKOUT schliesst übrigens die DML Operationen nicht mit COMMIT ab. Dies muss noch nachträglich durchgeführt werden.

    Auch hier kann die Nutzung von Enterprise Manager zur Vereinfachung beitragen. Über den Reiter "Availability" => "Backup&Recovery" => "Transactions" wird die Logminersicht aktiviert, die im Hintergrund beim Flashback Transaction genutzt wird. Danach kann die betroffene Transaktion ausgewählt und das Zurücksetzen über die graphische Oberfläche durchgeführt werden. Da Flashback Transaction Query die Logminer-Technologie verwendet, gelten für die Flashback Transaction Funktionalität die gleichen Einschränkungen wie für den Logminer.



  • Flashback Database: Muss die gesamte Datenbank zurückgesetzt werden, da Operationen wie DROP USER, TRUNCATE usw. versehentlich durchgeführt wurden, kann die Flashback Database Technik zum Einsatz kommen. Das Konzept des Flashback Database, eine Art "Rewind Button" der Datenbank, führt ähnlich wie das Point-In-Time-Recovery, die Datenbank in einen konsistenten Zustand in der Vergangenheit zurück. Diese Operation ist sehr schnell, da kein Restore eines Backups wie beim normalen Recovery erforderlich ist. Notwendig für die Nutzung ist der Archivelog Mode und zusätzlich auch ein spezieller Flashbacklog Mode. Um den Rahmen dieses Beitrags nicht zu sprengen, werden wir dieses Thema in einem späteren Beitrag umfassend erklären.
  • Flashback Data Archive : Diese Technologie steht ab 11g zur Verfügung und liefert einen Mechanismus zum lückenlosen Aufbewahren von Datensätzen über eine festgelegte Frist. Diese Frist kann im Unterschied zum Flashback Query beliebig lang sein zum Beispiel auch eine Zeitspanne über Jahre umfassen - im Extremfall über den gesamten Lebenszyklus. Sinnvoll ist dieses Feature, um Compliance zu gewährleisten oder Auditings durchzuführen. Wer mehr darüber erfahren möchte, kann im Tipp Flashback Data Archives: Das perfekte Gedächtnis der Datenbank die notwendigen Details erfahren.
Konfiguration und Implementierung
Wichtig zu wissen ist, dass die einzelnen Technologien unterschiedlich implementiert sind und somit ein unterschiedliches Setup benötigen. So werden je nach Feature, Undo Informationen, Archive Log, Supplemental Log, Flashback Log oder Recyclebin Informationen benötigt. Folgende Tabelle fasst die notwendigen Konfigurationsparameter pro Technologie zusammen:

TechnologieKonfiguration
Flashback Queryautomatisches UNDO Management
Flashback Versions Queryautomatisches UNDO Management
Flashback Transaction Queryautomatisches UNDO Management und Supplemental Logging
Flashback Tableautomatisches UNDO Management und Table Row Movement
Flashback DropInitialisierungsparameter RECYCLEBIN (ab 11g)
Flashback TransactionArchive Log und Supplemental Logging
Flashback DatabaseArchive Log und Flashback Log Mode
Flashback Data ArchiveFlashback Archive


Lizenzhinweis
Flashback Table, Flashback Database, Flashback Transaction und Flashback Transaction Query stehen in der Enterprise Edition zur Verfügung. Ursprünglich waren die Archive als eigenständige Option zur Enterprise Edition der Oracle Database 11g unter dem Namen Total Recall eingeführt wurden - was übersetzt so viel heißt wie 'das perfekte Gedächtnis'. Seit Ende Juni 2012 sind sie Teil der Advanced Compression Option der Enterprise Edition (EE). Flashback Query bzw. Flashback Versions Query und Flashback Drop hingegen stehen in allen Editionen ohne zusätzliche Lizenzierung zur Verfügung.

Weitere Informationen
Folgende Links können nützlich sein: Mehr zu diesem Thema bzw. zu weiteren Themen rund um die Datenbank lesen Sie in den nächsten Ausgaben ...

Zurück zur Community-Seite