DB:10g
Aufgabe: Auf einer 10g Cluster Datenbank soll Flashback aktiviert werden. Die Datenspeicherung erfolgt über eine Oracle ASM Instance. Bisher wurde die Recovery Area Parameter nicht verwendet. Die Platte für die Archivelogs und RMAN Backups ist gross aber langsam, die Flashback Logs soll auf einer schnellen 100GB Lun abgelegt werden. Die Flashback Logs lassen sich aber nicht einzeln konfigurieren.
Lösung für die Produktion:
Paramter für Flashback Log vorbereiten in der init.ora
log_archive_dest_1='location=+RECO' db_recovery_file_dest='+FLASH' db_recovery_file_dest_size=100GB retention_target=1440 ##entspricht 24h
srvctl stop database -d mydb
sys@sql> startup mount
Sqlplus> shutdown IMMEDIATE
srvctl start database -d mydb
Sqlplus>ALTER system archive LOG CURRENT; Sqlplus>SELECT name FROM v$archived_log; Sqlplus>SELECT name FROM GV$FLASHBACK_DATABASE_LOGFILE;
Restore Point setzen
sqlplus / AS sysdba sql>ALTER system checkpoint ; # Falls RAC auf jeder Instance anmelden und durchführen sql>ALTER system switch logfile; sql>ALTER system archive log CURRENT; # Restore Point anlegen mit (mit guarantee werden alle Logs aufbewahrt!) sql>CREATE restore point my_name_yyyy_dd_mm_hh24_mi guarantee flashback DATABASE; oder mit (falls dann kein Platz ist, kann es passieren das Logs gelöscht werden!: sql>CREATE restore point my_name_yyyy_dd_mm_hh24_mi;
Beispiel für ein Cluster:
# Umgebung setzen # Cluster Datenbank stoppen srvctl stop database -d GPIDB #Mit RMAN auf den restore point zurücksetzen rman target / nocatalog rman>startup mount rman>list restore point all; rman>flashback database to restore point 'point my_name_yyyy_dd_mm_hh24_mi'; rman>alter database open resetlogs; rman>shutdown immediate; rman>quit # Cluster DB starten srvctl start database -d GPIDB
Optional um etwas Plattenplatz freizugeben und einen aktuelleren Namen zu haben:
DROP restore point my_name_yyyy_dd_mm_hh24_mi;
CREATE restore point my_name_yyyy_dd_mm_hh24_mi guarantee flashback DATABASE;
Da der Plattenplatz nicht ausreichte, wurde versucht zwischen durch mit „alter database datafile .. resize ..“ die DB zu verkleinern.
Ergebnis:
RMAN> flashback DATABASE TO restore point GPI_NOW; RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: failure OF flashback command at 06/05/2014 16:19:16 ORA-38766: cannot flashback DATA file 3; file resized smaller ORA-01110: DATA file 3: '/u01/oracle/oradata/GPIDB/undotbs01.dbf'
Hier hilft dann nur ein Restore der DB aus dem Backup!
11g
Wird ein „CREATE restore point my_name_yyyy_dd_mm_hh24_mi guarantee flashback DATABASE;“ abgesetzt muss zuvor die Datenbank nicht im Flashback Modus sein!
Wird der Befehl abgesetzt wird der Modus automatisch aktiviert.
SET linesize 130 pagesize 300 recsep OFF ttitle "Report Flashback Feature of the Database" SKIP 2 - column FLASHBACK_ON format A20 SELECT FLASHBACK_ON FROM V$DATABASE / column INST_ID format A4 column RETENTION_TARGET format A20 column FLASH_SIZE format A20 column ESTIMATED_SIZE format A20 ttitle "Report Flashback Size of the Database" SKIP 2 - SELECT TO_CHAR(INST_ID) AS inst_id , RETENTION_TARGET ||' Minuten' RETENTION_TARGET , ROUND((FLASHBACK_SIZE)/1024/1024) ||' MB' FLASH_SIZE , ROUND((ESTIMATED_FLASHBACK_SIZE)/1024/1024)||' MB' ESTIMATED_SIZE FROM GV$FLASHBACK_DATABASE_LOG / ttitle "Report Flashback Logs of the Database" SKIP 2 - column last_first_time format A20 column maxsize format A10 SELECT TO_CHAR(INST_ID) AS inst_id ,MAX(LOG#) AS last_logid ,TO_CHAR(MAX(FIRST_TIME),'dd.mm.yyyy hh24:mi') AS last_first_time ,ROUND(MAX(BYTES)/1024/1024)||' MB' AS maxsize FROM GV$FLASHBACK_DATABASE_LOGFILE GROUP BY inst_id / ttitle " Flashback Restore Points" column scn format 99999999999999999 column RESTORE_POINT_TIME format a18 heading "RS P Time" column TIME format a18 heading "Time" column name format a30 heading "Name" column GUARANTEE_FLASHBACK_DATABASE format a6 heading "Garant." SELECT scn , TO_CHAR(RESTORE_POINT_TIME,'dd.mm.yyyy hh24:mi') AS RESTORE_POINT_TIME , TO_CHAR(TIME,'dd.mm.yyyy hh24:mi') AS TIME , NAME , GUARANTEE_FLASHBACK_DATABASE FROM V$RESTORE_POINT; ttitle "Oldest possible time to flashback" SKIP 2 - SELECT TO_CHAR(oldest_flashback_time,'dd-mon-yyyy hh24:mi:ss') AS "Oldest possible time" FROM v$flashback_database_log / ttitle "Oldest possible SCN to flashback" SKIP 2 - column oldest_flashback_scn format 99999999999999999999999999 heading "Oldest possible SCN" SELECT oldest_flashback_scn FROM v$flashback_database_log / ttitle "Report Flashback Logs Buffer" SKIP 2 - column name format A40 SELECT * FROM v$sgastat WHERE name LIKE 'flashback%'; ttitle off
Metalink:
Blogs: