Home > Oracle Datenbank > Verlust von Flashback Logs

Verlust von Flashback Logs

Ist der Verlust von Flashback Logs ein Desaster?

Wissen Sie, was Sie tun müssen um bei einem Verlust von Flashback Logs alles wieder zu reparaieren? Muss vielleicht sogar restored und recovered werden, um die Datenbank wieder online zu bekommen?

Ein Beispielszenario

Bei einer 11gR2 oder 12c Datenbank wird ein garantierter Rücksetzpunkt (Guaranteed Restore Point - GRP) angelegt. Dafür ist es nicht notwendig, in der Datenbank die Flashback Logs zu aktivieren. Die Oracle Datenbank legt die Flashback Logs automatisch an, sofern eine FRA (Fast Recovery Area) definiert ist.

Im Laufe des Betriebs gehen die Flashback Logs verloren. Die Gründe dafür spielen für die Behebung des unmittelbaren Problems keine Rolle, lassen sich aber trefflich bei einem DBA Stammtisch diskutieren...

Nun stellt sich folgende Fragen:

  • Welche Auswirkungen hat das auf den Betrieb der Oracle Datenbank?
  • Kann man die Datenbank wieder online bekommen, ohne z.B. Controlfiles zurückzusichern oder neu anzulegen?

Probieren wir es einfach einmal aus

Flashback Database muss man dafür nicht aktiviert sein

SQL> select log_mode,flashback_on from v$database;

LOG_MODE     FLASHBACK_ON
------------ ------------------
ARCHIVELOG   NO

Erzeugen eines garantierten Rücksetzpunkt

SQL> create restore point test_1000 guarantee flashback database;

Restore point created.

Dies verändert entsprechend den Status von Flashbkack Database.

SQL> select log_mode,flashback_on from v$database;

LOG_MODE     FLASHBACK_ON
------------ ------------------
ARCHIVELOG   RESTORE POINT ONLY

Nach etwas Aktivität in der Datenbank findet man in der Recovery Area die Flashback Logs.

SQL> show parameter recover

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest                string      /u01/app/oracle/db/fast_recovery_area
...

Check am Operating System

[oracle@terra ~]$ cd /u01/app/oracle/db/fast_recovery_area/
[oracle@terra fast_recovery_area]$ ls
GEMINI
[oracle@terra fast_recovery_area]$ cd GEMINI/
[oracle@terra GEMINI]$ ls
archivelog controlfile flashback onlinelog
[oracle@terra GEMINI]$ cd flashback
[oracle@terra flashback]$ ls -lh
total 101M
-rw-r-----. 1 oracle oinstall 51M Oct 12 15:26 o1_mf_czwgctf1_.flb
-rw-r-----. 1 oracle oinstall 51M Oct 12 15:24 o1_mf_czwgcw0q_.flb

Die Flashback Logs lassen sich einfach löschen:

[oracle@terra flashback]$ rm *
[oracle@terra flashback]$ ls -lh
total 0

Das beeindruckt die Datenbank aber vorerst nicht. Sie läuft normal weiter und es finden sich keine Fehler im Alert Log der Datenbank. Das ist mit ein Grund warum es längere Zeit unbemerkt bleiben kann, dass Flashback Logs verloren/beschädigt wurden.

Woran man aber merken man, dass es Probleme mit den Flashback Logs gibt?

Man kann es daran erkennen, dass es nicht möglich zu sein scheint, die View v$restore_point abzufragen:

SQL> select * from v$restore_point;
select * from v$restore_point
              *
ERROR at line 1:
ORA-38701: Flashback database log 1 seq 1 thread 1:
"/u01/app/oracle/db/fast_recovery_area/GEMINI/flashback/o1_mf_czwgm45w_.flb"
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3

Solange die Datenbank Instanz läuft, kann man ganz einfach den garantierten Restore Point löschen und damit ist das Problem gegessen.

Sollte die Datenbank aber in der Zwischenzeit gestoppt worden sein, läßt sie sich nicht mehr einfach öffnen!

SQL> shutdown abort;
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area 1644167168 bytes
Fixed Size 2925024 bytes
Variable Size 1493175840 bytes
Database Buffers 134217728 bytes
Redo Buffers 13848576 bytes
Database mounted.
ORA-38760: This database instance failed to turn on flashback database

Ein Lösungsversuch - Flashback Database deaktivieren

Der Versuch, Flashback Database abzudrehen hat keine Auswirkung, da ja Flashback Database nicht explizit eingeschalten war.

SQL> select log_mode,flashback_on from v$database;

LOG_MODE     FLASHBACK_ON
------------ ------------------
ARCHIVELOG   RESTORE POINT ONLY

SQL> alter database flashback off;

Database altered.

SQL> select log_mode,flashback_on from v$database;

LOG_MODE     FLASHBACK_ON
------------ ------------------
ARCHIVELOG   RESTORE POINT ONLY

SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-38760: This database instance failed to turn on flashback database

So sieht das im Alert Log aus

Wed Oct 12 15:44:42 2016
ALTER DATABASE OPEN
Wed Oct 12 15:44:42 2016
Errors in file /u01/app/oracle/diag/rdbms/gemini/gemini/trace/gemini_ora_14970.trc:
ORA-38760: This database instance failed to turn on flashback database
ORA-38760 signalled during: ALTER DATABASE OPEN...
alter database flashback off
Wed Oct 12 15:45:10 2016
Flashback Database Disabled
Completed: alter database flashback off
alter database open
Wed Oct 12 15:46:49 2016
Errors in file /u01/app/oracle/diag/rdbms/gemini/gemini/trace/gemini_ora_14970.trc:
ORA-38760: This database instance failed to turn on flashback database
ORA-38760 signalled during: alter database open...

Die korrekte Lösung - den garantierten Rücksetzpunkt löschen

An und für sich läßt sich das Problem leicht beheben, indem man den GRP löscht. Wie kann man aber den Namen des GRP herausfinden?
Wie oben bereits gesehen, scheint man die View v$restore_point nicht abfragen zu können.
Werfen wir einen Blick auf die Struktur der View

SQL> desc v$restore_point;
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
SCN                                                NUMBER
DATABASE_INCARNATION#                              NUMBER
GUARANTEE_FLASHBACK_DATABASE                       VARCHAR2(3)
STORAGE_SIZE                                       NUMBER
TIME                                               TIMESTAMP(9)
RESTORE_POINT_TIME                                 TIMESTAMP(9)
PRESERVED                                          VARCHAR2(3)
NAME                                               VARCHAR2(128)
CON_ID                                             NUMBER

Eigentlich scheinen das alles Informationen zu sein, die im Controlfile vorhanden sind. Es stellt sich heraus, dass einzig die Spalte STORAGE_SIZE aus den Flashback Logs selbst kommt.

SQL> select STORAGE_SIZE from v$restore_point;
select STORAGE_SIZE from v$restore_point
                         *
ERROR at line 1:
ORA-38701: Flashback database log 1 seq 1 thread 1:
"/u01/app/oracle/db/fast_recovery_area/GEMINI/flashback/o1_mf_czwgm45w_.flb"
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3

Läßt man diese Spalte beim Abfragen weg, bekommt man auch die notwendige Information:

SQL> select NAME, GUARANTEE_FLASHBACK_DATABASE from v$restore_point;

NAME                  GUA
--------------------- ---
TEST_1000             YES

Und jetzt kann den GRP löschen:

SQL> drop restore point test_1000;

Restore point dropped.

SQL> select log_mode,flashback_on from v$database;

LOG_MODE     FLASHBACK_ON
------------ ------------------
ARCHIVELOG   NO

SQL> alter database open;

Database altered.

Wieder aus dem Alert Log

Wed Oct 12 15:47:01 2016
Drop guaranteed restore point TEST_1000
Stopping background process RVWR
Deleted Oracle managed file /u01/app/oracle/db/fast_recovery_area/GEMINI/flashback/o1_mf_czwhfg6l_.flb
Deleted Oracle managed file /u01/app/oracle/db/fast_recovery_area/GEMINI/flashback/o1_mf_czwhfk8s_.flb
Guaranteed restore point TEST_1000 dropped
alter database open

Alternativ dazu kann man den GRP auch über RMAN finden:

RMAN> list restore point all;

SCN              RSP Time  Type       Time      Name
---------------- --------- ---------- --------- ----
936094                     GUARANTEED 12-OCT-16 TEST_1000