How to enable and disable flashback in Oracle?

Oracle Flashback: Guía Completa de Recuperación

03/09/2011

Valoración: 4.59 (4280 votos)

En el dinámico mundo de la gestión de bases de datos, los errores humanos son inevitables. Un `DELETE` accidental, una actualización masiva incorrecta o la eliminación de una tabla equivocada pueden causar estragos. Afortunadamente, Oracle proporciona un conjunto de herramientas increíblemente potentes conocido como Oracle Flashback, que actúa como una verdadera máquina del tiempo para tus datos. Desde la versión 9i, esta tecnología ha permitido a los administradores y desarrolladores revertir errores sin necesidad de complejas restauraciones desde backups. Este artículo es una guía exhaustiva para entender, habilitar y utilizar las diversas funcionalidades de Flashback para proteger la integridad de tu información.

What is Oracle Flashback Table?
Oracle Flashback Table provides the DBA the ability to recover a table or set of tables to a specified point in time in the past very quickly, easily, and without taking any part of the database offline. In many cases, Flashback Table eliminates the need to perform more complicated point-in-time recovery operations.
Índice de Contenido

¿Qué es Oracle Flashback Query? El Arte de Consultar el Pasado

La forma más fundamental de esta tecnología es Flashback Query. Su propósito es simple pero revolucionario: permite ejecutar sentencias `SELECT` sobre una tabla para ver cómo se encontraban sus datos en un punto específico del pasado. Esto es invaluable para recuperarse de fallos accidentales a nivel de sentencias DML (Data Manipulation Language) como `UPDATE` o `DELETE`.

La magia detrás de Flashback Query reside en el tablespace de UNDO. Oracle utiliza este espacio para almacenar la información necesaria para deshacer transacciones. El parámetro UNDO_RETENTION es crucial aquí, ya que define por cuánto tiempo Oracle intentará conservar esta información de deshacer, incluso después de que una transacción haya sido confirmada (`COMMIT`). Si estableces un UNDO_RETENTION de 2 horas, tendrás una ventana de 2 horas para "viajar al pasado" y consultar los datos antes de un error.

Imaginemos que un usuario borra accidentalmente algunos registros a las 10:00 AM y confirma la transacción. A las 11:00 AM, se da cuenta del error. Puede recuperar los datos utilizando una consulta como esta:

-- Consultar el estado de la tabla 'emp' hace una hora SELECT * FROM emp AS OF TIMESTAMP SYSDATE - 1/24; 

También es posible especificar una fecha y hora exactas:

-- Consultar el estado de la tabla 'emp' en un momento preciso SELECT * FROM emp AS OF TIMESTAMP TO_TIMESTAMP('2023-10-27 10:00:00', 'YYYY-MM-DD HH:MI:SS'); 

Una vez que has visualizado los datos borrados, puedes reinsertarlos fácilmente en la tabla actual:

INSERT INTO emp (SELECT * FROM emp AS OF TIMESTAMP SYSDATE - 1/24); 

Analizando Cambios con Flashback Version Query

A veces, no solo necesitas ver el estado de los datos en un punto del pasado, sino que necesitas auditar todos los cambios que ha sufrido una fila a lo largo del tiempo. Aquí es donde brilla Flashback Version Query. Esta herramienta te permite recuperar todas las versiones de filas específicas que existieron durante un intervalo de tiempo determinado. Cada vez que se ejecuta un `COMMIT`, se crea una nueva versión de la fila modificada.

How to enable and disable flashback in Oracle?
To enable and disable flashback in an Oracle database, first ensure the database is in archive log mode. (Refer to: How to enable and disable archive log.) To enable flashback, set two parameters: DB_RECOVERY_FILE_DEST and DB_RECOVERY_FILE_DEST_SIZE.

La consulta devuelve metadatos útiles a través de pseudocolumnas que nos dan el contexto completo de cada cambio:

  • VERSIONS_XID: Identificador de la transacción que creó esa versión de la fila.
  • VERSIONS_OPERATION: La operación realizada ('I' para Insert, 'U' para Update, 'D' para Delete).
  • VERSIONS_STARTSCN / VERSIONS_STARTTIME: El SCN (System Change Number) o timestamp de cuándo se creó la versión.
  • VERSIONS_ENDSCN / VERSIONS_ENDTIME: El SCN o timestamp de cuándo expiró la versión (fue modificada de nuevo).

Considera este escenario: un DBA necesita investigar una serie de cambios erróneos en la tabla `emp`. Puede ejecutar la siguiente consulta para ver el historial completo de una fila entre las 20:30 y las 21:00:

SELECT versions_xid, versions_starttime, versions_endtime, versions_operation, empno, name, sal FROM emp VERSIONS BETWEEN TIMESTAMP TO_TIMESTAMP('2023-10-27 20:30:00', 'yyyy-mm-dd hh:mi:ss') AND TO_TIMESTAMP('2023-10-27 21:00:00', 'yyyy-mm-dd hh:mi:ss') WHERE empno = 101; 

Esta consulta revelará cada inserción y actualización, permitiendo al DBA identificar la transacción exacta que causó el problema y, si es necesario, obtener la sentencia SQL para revertirla usando `flashback_transaction_query`.

Recuperación Completa con Flashback Table

¿Qué sucede si el daño no se limita a unas pocas filas, sino que afecta a una tabla completa? Flashback Table es la solución. Permite revertir una tabla entera a un punto en el tiempo pasado de forma rápida y sin desconectar la base de datos. Al igual que Flashback Query, depende de los datos en el tablespace de UNDO, por lo que el parámetro UNDO_RETENTION sigue siendo fundamental.

Antes de poder usar esta funcionalidad, hay un requisito previo: el movimiento de filas debe estar habilitado en la tabla. Esto permite a Oracle cambiar los ROWIDs de las filas, algo necesario para la restauración.

How to enable and disable flashback in Oracle?

ALTER TABLE nombre_tabla ENABLE ROW MOVEMENT; 

Una vez habilitado, la sintaxis para revertir la tabla es muy sencilla. Si un administrador descubre a las 17:00 que la tabla `EMPLOYEES` ha sido alterada incorrectamente y necesita restaurarla a su estado de las 14:00, el comando sería:

FLASHBACK TABLE EMPLOYEES TO TIMESTAMP TO_TIMESTAMP('2023-10-27 14:00:00', 'YYYY-MM-DD HH:MI:SS'); 

Es importante notar que, por defecto, esta operación deshabilita los triggers de la tabla. Si deseas que los triggers permanezcan activos después de la restauración, debes especificarlo explícitamente:

FLASHBACK TABLE EMPLOYEES TO TIMESTAMP TO_TIMESTAMP('2023-10-27 14:00:00', 'YYYY-MM-DD HH:MI:SS') ENABLE TRIGGERS; 

La Papelera de Reciclaje de Oracle: Flashback Drop

A partir de Oracle 10g, se introdujo un concepto familiar para cualquier usuario de un sistema operativo moderno: la Recycle Bin (Papelera de Reciclaje). Cuando ejecutas un comando `DROP TABLE`, la tabla no se elimina permanentemente de inmediato. En su lugar, se renombra y se mueve a esta papelera.

Esta característica es independiente del espacio de UNDO, lo que significa que no está limitada por el parámetro `UNDO_RETENTION`. Para recuperar una tabla borrada accidentalmente, el comando es tan simple como:

FLASHBACK TABLE emp TO BEFORE DROP; 

La tabla será restaurada con su nombre original y todos sus objetos dependientes (índices, triggers, etc.). Si el nombre original ya está en uso, puedes restaurarla con un nuevo nombre:

FLASHBACK TABLE emp TO BEFORE DROP RENAME TO emp_recuperada; 

Si deseas eliminar una tabla de forma permanente, saltándote la papelera, debes usar el comando PURGE:

DROP TABLE emp PURGE; 

También puedes vaciar la papelera de reciclaje para liberar espacio. Oracle proporciona varios niveles de purga:

  • PURGE TABLE emp;: Elimina permanentemente una tabla específica de la papelera.
  • PURGE RECYCLEBIN;: Vacía la papelera del usuario actual.
  • PURGE TABLESPACE users;: Elimina todos los objetos de la papelera que pertenecen a un tablespace específico.
  • PURGE DBA_RECYCLEBIN;: (Requiere privilegio SYSDBA) Vacía completamente la papelera de reciclaje de toda la base de datos.

Tabla Comparativa: Tipos de Oracle Flashback

CaracterísticaPropósitoDependenciaCaso de Uso Típico
Flashback QueryConsultar datos en un punto del pasado.UNDO TablespaceRecuperar filas borradas o actualizadas por error.
Flashback Version QueryAuditar todos los cambios de una fila en el tiempo.UNDO TablespaceInvestigar transacciones fraudulentas o erróneas.
Flashback TableRevertir una tabla completa a un punto del pasado.UNDO TablespaceCorregir errores lógicos masivos en una tabla.
Flashback DropRecuperar una tabla eliminada con DROP.Recycle BinRecuperar una tabla borrada accidentalmente.

Habilitando y Deshabilitando Flashback en la Base de Datos

Para poder utilizar la tecnología Flashback a nivel de toda la base de datos (lo que permite operaciones como Flashback Database, no cubierto aquí pero relacionado), es necesario habilitarla explícitamente. Este proceso es sencillo pero requiere ciertos prerrequisitos.

Pasos para Habilitar Flashback:

  1. Asegurar Modo ARCHIVELOG: La base de datos debe estar operando en modo ARCHIVELOG.
  2. Configurar el Área de Recuperación: Debes definir la ubicación y el tamaño del Área de Recuperación Rápida (Fast Recovery Area - FRA) donde se almacenarán los logs de flashback.
    ALTER SYSTEM SET db_recovery_file_dest='/ruta/a/tu/fra'; ALTER SYSTEM SET db_recovery_file_dest_size=20G; -- Ajusta el tamaño según tus necesidades 

  3. Activar Flashback: Finalmente, activa la funcionalidad.
    -- Primero, verifica el estado actual SELECT flashback_on FROM v$database; -- Si está en 'NO', actívalo ALTER DATABASE FLASHBACK ON; 

Nota: En versiones antiguas como 10g, este comando debe ejecutarse con la base de datos en estado `MOUNT`.

Pasos para Deshabilitar Flashback:

El proceso es simplemente el inverso:

-- Verifica el estado SELECT flashback_on FROM v$database; -- Si está en 'YES', desactívalo ALTER DATABASE FLASHBACK OFF; 

Preguntas Frecuentes (FAQ)

P1: ¿Qué pasa si mi `UNDO_RETENTION` es muy corto?
R: Si el tiempo transcurrido desde el error es mayor que tu `UNDO_RETENTION`, Oracle puede haber sobrescrito la información de deshacer necesaria. En ese caso, las operaciones de Flashback Query y Flashback Table fallarán con un error de "snapshot too old". Por eso es vital configurar un `UNDO_RETENTION` adecuado para tus necesidades de negocio.

P2: ¿El comando `DROP TABLE ... PURGE` es reversible?
R: No. El propósito de la cláusula `PURGE` es precisamente saltarse la Papelera de Reciclaje y eliminar la tabla de forma permanente e irreversible. Úsalo con extrema precaución.

P3: ¿Cuál es la diferencia principal entre `Flashback Table` y `Flashback Drop`?
R: `Flashback Table` revierte los *datos* de una tabla existente a un estado anterior, utilizando la información de UNDO. `Flashback Drop` recupera una tabla *completa* que ha sido eliminada con el comando `DROP`, utilizando la Papelera de Reciclaje. Son para escenarios de error completamente diferentes.

Si quieres conocer otros artículos parecidos a Oracle Flashback: Guía Completa de Recuperación puedes visitar la categoría Ecología.

Subir