Oracle Flashback Database
Flashback Database nos permite rebobinar la base de datos completa a un momento del pasado, revirtiendo los efectos de cambios no deseados dentro de una ventana de tiempo determinada.
Flashback Database (a partir de Oracle10g) provee una alternativa más directa y eficiente para realizar un database point-in-time recovery. Con la tecnología flashback esta tarea se realiza mas rápido porque no es necesario restaurar los datafiles del backup, y requiere poca aplicación de redo comparado con un media recovery.
Flashback Database usa su propio mecanismo de logging, creando Flashback Logs, los cuales son almacenados en la Flash Recovery Area
Para habilitar el Flashback Database se debe: 1)Configurar la Flash Recovery Area
ALTER DATABASE FLASHBACK ON;
Ejecutar esta sentencia con la base Montada pero no Abierta.
2) Setear un flashback retention target, para especificar que tan lejos en el tiempo queremos poder restaurar la base de datos con Flashback Database
DB_FLASHBACK_RETENTION_TARGET = <minutos>;
Por default este parámetro de configuración está seteado en 1 día (1440 minutos).
3) La base de datos debe estar en Archiving.
Contenido
Flash Recovery Area
Es el directorio que actúa como contenedor de los Flashback Logs. Su ubicación y tamaño se configura mediante los siguiente parámetros:
DB_RECOVERY_FILE_DEST = <directorio>\flash_recovery_area DB_RECOVERY_FILE_DEST_SIZE = 2Gb (default)
Flashback Logs
Desde que Flashback Database está configurado, la base de datos copia a intervalos regulares al Flash Recovery Area, logs con imágenes de cada bloque alterado en cada datafile.
Estas imágenes de los bloques pueden usarse luego para reconstruir el contenido del datafile a como estaba en el momento en que los logs fueron capturados.
Cuando la base de datos es restaurada al estado que tenía en un momento del pasado, usando Flashback Database, cada bloque modificado desde el momento establecido del pasado hasta hoy se cambia por la imagen en los flashback logs más inmediata anterior al momento establecido del pasado. Luego se aplican los redo log (generados por el archiving u onlines) para re-aplicar los cambios desde el momento en que la imagen fue copiada hasta el momento establecido del pasado.
Flashback Database Window
El rango de SCNs para los cuales hay suficientes Flashback Logs para soportar el comando FLASHBACK DATABASE, es denominado Flashback Database Window.
Si el espacio libre de la Flashback Recovery Area es bajo, entonces Oracle automáticamente borra Flashback Logs para liberar espacio (los más viejos primero).
Como resultado el Flashback Database Window es tan largo como lo defina el db_flashback_retention_target, dependiendo del tamaño de la Flash Recovery Area. Esto significa que si se generan muchos flashback logs en un corto tiempo, puede ser que estos llenen la Flash Recovery Area antes del db_flashback_retention_target, y entonces los logs son borrados y la ventana no esta definida por el parámetro sino por el tamaño del Area.
No se puede tener Flashback Logs fuera del Flashback Recovery Area, por lo tanto para incrementar la ventana se debe aumentar el tamaño de la Flash Recovery Area.
Para verificar los SCN incluidos en la ventana realizar una consulta sobre V$FLASHBACK_DATABASE_LOG:
sys@LAB10G> desc v$flashback_database_log;
Nombre Nulo Tipo -------------------------- ---- ------- OLDEST_FLASHBACK_SCN NUMBER OLDEST_FLASHBACK_TIME DATE RETENTION_TARGET NUMBER FLASHBACK_SIZE NUMBER ESTIMATED_FLASHBACK_SIZE NUMBER
sys@LAB10G> select oldest_flashback_scn, oldest_flashback_time 2 from v$flashback_database_log;
OLDEST_FLASHBACK_SCN OLDEST_F -------------------- -------- 1753887 12/09/07
Preparación de Ambiente
La base de datos LAB10g fue creada con Flashback Database y Archivelog habilitados.
sys@LAB10G> SELECT name, flashback_on FROM v$database; NAME FLASHBACK_ON --------- ------------------ LAB10G YES
sys@LAB10G> archive log list
Modo log de la base de datos
Modo de Archivado automático Activado Destino del archivo D:\ora10g\LAB10g\admin\arch Secuencia de log en línea mas antigua 74 Siguiente secuencia de log para archivar 76 Secuencia de log actual 76
Parámetros de configuración
NAME TYPE VALUE ------------------------------ ----------- ---------------------------- db_flashback_retention_target integer 1440 db_recovery_file_dest string D:\ora10g\LAB10g\admin\flash_recovery_area db_recovery_file_dest_size big integer 2G
Ejemplo
Datos Iniciales
scott@LAB10G> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- --------- ----- -------- ----- ----- -------
7369 SMITH CLERK 7902 17/12/80 800 20 7499 ALLEN SALESMAN 7698 20/02/81 1600 300 30 7521 WARD SALESMAN 7698 22/02/81 1250 500 30 7566 JONES MANAGER 7839 02/04/81 2975 20 7654 MARTIN SALESMAN 7698 28/09/81 1250 1400 30 7698 BLAKE MANAGER 7839 01/05/81 2850 30 7782 CLARK MANAGER 7839 09/06/81 2450 10 7788 SCOTT ANALYST 7566 19/04/87 3000 20 7839 KING PRESIDENT 17/11/81 5000 10 7844 TURNER SALESMAN 7698 08/09/81 1500 0 30 7876 ADAMS CLERK 7788 23/05/87 1100 20 7900 JAMES CLERK 7698 03/12/81 950 30 7902 FORD ANALYST 7566 03/12/81 3000 20 7934 MILLER CLERK 7782 23/01/82 1300 10
14 filas seleccionadas.
Borro filas de la tabla EMP
scott@LAB10G> select current_scn from v$database; CURRENT_SCN ----------- 1754456
scott@LAB10G> delete from emp where job='SALESMAN'; 4 filas suprimidas.
scott@LAB10G> commit; Confirmación terminada.
scott@LAB10G> select * from emp; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ------ ---------- --------- ----- -------- ----- ----- ------- 7369 SMITH CLERK 7902 17/12/80 800 20 7566 JONES MANAGER 7839 02/04/81 2975 20 7698 BLAKE MANAGER 7839 01/05/81 2850 30 7782 CLARK MANAGER 7839 09/06/81 2450 10 7788 SCOTT ANALYST 7566 19/04/87 3000 20 7839 KING PRESIDENT 17/11/81 5000 10 7876 ADAMS CLERK 7788 23/05/87 1100 20 7900 JAMES CLERK 7698 03/12/81 950 30 7902 FORD ANALYST 7566 03/12/81 3000 20 7934 MILLER CLERK 7782 23/01/82 1300 10 10 filas seleccionadas.
Con usuario SYS (usuario con privilegios) realizo lo siguiente:
sys@LAB10G> shutdown immediate; Base de datos cerrada. Base de datos desmontada. Instancia ORACLE cerrada. sys@LAB10G> startup mount; Instancia ORACLE iniciada. Total System Global Area 167772160 bytes Fixed Size 1289508 bytes Variable Size 142607068 bytes Database Buffers 20971520 bytes Redo Buffers 2904064 bytes Base de datos montada.
sys@LAB10G> flashback database to scn 1754456; Flashback terminado. sys@LAB10G> alter database open resetlogs; Base de datos modificada.
Con usuario SCOTT verifico que la tabla EMP este completa:
scott@LAB10G> select count(1) from emp; COUNT(1) ---------- 14
Trunco la tabla EMP
scott@LAB10G> select current_scn from v$database; CURRENT_SCN ----------- 1754655
scott@LAB10G> truncate table emp; Tabla truncada.
Con usuario SYS (usuario con privilegios) realizo lo siguiente:
sys@LAB10G> shutdown immediate; Base de datos cerrada. Base de datos desmontada. Instancia ORACLE cerrada.
sys@LAB10G> startup mount; Instancia ORACLE iniciada. Total System Global Area 167772160 bytes Fixed Size 1289508 bytes Variable Size 146801372 bytes Database Buffers 16777216 bytes Redo Buffers 2904064 bytes Base de datos montada.
sys@LAB10G> flashback database to scn 1754655; Flashback terminado.
sys@LAB10G> alter database open resetlogs; Base de datos modificada.
Con usuario SCOTT verifico que la tabla EMP este completa:
scott@LAB10G> select count(1) from emp; COUNT(1) ---------- 14
Para poder realizar un FLASHBACK DATABASE es necesario bajar la base y no abrirla, sino solo montarla. Luego del FLASHBACK puede abrirse la base y dejarla disponible para el resto de los usuarios.
No solo puede hacerse Flashback Database a un SCN determinado, también puede usarse una fecha o un Restore Point previamente establecido.
Antes de realizar el OPEN RESETLOGS podemos ir moviéndonos en la ventana hasta quedar donde deseamos:
- Si fuimos muy lejos en el FLASHBACK y queremos adelantarnos a un SCN más nuevo podemos usar un RECOVER DATABASE UNTIL TO SCN <scn>.
- Si no fuimos lo suficientemente lejos volvemos a usar el FLASHBACK DATABASE TO SCN <scn>.
Para deshacer los efectos del FLASHBACK DATABASE y volver el estado de la base al presente se debe utilizar un RECOVER DATABASE (sin UNTIL).
Para deshacer los efectos de un OPEN RESTELOGS e ir “mas atrás del último open resetlogs” se usa el siguiente comando:
FLAHBACK DATABASE TO BEFORE RESETLOGS;
Para verificar cuando fue el último OPEN RESETLOGS realizar la siguiente consulta:
sys@LAB10G> select resetlogs_change# from v$database;
RESETLOGS_CHANGE# ----------------- 1754658