Oracle 10g Flashback
Transcription
Oracle 10g Flashback
A.Held / Deutsche Post ITSolutions Oracle Flashback – Der Rewind-Button für die Datenbank Wer kennt Sie nicht, die Benutzer, die angeblich „nichts gemacht“ haben, und denen es beim vorgeblichen Nichts-Tun gelang, den ganzen Datenbestand zu demolieren? Administratoren und Entwickler machen sich recht gerne lustig über sogenannte DAUs. Beim Lachen über andere lässt sich ja so schön vergessen, dass man selbst vielleicht auch schon versehentlich in der Produktion und nicht – wie geplant – in der Testumgebung Tabellen oder ganze Benutzer entfernt hat. Doch was tun, wenn das Kind in den Brunnen gefallen ist? Oracle bietet in Form der neuen Flashback-Technologie ganz hervorragende Möglichkeiten, die eine Wiederherstellung um ein Vielfaches beschleunigen können. Human Error Correction ist das Thema, auf das Oracle mit einigen neuen Features zielt. Menschliche Fehler sind tatsächlich eine der häufigsten Ursachen für Systemausfälle. Einer Studie von Gartner zufolge fallen 32% der Downtimes in diese Fehlerkategorie. Oracle will hier Abhilfe schaffen und hat mit der neuen Version 10g eine Restore Möglichkeit geschaffen, die kein anderes DBMS derzeit in diesem Umfang beherrscht. Flashback heißt die neue Technologie, die uns allen das Leben leichter machen soll. Sie reduziert die Recovery Time von Stunden auf wenige Minuten. Da nicht alles Gold ist, was glänzt, haben wir diese neuen Fähigkeiten etwas genauer unter die Lupe genommen. Generell zielt Flashback auf Benutzerfehler. Hat ein Benutzer versehentlich Daten gelöscht oder in unbeabsichtigter Weise verändert, so gab es früher nur eine Möglichkeit: Die Datenbank musste in solchen Fällen mit einem Backup wiederhergestellt werden, um anschließend alle Transaktionen bis zum Zeitpunkt unmittelbar vor dem Benutzerfehler mittels Transaktonslogs nachzufahren. Insbesondere bei einer großen Datenbank kann dieses Vorgehen ausgesprochen zeitaufwendig sein. Zudem sind alle Datenänderungen, die Transaktionen nach dem Benutzerfehler betreffen, verloren. Flashback bietet für diese Problemstellung erweiterte Möglichkeiten an, die allesamt - je nach Geschmack entweder durch die intuitive Benutzerführung des Oracle Verwaltungstools EM 10g (Enterprise Manager 10g Database Control) oder aber über eine SQL Schnittstelle wie Oracles SQL*Plus durchgeführt werden können. Generell gibt es unter Oracle drei Level des Flashbacks: • • • Flashback Query und Flashback Table Flashback Drop Flashback Database Architektur, Implementierung und Funktionalität dieser Level ist jeweils etwas unterschiedlich. Alle drei Möglichkeiten lassen sich jederzeit in ein und derselben Datenbank anwenden. Undo Tablespace und Änderungshistorie Bereits in Oracle 9 wurde Flashback Query eingeführt. Flashback Query erlaubt die konsistente Abfrage eines Datenbestandes zu verschiedenen historischen Zeitpunkten. Hintergrund ist folgender: Auch wenn Änderungen bereits mit einem Commit bestätigt wurden, bewahrt Oracle die ursprünglichen Daten in Form von Before-Images noch einige Zeit auf. Wie lange diese Historie dann noch zur Verfügung steht, hängt vom Transkationsaufkommen, aber auch von der Größe des Undo Tablespaces ab. Der Undo Tablespace ist einigen sicherlich aus einem ähnlichen Kontext bekannt: Er stellt den Speicherplatz bereit, in dem vor der Änderung eines Datensatzes eine Sicherungskopie abgelegt wird. Diese wird normalerweise genutzt, um im Fall des Befehls Rollback die Oracle 10g Flashback Seite 1 A.Held / Deutsche Post ITSolutions Änderungen wieder rückgängig machen zu können. Bislang wurden diese Before-Images aber nach einer Bestätigung der Änderungen durch einen Commit-Befehl zum Überschreiben freigegeben. Damit waren diese Sicherungskopien verloren. Oracle 10g nutzt diesen Undo-Speicherbereich nun, um Änderungen auch nach einem Commit noch einsehen und – falls gewünscht – auch wieder rückgängig machen zu können. Allerdings ist dies nur für einen begrenzten Zeitraum möglich: Ist der Undo-Tablespace irgendwann einmal voll, so werden die ältesten Before Images wieder beschrieben. Nach einiger Zeit sind also jeweils jene Daten, deren Änderung am längsten her ist, verloren. Die Größe des Zeitraumes, für den die Änderungshistorie zur Verfügung steht, hängt von der Größe des UndoBereiches ab. Dieser kann frei konfiguriert werden. Hat man also ausreichend Plattenplatz, so kann man bei Bedarf durchaus auch einen Undo Bereich von 8 GB oder größer wählen. Erstellung und Konfiguration eines Undo Tablespaces sind nebenstehend im Textkasten beschrieben. Der Undo Tablespace ist also eine Art Ringspeicher für Before Images bei Datenänderungen: • Solange noch freier Speicherplatz vorhanden ist, wird dieser beschrieben. • Ist der gesamte Undo-Bereich gefüllt, wird mit dem beschreiben sozusagen wieder „von Vorne“ begonnen. Dabei werden die ältesten Bereiche überspeichert. Möchte man die Erhaltung der Before Images für einen bestimmten Mindestzeitraum garantieren, kann der Datenbankparameter UNDO_RETENTION eingesetzt werden. Er gibt den Zeitraum in Sekunden an, für den Before Images im Undo Tablespace gehalten werden. Neu in Oracle 10g ist die Möglichkeit einer Retention Guarantee. Wurde ein Undo Tablespace mit dieser Option belegt, wird die Retention Time in jedem Fall eingehalten, auch dann wenn ein DML Statement im Zweifelsfall mangels Speicherplatz nicht durchgeführt werden kann. Einsatz von Flashback Query Flashback Query lässt sich mit einigen ganz einfachen Mitteln einsetzen. Dabei wird in einer Abfrage einfach nur angegeben, auf welchen Zeitpunkt man zurückgreifen möchte. Ein Beispiel: Montag, der 02.03.2004 kurz vor der Mittagspause. Herr Müller aus der Personabteilung ruft an. Herr Müller berichtet, er habe ganz sicher gar nichts gemacht. Dennoch sei – wie er feststellen musste - die Abteilung mit der Abteilungsnummer 50 plötzlich und gänzlich ohne sein Zutun aus dem Datenbestand einer Oracle Datenbank verschwunden ist. Werfen wir einen Blick in die betreffende Datenbank. Hierzu kann der graphische Enterprise Manager oder aber – wie im folgenden Beispiel - SQL*Plus genutzt werden. Wir setzen also ein Select Statement mit SQL*Plus auf die Department-Tabelle [dept], in der die Datensätze der Abteilungen gespeichert sind, ab: SQL> SELECT * FROM dept; ABTNR ----10 20 30 40 DNAME -----------ACCOUNTING RESEARCH SALES OPERATIONS LOC --------------- ------------NEW YORK DALLAS CHICAGO BOSTON Wir stellen fest: Herr Müller hat recht. Hier gibt es aktuell wirklich keine Abteilung mit der Nummer 50. Betreiben wir ein wenig Forschung: Wie sah der Datenbestand denn am 02.03.2004 um 07:00 Uhr in der Frühe aus? SQL> SELECT * FROM dept 3> AS OF TIMESTAMP 2> to_timestamp('02-03-2004 07:00:00','dd-mm-yyyy hh24:mi:ss'); DEPTNO DNAME -----------10 ACCOUNTING 20 RESEARCH 30 SALES Oracle 10g Flashback LOC --------------- ------------NEW YORK DALLAS CHICAGO Seite 2 A.Held / Deutsche Post ITSolutions 40 OPERATIONS BOSTON 50 IT FRANKFURT Aha! Da sind wir doch schon einen Schritt weiter: Morgens um 7 war die Abteilung 50 also noch vorhanden. Das obenstehende Beispiel zeigt, wie die Syntax von Flashback Query eingesetzt werden kann: 1. Abfragetext in SQL formulieren und 2. zusätzlich den historischen Zeitpunkt, zu dem der Datenbestand angezeigt werden soll, mit der Syntax AS OF TIMESTAMP angeben. Möchte man jetzt herausfinden, wie sich der Datensatz über den Tag verändert hat oder aber wann er genau gelöscht wurde, so kann man mit der Syntax VERSIONS BETWEEN alle Versionen innerhalb des angegebenen Zeitraumes inklusive sämtlicher Änderungen ausgeben lassen: SQL> SELECT deptno, dname, loc, versions_operation, versions_xid, versions_starttime FROM scott.dept VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE ORDER BY deptno, versions_starttime DEPTNO DNAME ---------- -------------10 ACCOUNTING 20 RESEARCH 30 SALES 40 OPERATIONS 50 IT 50 MARKETING 50 50 8 Zeilen ausgewählt LOC ------------NEW YORK DALLAS CHICAGO BOSTON FRANKFURT FRANKFURT FRANKFURT FRANKFURT V VERSIONS_XID VERSIONS_STARTTIME - ---------------- -------------------------- U 1E000A0008000000 02.03.04 09:30:02 U 1E000B0008000000 02.03.04 09:31:15 D 1E000C0008000000 02.03.04 09:32:20 Und siehe da, der Datensatz wurde zunächst um 09:30 Uhr und 2 Sekunden geändert. In Zeile 5 stand in der Spalte [dname] noch der Wert „IT“. Zu diesem Zeitpunkt wurde der Name der Abteilung von „IT“ auf „Marketing“ geändert. Erkennbar ist dies in Zeile 6. Hier steht in der Spalte [versions_operation] ein U wie Update und als neuer Wert der Spalte [dname] der Begriff „MARKETING“, während in Zeile 5 noch „IT“ zu finden war. Um 09:31 und 15 Sekunden erfolgte das nächste Update: Wieder enthält die Spalte [versions_operation] ein U für Update, der Wert der Spalte [dname] ist nun leer. Die letzte Änderung stammt dann von 09:32 Uhr und 20 Sekunden. Hier wurde der Satz gelöscht. Erkennbar ist dies wieder in der Spalte [versions_operations] am Flag D, das für Delete steht. Datenbank mit Rückwärtsgang In der letzten Abfrage werden mehrere Pseudo Columns angesprochen: [versions_operation], [versions_xid] und [versions_starttime]. Diese Spalten sind nicht physisch in der Tabelle in Form von Spalteninhalten gespeichert. Vielmehr erhalten wir durch sie zusätzliche Informationen, die aus dem internen Data Dictionary der Datenbank stammen. Die Pseudo-Spalte [versions_operation] gibt Auskunft über die Operation, die ausgeführt wurde: I für Insert, U für Update, D für Delete. Unter [versions_xid ] finden wir die interne Transaktionsnummer innerhalb der Datenbank. Diese werden wir gleich noch benötigen. Unter [versions_starttime] ist der Zeitpunkt zu verstehen, ab dem diese Änderung gültig wurde. Dabei handelt es sich um den Zeitpunkt, zu dem die Änderung mit Commit bestätigt wurde. In unserem Beispiel kann durch Nutzung der zuvor ermittelten Transaktions-ID aus der Spalte [versions_xid] das UNDO- Statement gefunden werden, um die Veränderungen an der Tabelle [dept] wieder rückgängig zu machen. Über die Pseudo-Spalte [VERSIONS_XID] in der oben genannten Flashback Query konnten wir die Transaktions-ID ermitteln. Die Datenbank-View [flashback_transaction_query] liefert Oracle 10g Flashback Seite 3 A.Held / Deutsche Post ITSolutions Informationen über das UNDO-SQL Statement, das zur Transaktion mit der ID '1E000C0008000000' gehört: SQL> SELECT logon_user, table_name, table_owner, undo_sql FROM flashback_transaction_query WHERE table_owner='SCOTT' -- xid = Transaktions-ID AND xid= '1E000C0008000000'; LOGON_USER TABLE_NAME TABLE_OWNER UNDO_SQL -----------------------------------------------------------SMUELLER DEPT SCOTT insert into "SCOTT"."DEPT"("DEPTNO","DNAME","LOC") values ('50','UUuuups','Frankfurt'); Die Ergebnisse der Abfrage geben Auskunft über den Logon-User, die betreffende Tabelle und deren Besitzer sowie das Undo SQL Statement zum Rückgängig-Machen der Transaktion. Wer die Augen nicht vor der Spalte Logon-User verschließt, der wird bemerken, dass ein als SMUELLER angemeldeter Benutzer die Transaktion zum Löschen des Datensatzes durchgeführt hatte. Das klingt doch sehr nach Herrn Müller aus der Personalabteilung. Aber das behalten wir schmunzelnd einfach für uns! Betrachtet man das Insert Statement aus der Spalte [undo_sql], so fällt auf, dass hier nur das Delete der Zeile, dass durch die letzte Transaktion abgesetzt wurde, rückgängig gemacht wird. Möchte man tatsächlich auf den ursprünglichen Stand von heute früh zurück, so muss man einfach alle undo_sql Statements in umgekehrter zeitlicher Reihenfolge (also immer das letzte zuerst), verwenden, um die Änderungen schrittweise wieder rückgängig zu machen. SQL> 1 2 3 4 5* SELECT FROM WHERE AND ORDER BY undo_sql flashback_transaction_query table_owner = 'SCOTT' table_name = 'DEPT' commit_timestamp desc UNDO_SQL -------------------------------------------------------------------------------insert into "SCOTT"."DEPT"("DEPTNO","DNAME","LOC") values ('50','UUuuups','Frankfurt'); update "SCOTT"."DEPT" set "DNAME" = 'MARKETING' where ROWID = 'AAALy6AAEAAAAAOAAA'; update "SCOTT"."DEPT" set "DNAME" = 'IT' where ROWID = 'AAALy6AAEAAAAAOAAA'; Sehr viel leichter lassen sich solche Änderungen mit dem Enterprise Manager 10g vornehmen. Hier kann man sich durch ein graphisches Werkzeug gestützt durch die Masken des Flashback hangeln und mit einem Mausklick einen Datensatz wiederherstellen. Auch wenn das Vorgehen mit dem EM 10g sehr viel bequemer ist, sollte man doch die Hintergründe verstanden haben. In schweren Problemfällen macht einem dies das Finden einer Lösung sehr viel einfacher machen. Im Vergleich zur Flashback Table- Technologie, die wir gleich noch kennenlernen werden, stellt diese Technik eine Alternative bei versehentlich oder fehlerhaften Änderungen an einzelnen Tabellendaten dar. Neben dem Zeitpunkt via „AS OF TIMESTAMP“ oder „VERSIONS BETWEEN“ kann auch die Oracle System Change Number verwendet werden. Diese ist sehr viel genauer als ein Timestamp. Die System Change Number (auch als SCN bezeichnet) ist ein interner Abbildung 1: Recovery gelöschter Tabellen im EM 10g Oracle 10g Flashback Seite 4 A.Held / Deutsche Post ITSolutions Transaktionszähler und vergleichbar einer Auftragsnummer in einem Auftragsbearbeitungssystem. Durch jede Bestätigung einer Datenänderung durch ein Commit einer Transaktion wird intern in der Datenbank eine eindeutige System Change Number hochgezählt. Diese wird in den Transaktionsprotokollen - unter Oracle sind das die “Redo Logs” – aber auch im Header aller Datenbankfiles verzeichnet. Die SCN hat während einer Datenbankrecovery, aber auch im Kontext von Lesekonsistenz eine zentrale Bedeutung. Diese eindeutige Transaktionsnummer kann in der folgenden Syntax verwendet werden: SELECT deptno, dept, dname FROM scott.dept VERSIONS BETWEEN SCN minvalues AND maxvalue WHERE deptno = 50; Man kann mit dieser Syntax entweder eine feste SCN verwenden oder minvalue und maxvalue als Variable eingesetzen. minvalue zeigt das älteste Before-Image, das für diesen Datensatz noch im UNDO-Tablespace vorhanden ist. Bei maxvalue handelt es sich um die letzte Änderung. Die Syntax mit „VERSIONS BETWEEN SCN minvalue AND maxvalue“ zeigt also alle noch im UNDO Bereich gespeicherten Variationen aller vom SQL Statement betroffenen Datensätze an. Alternativ kann auch eine einzelne SCN benannt werden. Zurücksetzen ganzer Tabellen Wir haben im obigen Beispiel die Datenmanipulation eines einzelnen Datensatzes verfolgt und konnten diese bei Bedarf über ein Undo SQL wieder in den ursprünglichen Zustand zurücksetzen. Wurden in einer Tabelle sehr viele Sätze verändert, ist es unter Umständen leichter, die gesamte Tabelle zurückzusetzen. Oracle stellt hierfür die folgende Syntax bereit: FLASHBACK TABLE dept TO TIMESTAMP to_timestamp('02.03.2004 09:30'); Dies birgt jedoch einige Gefahren in Bezug auf Datenkonsistenz: Wurden in der Mitarbeitertabelle alle Mitarbeiter der Abteilung 50 sowie in der Abteilungstabelle die Abteilung mit der Nummer 50 gelöscht, erhält man beim alleinigen Zurücksetzen der Mitarbeitertabelle inkonsistente Daten. In solchen Fällen müssen immer alle voneinander abhängigen Tabellen synchron zurückgesetzt werden. Im letzten Beispiel wären also beide Tabellen zu reseten: Mitarbeiter- und Abteilungstabelle. Flashback Query und Flashback Table sind wunderbar für das Monitoring bzw. zum Widerherstellen veränderter und gelöschter Datenbestände geeignet. Was aber, wenn jemand versehentlich eine ganze Tabelle gelöscht hat? Flashback Query funktioniert nur, wenn an der betreffenden Tabelle keine Strukturänderungen vorgenommen wurden. Wurde eine ganze Tabelle mit einem DROP TABLE Statement gelöscht, funktioniert Flashback Query also nicht mehr! Gelöschte Tabellen wiederherstellen Wird eine Tabelle gelöscht, so war diese bis Version 9i unwiederbringlich verloren. Einzige Möglichkeit war die relativ aufwendige Wiederherstellung aus einem validen Backup. Mit dem neuen Release 10g haben die Oracle Entwickler eine ebenso einfache wie hilfreiche Erweiterung des Flashback einbezogen: Flashback Table. Statt die Tabelle „hart“ zu löschen, wird sie intern in den Recycle Bin verschoben. Das geht – unabhängig von der Größe der zu löschenden Tabelle - unglaublich schnell, da intern nur ein paar geringfügige Änderung im Data Dictionary der Datenbank vorgenommen werden. Das Konzept ist nicht neu. Im Grunde handelt es sich um einen ganz ähnlichen Vorgang wie die Nutzung des Papierkorbs unter Windows. Ein Beispiel: DROP TABLE dept CASCADE CONSTRAINTS; Oracle 10g Flashback Seite 5 A.Held / Deutsche Post ITSolutions Mit diesem Befehl wird die Tabelle [dept] gelöscht. Die Option CASCADE CONSTRAINTS bewirkt, dass dabei auch nicht auf referenzielle Integrität Rücksicht genommen wird. Stattdessen werden Foreign Key Constraints, soweit betroffen, gleich mit gelöscht. Schwupps, ist die Tabelle weg. Oracle 10g Flashback Seite 6 A.Held / Deutsche Post ITSolutions Mit dem folgenden Befehl lässt sich die Tabelle wieder herstellen: FLASHBACK TABLE dept to BEFORE DROP; Und schon ist die Tabelle wieder da. Eine Warnung noch: Obwohl die Wiederherstellung so leicht und schnell funktioniert, sollte man Tests mit dem Undrop natürlich nur in Testumgebungen durchführen. Auch Objekte des Recycle Bin bleiben dort nicht beliebig lange bestehen. Bei einer Reorganisation, einer Größenänderung des Tablespaces oder auch dann, wenn die Speicherbegrenzung des Benutzers überschritten würde, wird der Recycle Bin entleert. Darüber hinaus gibt es noch den Purge Befehl, der ein Objekt gezielt aus dem Recycle Bin entfernt. Zwei Beispiele zum „Purgen“: DROP TABLE dept PURGE; -- Löscht die Tabelle endgültig PURGE RECYCLEBIN; -- Leert den Recycle Bin Den Inhalt des Recycle Bin kann man sich in SQL*Plus auch mit dem Befehl show recyclebin ausgeben lassen: SQL> show recyclebin ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME ---------------- ------------------------------ ------------ ------------------DEPT RB$$48444$TABLE$0 TABLE 2004-03-02 10:29:40 Noch ein Hinweis für versierte DBAs: Möchte man sehen, welche Daten derzeit im Recycle Bin vorliegen, kann die Data Dictionary View [dba_recyclebin] bzw. [user_recyclebin] abgefragt werden. Hier sind alle Informationen über Objektnamen, Typen und Löschzeitpunkt zu finden. Die Handhabung im EM 10g ist natürlich viel einfacher, als das mühselige Werkeln mit Scripten und SQL Befehlen. Zurücksetzen ganzer Datenbanken Manchmal genügt es nicht, einzelne Tabellen zurückzusetzen. Hier bietet Flashback Database Hilfe. Flashback Database ist sicherlich die weitaus mächtigste Möglichkeit des Flashback. Hiermit wird die gesamte Datenbank in einen historischen Zustand zurückgefahren. Dies betrifft alle Objekte eines jeden Users dieser Datenbank. Auf einzelne Benutzer lässt sich diese Form des Zurücksetzens leider nicht beschränken. Das Ergebnis entspricht dem eines konventionellen Point-in-Time Recovery. Doch der Vorgang an sich ist weit weniger kompliziert und benötigt wesentlich weniger Zeit. Damit ein Flashback der gesamten Datenbank überhaupt möglich ist, sind ein paar Voreinstellungen notwendig. So muss die Datenbank im sogenannten Archivelog Mode betrieben werden. In diesem Modus werden Abbildung 2: Konfiguration des Flashback Recovery Area im DBCA Transaktionslogs der Datenbank, die Online Redo Logs, in ein Archivierungsziel weggesichert bevor sie neu überschrieben werden. Diese archivierten Transaktionslogs werden im Fall eines Flashback Database benötigt. Weiterhin muss die Datenbank auf flashback on geschaltet worden sein. Scripte zum Umstellen können unter www.itc-frankfurt.de/download/scripte heruntergeladen werden. Der Befehl zum eigentlichen Zurücksetzen ist dann denkbar einfach: Er lautet einfach FLASHBACK DATABASE. Allerdings lässt sich dieser Befehl nur im Mount Zustand der Datenbank absetzen. Oracle 10g Flashback Seite 7 A.Held / Deutsche Post ITSolutions Hier ein Beispiel: -- Herunterfahren der Datenbank SHUTDOWN IMMEDIATE; -- Hochfahren in den Mount Modus STARTUP MOUNT; -- Flashback absetzen FLASHBACK DATABASE TO TIMESTAMP to_timestamp ('02.03.2004 09:30:00'); -- Datenbank öffnen ALTER DATABASE OPEN RESETLOGS; Abschließend muss die Datenbank mit einem Reset der Redo Logs geöffnet werden. Sie befindet sich dann mit allen Daten sämtlicher Datenbankbenutzer auf dem Stand des im Flashback Befehl angegebenen Zeitpunktes, im Beispiel also auf 09:30 Uhr und 0 Sekunden. Möchte man vor dem Reset sichergehen, dass man auch tatsächlich den richtigen Zeitpunkt gewählt hat und der Datenbestand den Erwartungen entspricht, kann man die Datenbank zunächst auch im Read Only Modus öffnen und durch einige Abfragen den korrekten Status verifzieren. Man sieht, die Handhabung der verschiedenen Flashback Möglichkeiten ist recht einfach. Logische Fehler, die durch Benutzerfehler, fehlerhafte Software oder ungewollte Administrationskommandos entstanden sind, können mit Flashback in kürzester Zeit und ohne längere Ausfallzeiten behoben werden. Trotzdem sollte man nicht leichtsinnig werden. Ein Flashback bedeutet häufig Datenverlust, da Transaktionen, die nach dem Flashbackzeitpunkt erfolgten, ebenfalls zurückgerollt werden. Zusammenfassung Generell zielt Flashback auf Benutzerfehler. Hat ein Benutzer versehentlich Daten gelöscht oder in unbeabsichtigter Weise verändert, so gab es früher nur eine Möglichkeit: Die oft aufwendige Wiederherstellung über Backup. Mit Flashback können geänderte oder gelöschte Daten entweder mit SQL Befehlen oder aber über den intuitiv bedienbaren Enterprise Manager 10g Database Control (kurz EM 10g) wiederhergestellt werden. Flashback funktionierte bereits in der 10g Beta recht zuverlässig und deckt alle wesentlichen logischen Fehlertypen ab. Nur die View [flashback_transaction_query] zeigt noch einige Fehler: Die Abfrage der View dauert unverhältnismäßig lang, Updates werden gelegentlich nicht angezeigt. Bei letzterem Fehler scheint es sich um einen Beta Bug zu handeln. Dieser lässt sich auf Windows Plattformen in der Beta-Version reproduzieren, tritt jedoch in den bereits veröffentlichten Releases unter Solaris und HPUX nicht auf. Generell gibt es unter Oracle 10g drei Level des Flashbacks: • • • Flashback Query gab es bereits in Oracle 9i und wurde in 10g auf Flashback Table erweitert, Flashback Drop steht ab 10g zur Verfügung, Flashback Database wurde ebenfalls mit Oracle 10g eingeführt. Alle drei Möglichkeiten lassen sich jederzeit in ein und derselben Datenbank anwenden. Architektur, Implementierung und Funktionalität dieser Level ist jeweils etwas unterschiedlich. Flashback Query und Flashback Table nutzen den Undo Tablespace, Flashback Drop den Recycle Bin und Flashback Database verwendet archivierte Redo Logs und Flashback Logs. Oracle 10g Flashback Seite 8 A.Held / Deutsche Post ITSolutions Anhang A: Automatisches Undo Management Der Undo Tablespace speichert sogenannte Before Images. Diese Before Images werden als Undo Informationen für das Zurückrollen einer Transaktion durch den Befehl Rollback verwendet. Oracle hat die Undo Funktion nun dazu genutzt, Abfragen zu historischen Zuständen von Datensätzen durchzuführen und Änderungen rückgängig zu machen, die bereits mit einem Commit in der Datenbank festgeschrieben wurden. Sollte in einer Oracle Datenbank noch der Vorläufer des Undo-Tablespaces (sogenannte Rollback Segmente) verwendet werden, empfiehlt es sich, auf das modernere Automatic Undo Management umzusteigen. Hierzu muss zunächst ein Undo Tablespace erstellt werden. Ein Beispiel: CREATE UNDO TABLESPACE undotbs DATAFILE '/u01/oracle/rbdb1/undo0201.dbf' SIZE 2000M REUSE AUTOEXTEND OFF; Danach sollten einige Parameter der Oracle Datenbank geändert werden: UNDO_MANAGEMENT: Auf AUTO setzen UNDO_TABLESPACE: Name des UNDO Tablespaces UNDO_RETENTION: Anzahl Sekunden, für die der UNDO Tablespace die Before Images aufbewahrt Bei Nutzung des neuen SPFILEs zur Konfiguration, können diese Parameter folgendermaßen geändert werden: -- Ändern des Management Typs ALTER SYSTEM SET UNDO_MANAGEMENT = AUTO SCOPE=SPFILE; -- Einstellen des Tablespaces, -- der für Undo verwendet werden soll ALTER SYSTEM SET UNDO_TABLESPACE = 'undotbs' SCOPE=SPFILE; -- Einstellen des Zeitraumes, -- für den Before Images aufbewahrt -- werden sollen ALTER SYSTEM SET UNDO_ RETENTION = 18000 SCOPE=SPFILE; Diese Befehle werden mit einem SQL-Interface wie z.B. SQL*Plus abgesetzt. Sollte bei der eben genannten Syntax der Fehler ”ORA-32001: Schreiben in SPFILE angefordert, beim Hochfahren jedoch keine SPFILE angegeben“ auftauchen, so wird noch das etwas veraltete Ascii Parameter File verwendet. In diesem Fall kann man die obigen Parameter in der entsprechenden init.ora einfügen bzw. ändern. Alternativ kann einfach auf SPFile umgestellt werden: CREATE SPFILE FROM PFILE; Hierdurch wird aus der vorhandenen Init.ora ein SPFile erzeugt, dass zukünftig beim Hochfahren der Datenbank zieht. Danach können oben genannte Befehle erfolgreich abgesetzt werden. Generell ziehen einiger dieser Änderungen erst nach Restart der Instanz, da Parameter wie UNDO_MANAGENT nicht dynamisch (also zur Laufzeit) geändert werden können. Oracle 10g Flashback Seite 9 A.Held / Deutsche Post ITSolutions Anhang B: Flashback- Parameter und Befehlsübersicht Typ Architektur Flashback Undo Management Query / Row History DB Parameter Informationen Befehle UNDO_MANAGEMENT=AUTO UNDO_RETENTION=<Sekunden> UNDO_TABLESPACE=<undo_ts_name> Undo Parameter in SQL*Plus abfragen: Erstellen eines Undo Tablespaces: SHOW PARAMETER UNDO Aufbewahrungszeit der Before Images: CREATE UNDO TABLESPACE undotbs1 DATAFILE '\dsk1\oradata\o10\undotbs01.dbf' SIZE 10M AUTOEXTEND ON RETENTION GUARANTEE; SELECT tablespace_name, retention FROM dba_tablespaces; Flashback Query mit SCN: SELECT versions_starttime "START DATE", versions_endtime "END DATE", salary FROM employees VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE WHERE last_name = 'Fox'; Flashback Query nach Zeitpunkt: SELECT versions_starttime "START DATE", versions_endtime "END DATE", salary FROM employees VERSIONS BETWEEN TIMESTAMP TO_TIMESTAMP ('20021216', 'YYYYMMDD') AND TO_TIMESTAMP (SYSDATE) WHERE last_name = 'Fox'; Flashback Table Undo Management Wie Flashback Query Wie Flashback Query FLASHBACK TABLE dept TO TIMESTAMP to_timestamp('02.03.2004 09:30'); Flashback nach einem Drop Table Verwendung eines internen Recycle Bin Keine Abfragen des Recycle Bin: Löschen einer Tabelle mit Wiederherstellungsmöglichkeit: SELECT * FROM user_recyclebin; DROP TABLE dept; SELECT * FROM dba_recyclebin; SHOW RECYCLEBIN in SQL*Plus Wiederherstellen einer Tabelle: FLASHBACK TABLE dept TO BEFORE DROP; Wiederherstellen unter neuem Namen: Oracle 10g Flashback A.Held / Deutsche Post ITSolutions Seite 11 A.Held / Deutsche Post ITSolutions Typ Architektur DB Parameter Informationen Befehle flashback table dept to before drop rename to dept_old; Fortsetzung nächste Seite Fortsetzung Flashback nach einem Drop Table Endgültiges Löschen einer Tabelle: DROP TABLE dept PURGE; Entfernen aus dem Recycle Bin: PURGE TABLE dept; PURGE RECYCLEBIN; Flashback Database Before Images geänderter Datenbankblöcke werden von einem Oracle Prozess, dem RVWR in die Flashback Database Logs gesichert. Diese Before Images werden bei einem Flashback Database in die Datenfiles zurück geschrieben. Zusätzlich werden Redo Information der archivierten Redo Logs verwendet. Flashback Recovery Area im Filesystem: DB_RECOVERY_FILE_DEST Monitoren des Flashback Status einer Datenbank: SELECT flashback_on, Größe des Speichers, der im Flashback Recovery Area allokiert werden darf: current_scn FROM DB_RECOVERY_FILE_DEST_SIZE Monitoren des Flashback Retention Target: v$database; Zeitraum, für den Blöcke aufbewahrt werden sollen: SELECT * DB_FLASHBACK_RETENTION_TARGET v$flashback_database_log; Die Datenbank muss im Archive Log Mode betrieben werden. Flashback muss auf Datenbankebene angeschaltet werden. Scripte zur Umstellung können unter www.itc-frankfurt.de/download/scripte heruntergeladen werden. Adjustieren der Recovery Area Disk Quota: Aktivieren der Möglichkeit eines Flashback Database: 1. DB Parameter setzen 2. Shutdown immediate der Datenbank 3. Startup nomount; 4. Initiales Aktivieren von Flashback mit dem Befehl ALTER DATABASE FLASHBACK ON; 5. Datenbank öffnen mit FROM SELECT * FROM v$flashback_database_log; ALTER DATABASE OPEN; Datenbank mit Zeitpunkt oder SCN zurücksetzen: 1. Shutdown immediate der Datenbank 2. Startup mount 3. Flashback Befehl absetzen: FLASHBACK DATABASE TO TIMESTAMP(SYSDATE-1/24); oder FLASHBACK DATABASE TO SCN 53943; Oracle 10g Flashback A.Held / Deutsche Post ITSolutions Seite 12