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
Hola bonita tarde, llevo todo el dia, tratando de restaurar un datafile, lo habia eliminado del so con shift+supr pero cuando trate de levantar mi bd, resultaba q me marcaba un error por culpa del df que habia borrado, estaba desesperada por que solo me montaba la bd y no la abria, solo podia ver el datafile con una vista, pero con dba no me dejaba, estaba histerica a las 3 de la tarde, pero ahora ya soy feliz :D, bueno he restaurado mi datafile, pero ahora si lo renombrare y lo cambiare de lugar, veremos que sucede, si tdo sale bien, estare publicando los resultados, hasta ahora todo va bien. saludos y muchas gracias por el post.
Estimada Marina
Gracias por tu comentario. Nos alegramos que este blog sea de ayuda a la comunidad. Te agradeceriamos que pudieras compartir tu experiencia. Los internautas tambien pueden hacer aportes y ayudar a otros usuarios.
Saludos
Felipe
Hola, tengo una duda, a ver si me pueden ayudar:
Tengo que hacer una recuperación de prueba, para ver si los backups que hacemos funcionan correctamente. El problema es que por ser pruebas
tenemos que utilizar máquinas más pequeñas que las de producción, y no tienen tanta capacidad de disco. Por tanto, la misma BD que hay en producción no cabría en la máquina que donde voy a restaurar. Me han dicho que haga un restauración parcial, y levante la BD sólo con los tbsp de sistema (SYSTEM,SYSAUX,UNDO…). Nunca he hecho este proceso, y me gustaría saber si alguien lo ha hecho que lo explique un poco, aunque sea a nivel teórico.
Muchas gracias de antemano.
Saludos!