[ 2014-02-16 ]

Flashback de una base en RAC a un Guarantee Restore Point (GRP)


Vamos a ver un ejemplo de como crear un GRP (Guarantee Restore Point) y como realizar el flashback de una base en RAC a este restore point.
Para asegurar el exito de la operación de Flashback y GRP debemos tener en cuenta algunas configuraciones previas:

Requisitos:


  • La base de datos debe estar configurada en modo archivelog (los archivelogs son usados para las operaciones de flashback database)
  • Debe estar activada la FRA ya que los falshback logs solo pueden ser almacenados en la flash/fast recoevry area. 
  • En bases de datos en RAC (Real Application Clusters), la FRA debe estar configurada en ASM o en un cluster filesystem que pueda ser accedido por todos los nodos del RAC.


1) Chequeamos que la base este configurada en modo Archive Log:

Nos conectamos a una de las instancias con SQL*Plus y corremos el siguiente comando:


SQL> archive log list

Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     24
Next log sequence to archive   25
Current log sequence           25

Vemos que efectivamente está habilitado el modo de archivado.

SQL> set pagesize 120

SQL> set linesize 180
SQL> select log_mode,force_logging,current_scn,flashback_on from v$database;


LOG_MODE     FORCE_LOGGING CURRENT_SCN FLASHBACK_ON

------------ ------------- ----------- ------------------
ARCHIVELOG   NO                2022217 NO

La base está con la flashback desactivada. No es necesario que esté activada para poder utilizar Guaranteed Restore Points.

Si la base NO está en modo archivelog recibiremos error al ejecutar el el restore point:


SQL> create restore point MY_RESTOREPOINT guarantee flashback database;
create restore point MY_RESTOREPOINT guarantee flashback database
*
ERROR at line 1:
ORA-38784: Cannot create restore point 'MY_RESTOREPOINT'.
ORA-38785: Media recovery must be enabled for guaranteed restore point.



Creamos un Guarantee Restore Point:

Verificamos que no existe ningún RP ya creado:

SQL> select * from v$restore_point;

no rows selected



Ahora creamos una tabla para nuestra demostración.


SQL> create table demo (id number, fecha date);


Table created.



SQL> insert into demo values (200, sysdate);


1 row created.



SQL> commit;


Commit complete.


SQL> select * from demo;


        ID FECHA

---------- ---------
       200 14-FEB-14

Ahora creamos un GRP:


SQL> create restore point my_restorepoint guarantee flashback database;


Restore point created.



Verificamos la creación:

SQL> col name for a22

SQL> col time for a40
SQL> select name, time, guarantee_flashback_database from v$restore_point;

NAME                   TIME                                     GUA

---------------------- ---------------------------------------- ---
MY_RESTOREPOINT        14-FEB-14 08.39.40.000000000 PM          YES


Aqui es donde se ejecutan las acciones que pueden requerir la necesidad de un flashback al restore point. Por ejemplo, pude ser la aplicacion de un parche, una actualización, algún proceso de modificación masiva, etc.

En nuestro ejemplo vamos a eliminar la tabla creada antes de la toma del restore point "MY_RESTOREPOINT".
Obviamente tendríamos otras posibilidades para hacer la recuperación pero quiero mostrar el funcionamiento del flashback.

SQL> drop table demo;

Table dropped.



Si la consultamos, logicamente no la tendremos disponible:

SQL> select * from demo;
select * from demo
              *
ERROR at line 1:
ORA-00942: table or view does not exist

Vamos entonces a realizar la operación de flashback al restore point tomado anteriormente.

Desde linea de comandos paramos la base de datos y luego la montamos en uno sólo de los nodos:

[oracle@server01]$ srvctl stop database -d ORCL


[oracle@server01]$ srvctl start instance -d ORCL -i ORCL1 -o mount;



Nos conectamos a la instancia:


[oracle@server01]$ sqlplus / as sysdba


Verificamos el open_mode:


SQL> select open_mode from v$database;


OPEN_MODE

--------------------
MOUNTED

vemos que efectivamente esta montada.


Realizamos la operación de flashback al restore point:


SQL> flashback database to restore point MY_RESTOREPOINT;

Flashback complete.



Abrimos la instancia en modo "open resetlog":


SQL> alter database open resetlogs;

Database altered.



Una vez abierta la base consultamos:

SQL> select log_mode,force_logging,current_scn,flashback_on from v$database;


LOG_MODE     FOR CURRENT_SCN FLASHBACK_ON

------------ --- ----------- ------------------
ARCHIVELOG   NO      2022927 RESTORE POINT ONLY


Comprobamos que la tabla que había sido eliminada después de la toma del restore point, está disponible nuevamente.


SQL> select * from demo;


        ID FECHA

---------- ---------
       200 14-FEB-14

Desde linea de comandos reiniciamos todas las instancias:

[oracle@server01]$ srvctl stop database -d ORCL

[oracle@server01]$ srvctl start database -d ORCL


[oracle@server01]$ srvctl status database -d ORCL

Instance ORCL1 is running on node server01
Instance ORCL2 is running on node server02

Borramos el restore point 

Nos conectamos a una de las instancias:

[oracle@server01]$ sqlplus / as sysdba


SQL> drop restore point MY_RESTOREPOINT;


Restore point dropped.


SQL> col name for a22

SQL> col time for a40
SQL> select name, time, guarantee_flashback_database from v$restore_point;

no rows selected


No hay comentarios:

Publicar un comentario