Datapump - 04 Export con flashback time

Cuando escucho la palabra "Flashback" lo primero que pienso es el video juego de los años 90, muy divertido y adelantado para su época. Sin embargo, en esta oportunidad vamos a hablar de Oracle Flashback en el Datapump y como nos permite hacer viajes en el tiempo.


Flashback es una tecnología que comenzó con Oracle 9i y sigue evolucionando. Esta herramienta permite a los administradores y usuarios ver y manipular estados pasados de los datos sin necesidad de recuperar toda la base de datos a un punto de tiempo en especifico.

Vamos a crear un respaldo de una tabla pero con su imagen de hace 30 minutos y no con la imagen actual.

Comencemos:

01.- Insertamos 5 registros a la 14:00, la tabla tiene un campo llamado "fecha" donde vamos a insertar la hora actual a través de la función SYSDATE.

14:00:33 SQL> INSERT INTO test.tab01 (ID,NOMBRE,FECHA)
SELECT level, 'First Load', sysdate
FROM   dual
CONNECT BY level <= 5; 
5 rows created.

14:00:46 SQL> commit;
Commit complete.

02.- Luego de 20 minutos insertamos 5 registros más, es decir, a las 14:20.
14:20:01 SQL> INSERT /*+ APPEND */ INTO test.tab01 (ID,NOMBRE,FECHA)
SELECT level, 'First Load', sysdate
FROM   dual
CONNECT BY level <= 5;
5 rows created.

14:20:08 SQL> commit;
Commit complete.

03.- Revisamos los registros que fueron insertados en la tabla, es importante  observar la diferencia de tiempo en la que fueron insertados.
14:20:44 SQL> select * from test.tab01;
 ID NOMBRE           FECHA
---------- -------------------------------------------------- -------------------
  1 First Load           19-01-2019 14:00:44
  2 First Load           19-01-2019 14:00:44
  3 First Load           19-01-2019 14:00:44
  4 First Load           19-01-2019 14:00:44
  5 First Load           19-01-2019 14:00:44
  1 First Load           19-01-2019 14:20:03
  2 First Load           19-01-2019 14:20:03
  3 First Load           19-01-2019 14:20:03
  4 First Load           19-01-2019 14:20:03
  5 First Load           19-01-2019 14:20:03
10 rows selected.

04.- Realizamos un export datapump con la opción FLASHBACK_TIME donde le indicamos que vamos a tomar la imagen de la tabla a las 14:02 es decir despues que se insertaron los primeros 5 registros y antes de los últimos 5 registros.
expdp DUMPFILE=EXP_DIR:expPRUEBA_FB.dmp FLASHBACK_TIME=\"TO_TIMESTAMP\(\'19-01-2019 14:02:00\',\'DD-MM-YYYY HH24:MI:SS\'\)\" TABLES=test.tab01 LOGFILE=EXP_DIR:expPRUEBA_FB.log

Los slash “/” que se colocan antes de las comillas dobles, simples y paréntesis es para escapar los caracteres y el sistema operativo no los tome como instrucciones sino literalmente como caracteres.
FLASHBACK_TIME=\"TO_TIMESTAMP\(\'19-01-2019 14:02:00\',\'DD-MM-YYYY HH24:MI:SS\'\)\"

Si esto te parece confuso, se puede incluir esta opción en el archivo de parámetros:
cat parfile.par
FLASHBACK_TIME="TO_TIMESTAMP('19-01-2019 14:02:00','DD-MM-YYYY HH24:MI:SS')"

El comando de expdp quedaría de la siguiente forma:
expdp DUMPFILE=EXP_DIR:expPRUEBA_FB.dmp  parfile=parfile.par TABLES=test.tab01 LOGFILE=EXP_DIR:expPRUEBA_FB.log

05.- Ahora procedemos a borrar la tabla.
11:29:39 SQL> drop table test.tab01;

Table dropped.

06.- Realizamos el Import para restaurar la tabla.
[oracle@localhost dbprocs]$ impdp DUMPFILE=EXP_DIR:expPRUEBA_FB.dmp LOGFILE=EXP_DIR:impPRUEBA.log TABLES=test.tab01


07.- Como podemos observar se restauró la imagen de las 14:02, cuando solo habían 5 registros en la tabla.
11:29:58 SQL> select * from test.tab01;

 ID NOMBRE           FECHA
---------- -------------------------------------------------- -------------------
  1 First Load           19-01-2019 14:01:44
  2 First Load           19-01-2019 14:01:44
  3 First Load           19-01-2019 14:01:44
  4 First Load           19-01-2019 14:01:44
  5 First Load           19-01-2019 14:01:44


Comments