Die Zeitmaschine – Oracle Database 10g Flashback
Transcription
Die Zeitmaschine – Oracle Database 10g Flashback
Die Zeitmaschine – Oracle Database 10g Flashback Ulrike Schwinn Oracle Deutschland GmbH Business Unit Datenbank München Schlüsselwörter flashback database, flash recovery area, flashback log, flashback table, flashback drop, recycle bin, flashback versions query, flashback transaction query Zusammenfassung Flashback in Oracle bedeutet Daten zu einem früheren Zeitpunkt zur Verfügung zu stellen oder die Zeit zurückzuspulen (engl.: rewind). Schon in Oracle9i 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 bis auf Datenbankebene zu nutzen. In diesem Beitrag werden die verschiedenen Arten des Flashbacks wie flashback database, flashback table, flashback drop und die Auditing- Erweiterungen durch flashback versions und flashback transaction query erläutert und an Beispielen demonstriert. Einleitung Viele Applikationsausfälle beruhen auf logischen Korruptionen, die zum Beispiel durch Anwenderfehler oder fehlerhafte Batchjobs ausgelöst werden. Löschen von Tabellen, Einfügen, Löschen oder Ändern von Datensätzen, versehentlich gestartete Batchjobs sind häufig die Ursache dafür. In der Regel sind diese Fehler schwieriger und meist nur mit langwierigen und komplexen Prozeduren zu beseitigen. Manuelle Eingabe der Daten, Einspielen des letzten Cold Backups, Datenbank- oder Tablespace-Point-In-Time- Recovery sind die traditionellen Methoden in früheren Datenbankversionen, um solchen Fehlern zu begegnen. Oracle Database 10g hingegen liefert neue Konzepte und Kommandos, um schnell und einfach die Datenbank auf verschiedenen Ebenen in einen konsistenten Zustand der Vergangenheit zurückzuversetzen. Das flashback database- Konzept 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. Dazu wird ein einziges FLASHBACK DATABASE– Kommando, das im RMAN oder in SQL*Plus ausgeführt wird, benötigt. Wie kann dies funktionieren? Flashback database beruht auf einem eigens dafür konfigurierten Bereich der Datenbank, der sogenannten flash recovery area. In speziellen flashback log-Dateien werden regelmäßig die Kopien der geänderten Blöcke geschrieben. Die flash recovery area wird durch die neuen Initialisierungsparameter DB_RECOVERY_FILE_DEST und DB_RECOVERY_DEST_SIZE festgelegt. Falls kein ARCHIVE_LOG_DEST_n Parameter eingestellt ist, enthält dieser die flashback log-Dateien und zusätzlich die archivierten log Dateien und RMAN Backups. Abb. 1: Bereiche der flash recovery area Um Flashback nutzen zu können, sind folgende Einstellungen notwendig: 1) Bereitstellen des Recovery Bereichs: SQL> SHOW PARAMETER db_recovery NAME TYPE VALUE ---------------------------- ----------- ----------db_recovery_file_dest string /space/app/oracle/ flash_recovery_area db_recovery_file_dest_size big integer 2G 2) Flashback und ARCHIVELOG- Datenbank-Einstellungen: SQL> show parameter flash NAME TYPE VALUE ------------------------------------ ----------- --------------db_flashback_retention_target integer 1440 SQL> SELECT flashback_on, log_mode FROM v$database; FLA LOG_MODE --- ---------YES ARCHIVELOG Falls die flashback database- Option noch nicht eingestellt worden ist, kann dies durch das Kommando ALTER DATABASE FLASHBACK ON im MOUNT- Stadium der Datenbank durchgeführt werden. Die Datenbank muss zusätzlich im ARCHIVELOG-Mode sein, da archivierte Log- Dateien während des Flashbacks genutzt werden. Die Frage, wie weit mit existierenden flashback logs zurückgegangen werden kann und wie viel Speicherplatz für das Flashback benötigt wird, kann mit Hilfe der View V$FLASHBACK_DATABASE_LOG oder aber mit dem Enterprise Manager (siehe Abb 2) beantwortet werden: SQL> SELECT oldest_flashback_scn, oldest_flashback_time 2> FROM v$flashback_database_log; OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK ESTIMATED_FLASHBACK_SIZE -------------------- ---------------- -----------------------11355608 20.10.2003 19:14 449691648 Abb. 2: Einstellen der flash recovery area im Enterprise Manager Im Fehlerfall kann ein Flashback der Datenbank durch folgende Kommandos im MOUNTStadium der Datenbank durchgeführt werden: FLASHBACK DATABASE TO SCN oder FLASHBACK DATABASE TO TIMESTAMP <timestamp> Im Gegensatz zur Ausführung in RMAN muss bei der Ausführung in SQL*Plus sichergestellt sein, dass alle benötigten Dateien auf der Festplatte zur Verfügung stehen. Danach wird die Datenbank mit der Option OPEN RESETLOGS geöffnet. Probleme ausgelöst durch gelöschte Tabellen, User und Tablespaces, versehentlich durchgeführte TRUNCATE Kommandos usw. können mit diesem Kommando rückgängig gemacht werden. Wichtig ist die Tatsache, dass die gesamte Datenbank durch flashback database physikalisch in einen früheren, konsistenten Zustand zurückgesetzt wird und mit RESETLOGS geöffnet werden muss. In folgendem Beispiel wird das versehentliche Löschen eine Users rückgängig gemacht. 1) Löschen des Users: SQL > DROP USER hr CASCADE; User dropped 2) Durch das FLASHBACK DATABASE-Kommando wird der Zustand vor dem Löschen des Users wiederhergestellt: SQL>STARTUP MOUNT SQL>FLASHBACK DATABASE TO SCN 11359846; Flashback complete. SQL> ALTER DATABASE OPEN RESETLOGS; Database altered. SQL> SELECT username FROM dba_users; USERNAME -----------------------------FLASHBACK OE ULRIKE TEST HR SH MDDATA IX DIP PM BI .... Dieses Konzept kann ebenfalls in Verbindung mit der Primary- und Standby- Datenbank verwendet werden. Bei logischen Korruptionen ist es z.B. nicht mehr länger notwendig eine Verzögerung mithilfe der DELAY-Option für das Anwenden der Log-Dateien zu verwenden. Die Primary Datenbank kann mit flashback database zurückgesetzt werden und diese Änderung wird an die Standby Datenbank propagiert. Das flashback query-Konzept Der flashback database- Konzept ist sicherlich für versehentlich durchgeführte DMLKommandos überdimensioniert; insbesondere weil flashback database im MOUNT- Stadium durchgeführt wird und die gesamte Datenbank zurücksetzt. Die Technik des flashback table hingegen ermöglicht es, eine Tabelle oder mehrere Tabellen zu einem bestimmten Zeitpunkt, der durch eine SCN oder einen Zeitpunkt (TIMESTAMP) definiert ist, zurückzusetzen. Folgendes Kommando zeigt die Verwendung: SQL> FLASHBACK TABLE employees, departments TO TIMESTAMP 2> TO_TIMESTAMP('21-oct-2003, 18:50:28','dd-mon-yyyy, 3> hh24:mi:ss'); Flashback complete. Constraints und Indizes werden während der Operation berücksichtigt. Trigger sind standardmäßig ausgeschaltet, können aber mit der zusätzlichen Option „ENABLE TRIGGERS“ während des Flashbacks aktiviert bleiben. Nur DML-Operationen können auf diese Weise zurückgesetzt werden. DDL-Kommandos wie ALTER TABLE ...DROP COLUMN, ALTER TABLE...DROP PARTITION, ALTER TABLE MOVE, TRUNCATE TABLE usw. können damit nicht zurückgeführt werden. Der Versuch, Tabellen zu einem Zeitpunkt vor einem DDL Kommando zurückzusetzen, führt zu folgendem Verhalten: SQL>FLASHBACK TABLE departments TO TIMESTAMP 2>TO_TIMESTAMP('21-oct-2003 18:57:55','dd-mon-yyyy hh24:mi:ss') * ERROR at line 1: ORA-01466: unable to read data - table definition has changed Da beim FLASHBACK TABLE- Operationen an Zeilen durchgeführt werden und unter Umständen ROWIDs verändert werden müssen, sollte zuvor row movement eingestellt sein. ALTER TABLE <table_name> ENABLE ROW MOVEMENT; Darüber hinaus muss der Nutzer von flashback table entweder das Systemprivileg FLASHBACK ANY TABLE oder aber die Objektprivilegien FLASHBACK, INSERT, UPDATE und DELETE auf den Tabellen besitzen. Im Unterschied zu der vorher erläuterten flash recovery area basiert flashback table auf den UNDO-Einstellungen. Wie in Oracle9i ist die Größe des UNDO-Tablespaces und der Initialisierungsparameter UNDO_RETENTION ausschlaggebend dafür, wie weit zurückgegangen werden kann. Neu in Oracle Database 10g ist eine zusätzliche Angabe von RETENTION GUARANTEE beim Anlegen des UNDO-Tablespace. Dadurch wird garantiert, dass zugunsten der Vorhaltezeit der Platz für flashback table reserviert bleibt. DMLOperationen, die den UNDO-Platz benötigen, könnten dann aus Platzmangel fehlschlagen. Um eine einfache Handhabbarkeit zu gewährleisten, ist die Nutzung von flashback table ist nicht nur auf SQL*Plus beschränkt sondern auch im Enterprise Manager (siehe Abb 3) implementiert, Abb 3: Flashback table Unterstützung im Enterprise Manager Wie gerade gezeigt wurde, kann bei fehlerhaft durchgeführten DML-Kommandos flashback table eingesetzt werden. Was kann man bei versehentlich gelöschten Tabellen tun? Die Antwort liefert das Kommando FLASHBACK TABLE BEFORE DROP. Das nächste Kapitel gibt die notwendigen Hintergrundinformationen dazu. Oracles recycle bin oder das flashback drop- Konzept Neu in Oracle Database10g ist die Einführung eines recycle bin. Bei einem DROP TABLEKommando werden jetzt automatisch die Tabellen und zugehörige Objekte wie Indizes, Constraints (außer referentielle Integrität) und nested tables im sogenannten recycle bin zur Verfügung gestellt. Dies geschieht durch ein einfaches Umbenennen der zugehörigen Objekte und nicht durch explizites Kopieren in einen neuen Bereich. Jeder User hat das Recht, seinen eigenen recycle bin zu selektieren, eigene Objekte aus dem recycle bin wiederherzustellen oder den recycle bin mit einem PURGE-Kommando zu leeren. Der recycle bin wird automatisch geleert, falls die Quota beim Erzeugen neuer Objekte überschritten werden oder der User-Tablespace sich vergrößern müsste. Folgendes Beispiel illustriert die Nutzung des recycle bins: 1) Löschen einer Tabelle: SQL> DROP TABLE flash_tab; Table dropped. SQL> DROP TABLE TEST; Table dropped. 2) Anzeigen des Inhalts des recycle bin: SQL> SELECT object_name, original_name , type, droptime 2> FROM user_recyclebin; OBJECT_NAME ----------------RB$$51954$TABLE$0 RB$$52045$INDEX$0 RB$$51957$TABLE$0 ORIGINAL_NAME -------------TEST TEST_IDX FLASH_TAB TYPE -----------TABLE NORMAL INDEX TABLE DROPTIME ------------------2003-10-22:21:48:42 2003-10-22:21:48:42 2003-10-21:19:20:35 RB$51957$TABLE$0 und RB$$51954$TABLE$0 sind die neuen systemgenerierten Namen für die Tabellen TEST und FLASH_TAB. RB$$51954$TABLE$0 ist der Name, der verwendet werden muss, um zum Beispiel die Tabelle TEST wiederherzustellen. Die Integration im Enterprise Manager (siehe Abb 4) hilft den recycle bin zu durchsuchen und die Tabelle wiederherzustellen. Abb.4: Inhalt des recycle bins im Enterprise Manager 3) Durchführen des FLASHBACK TABLE- Kommandos: SQL>FLASHBACK TABLE RB$$51954$TABLE$0 TO BEFORE DROP RENAME TO 2>TEST; Flashback complete. Nach Ausführung des Kommandos steht die Tabelle mit allen Daten wieder unter dem Namen TEST und der Index unter dem vorher generierten Systemnamen RB$$52045$INDEX$0 zur Verfügung. Die Enterprise Manager Implementierung sieht folgendermaßen aus: Abb. 5: Automatisches Umbennen im Enterprise Manager Monitoring mit flashback query Die mit Oracle9i flashback query eingeführten SQL-Erweiterungen ermöglichen es, Daten zu einem speziellen früheren Zeitpunkt zu selektieren; das bedeutet eine einzige Version der Daten kann pro Statement selektiert werden. Dies kann sinnvoll sein, um bei einer fehlerhaften Dateneingabe diese durch ein entsprechendes Kommando wieder rückgängig machen zu können. Folgendes Beispiel illustriert die in Oracle9i eingeführte flashback query-Funktionalität. Der aktuelle Inhalt der Tabelle DEPT sieht folgendermaßen aus: SQL> SELECT * FROM dept; DEPTNO ---------10 20 30 40 DNAME -------------ACCOUNTING RESEARCH SALES OPERATIONS LOC ------------NEW YORK DALLAS CHICAGO BOSTON Um die ursprüngliche Version der DEPT Tabelle zu selektieren, wird die SQL-Option AS OF SCN oder AS OF TIMESTAMP genutzt. SQL> SELECT * FROM dept AS OF TIMESTAMP 2> to_timestamp('21-10-2003 22:00:00','dd-mm-yyyy hh24:mi:ss'); DEPTNO DNAME LOC ------------ --------------- ------------1 BU MUC 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON Wie zu erkennen ist, enthält die DEPT Tabelle eine zusätzliche Zeile mit der DEPTNO 1. Nun könnte mit dem entsprechenden INSERT-Kommando die versehentlich gelöschte Zeile in Verbindung mit der AS OF Subquery wiedereingefügt werden. Ist der Datenbestand allerdings mehrmals verändert worden, sind mit der Oracle9i-Technologie mehrere flashback queries notwendig, um eine Übersicht zu bekommen. Die neuen SQL-Erweiterungen VERSIONS BETWEEN SCN und VERSIONS BETWEEN TIMESTAMP in Oracle Database 10g hingegen ermöglichen es, mehrere Versionen von Daten auf einmal abzufragen und zusätzlich Informationen über die korrespondierenden Transaktionen zu erhalten. Das folgende Beispiel zeigt die verschiedenen Versionen der DEPTNO-Spalte und die zugehörige Transaktions-ID: SQL> SELECT deptno, dname, versions_operation o, 2> versions_xid, versions_starttime FROM dept 3> VERSIONS BETWEEN TIMESTAMP minvalue AND maxvalue DEPTNO ---------11 1 10 20 30 40 DNAME ---------BU BU ACCOUNTING RESEARCH SALES OPERATIONS O U I VERSIONS_XID ---------------0002001700004A22 0002001900004A1A VERSIONS_STARTTIME -------------------21-OCT-03 11.02.56 PM 21-OCT-03 10.52.52 PM Pseudospalten wie VERSIONS_XID helfen, zusätzliche Informationen über die Transaktionen zu erhalten. Weitere Beispiele für nützliche Pseudospalten zeigt die folgende Liste: · VERSIONS_STARTTIME: Startzeit bei Erzeugen der ersten Version · VERSIONS_STARTSCN: Start-SCN der ersten Version · VERSIONS_XID: Jede Version einer Zeile hat die eindeutige Transaction-ID der Transaktion, die die Zeile erzeugt hat. · VERSIONS_OPERATION: Operationskennziffer : U für UPDATE, D für DELETE und I für INSERT Die neue View DBA_TRANSACTION_QUERY liefert ähnlich wie die Logminer-View V$LOGMNR_CONTENTS Informationen über das UNDO-SQL Statement. SQL>SELECT xid,logon_user, table_name, table_owner, undo_sql 2>FROM dba_transaction_query WHERE table_owner='SCOTT'; XID LOGON_USER TABLE_NAME TABLE_OWNER ---------------- ----------- ---------- ----------UNDO_SQL -----------------------------------------------------------0002001700004A22 SCOTT DEPT SCOTT update "SCOTT"."DEPT" set "DEPTNO" = '1' where ROWID = 'AAALwRAAEAAAAAMAAA'; 0002001900004A1A SCOTT DEPT SCOTT delete from "SCOTT"."DEPT" where ROWID = 'AAALwRAAEAAAAAMAAA'; In unserem Beispiel kann durch Nutzung der zuvor ermittelten Transaktions-ID das UNDOStatement gefunden werden, um die Veränderungen an der Tabelle DEPT wieder rückgängig zu machen. SQL>SELECT logon_user, table_name, table_owner, undo_sql 2>FROM dba_transaction_query WHERE table_owner='SCOTT' AND 3> xid='0002001700004A22'; LOGON_USER TABLE_NAME TABLE_OWNER ---------------- ----------- ----------UNDO_SQL -----------------------------------------------------------SCOTT DEPT SCOTT update "SCOTT"."DEPT" set "DEPTNO" = '1' where ROWID = 'AAALwRAAEAAAAAMAAA'; Im Vergleich zu der flashback table- Technologie stellt diese Technik eine Alternative bei versehentlich oder fehlerhaften Änderungen an Tabellendaten dar. Fazit Die Flashback- Features können in unterschiedlichen Bereichen bei logischen Korruptionen eingesetzt werden. Nach Einstellung der entsprechenden Bereiche wie der flash recovery area für flashback database und Undo-Management für flashback table und flashback query übernimmt die Datenbank die Verwaltung dieser Speicherbereiche, die im Fehlerfall für das Flashback eingesetzt werden. Im folgenden wird eine kurze beispielhafte Übersicht über mögliche Fehlerursachen und deren schnellen und einfachen Behebung durch die entsprechenden Flashback-Optionen gegeben: Korruptionen, die durch DROP USER, TRUNCATE TABLE, fehlerhaften Batchjobs die mehrere Tabellen betreffen, können durch flashback database einfach und schnell auf Datenbankebene behoben werden. Fehler, die auf DROP TABLE beruhen, können durch den eigenen User recycle bin rückgängig gemacht werden. Versehentliche DML-Kommandos wie DELETE oder fehlerhaftes UPDATEs, die mit COMMIT abgeschlossen sind, können durch flashback table oder flashback query in Verbindung mit der Ausführung des UNDO-Statements behoben werden. Batchjobs, die versehentlich mehrfach gelaufen sind und deren Fehlerursache noch nicht bekannt ist, können durch flashback versions query bzw. flashback transaction query auditiert werden. Kontaktadresse: Ulrike Schwinn Oracle Deutschland GmbH Riesstr 25 D-80992 München Telefon: +49(0)89 14301865 Fax: +49(0)89 14301572 E-Mail ulrike.schwinn@oracle.com Internet: www.oracle.com/de