Recuperación parcial de una base de datos Oracle, cuando se ha perdido un datafile y base de datos se encuentra en modo NOARCHIVELOG

April 2nd, 2011 por Felipe Manriquez
gravatar
Compartir este post:
  • Google Reader
  • Google Plus
  • Identi.ca
  • Meneame
  • PDF
  • Print
  • Twitter
  • Facebook
  • Email
  • LinkedIn

Hace algunos dias se me presentó el siguiente caso:

1.- Base de datos Oracle 9i sobre Windows XP

2.- Base de datos se encuentra en modo NOARCHIVELOG

3.- Programador agrega un datafile con file# 20 a un tablespaces llamado MYTABLESPACE

4.- De esta forma, el tablespace MYTABLESPACE contiene 3 datafile con file# 15, 17 y 20

5.- Al programador no le gustó el nombre que le dió al datafile 20 y lo elimina a nivel de sistema operativo

6.- El programador tambien elimina por error el datafile 17, que si contenia datos.

7.- El programador trata de subir la base de datos y esta no sube, solo llega a la fase de montaje.

8.- El programador entra en pánico.

Solución:

1.- Tratar de recuperar los datafiles a nivel de sistema operativo con alguna herramienta de recuperación como http://ntfsundelete.com/ u otra similar.

2.- Si el punto 1 no funciona hay que recrear los datafile que se perdieron. Con la base de datos montada y como usuario SYS AS SYSDBA, ejecutar

SQL> ALTER DATABASE CREATE DATAFILE 17;

SQL> ALTER DATABASE CREATE DATAFILE 20;

Oracle recrea estos datafiles vacios con la información de estructura que se encuentra en el archivo de control,  pero sin capacidad de que sean utiles porque tienen todos sus bloques vacios..

3.- Recuperar la informacion de los datafiles, a partir de la información en los archivos de online redolog  y/o archive redolog.

SQL> RECOVER DATAFILE 17; /* no se pudo recuperar */

SQL> RECOVER DATAFILE 20; /* si se recuperó */

4.- Si la recuperacion en ambos casos opera correctamente, vale decir le bastó con los archivos de online redolog para realizar la recuperación, podemos decir Eureka!! y abrir la base de datos

SQL> ALTER DATABASE OPEN;

5.-Si la recuperacion no se pudo realizar, como me pasó a mi con el datafile # 17,  porque la base de datos no se encontraba en modo ARCHIVELOG, estamos en un caso en que hay pérdida de información. Para eso, hay que decirle al archivo de control que el archivo que se perdió será marcado logicamente con un flag o status (OFFLINE o RECOVER). Esto permitirá a Oracle abrir la base de datos, pero las tablas que tenian datos en el archivo que se perdió no podrán ser recuperadas.

SQL> ALTER DATABASE DATAFILE 17 OFFLINE DROP;

7.- Ahora podremos abrir la base de datos

SQL> ALTER DATABASE OPEN;

8.- Los objetos Oracle que se encontraban en el tablespace MYTABLESPACE se perdieron. Se puede recuperar su estructura, la cual se encuentra en el diccionario Oracle (tablespace SYSTEM), pero no los datos. Lo que se debe hacer es eliminar ese tablespace para dejar la base de datos completamente limpia.

Saludos

Felipe Manriquez