Oracle Flashback Database

De Dos Ideas.
Saltar a: navegación, buscar

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.


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

Ver también