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