viernes, 11 de julio de 2008

Recuperar un datafile borrado accidentalmente sin respaldo

Recientemente me encontré con un problema en producción donde una base de datos misteriosamente había perdido un datafile recientemente agregado. Pareciera como si le hubieran dado un "rm /data/file.dbf" lo cual parece ser el problema, ya que la referencia al datafile quería ser eliminada. Vale la pena decir que en Locally Managed Tablespaces sólo se pueden eliminar datafiles que están online, por esta razón se debía de recuperar el datafile perdido para poder eliminarlo.

La base de datos en cuestión estaba en estado de abierta, pero el tablespace al que pertenecía este datafile se quedó offline y no se podía poner online.

Hay muchas formas de sobrepasar este problema, si el tablespace hubiera sido de índices, se podrían haber recreado todos los índices en un nuevo tablespace y simplemente haber realizado un drop del tablespace.

En este caso, lo que se realizo fue recrear el datafile nuevamente y recupear para poner online el tablespace y poder hacer el drop del datafile.

Voy a ejemplificar el problema en windows (que por la naturaleza del sistema operativo, no se puede borrar accidentalmente el datafile).


SQL> create tablespace prueba
2> datafile 'c:\prueba01.dbf' size 10m,
3> 'c:\prueba02.dbf' size 10m;

Tablespace creado.

SQL> shutdown ;
Base de datos cerrada.
Base de datos desmontada.
Instancia ORACLE cerrada.

SQL> $ del c:\prueba02.dbf

SQL> startup
Instancia ORACLE iniciada.

Total System Global Area 289406976 bytes
Fixed Size 1290184 bytes
Variable Size 264241208 bytes
Database Buffers 16777216 bytes
Redo Buffers 7098368 bytes
Base de datos montada.
ORA-01157: no se puede identificar/bloquear el archivo de datos 8 - consulte el archivo de rastreo del DBWR
ORA-01110: archivo de datos 8: 'C:\PRUEBA02.DBF'

SQL> select * from v$recover_file;

FILE# ONLINE ONLINE_ ERROR
---------- ------- ------- --------------
8 ONLINE ONLINE FILE NOT FOUND


Como se puede ver, la base de datos no encuentra el datafile que hemos borrado. No se tiene un respaldo del mismo, pero hay una forma de recuperarlo.


SQL> alter database create datafile 8 as 'C:\PRUEBA02.DBF' size 10m;

Base de datos modificada.

SQL> recover datafile 8;
Recuperaci¾n del medio fÝsico terminada.
SQL> alter database open;

Base de datos modificada.


Se puede recrear usando "alter database create datafile 8 as..." o bien "alter database create datafile 'c:\PRUEBA02.DBF' as...".

De esta forma recreamos el datafile al origen del mismo, y al recuperar el datafile aplicamos los cambios que la base tiene registrados para el mismo.

La recuperación del datafile se puede realizar con rman:


C:\Documents and Settings>rman target /

Recovery Manager : Release 10.2.0.3.0

Copyright (c) 1982, 2005, Oracle. All rights reserved.

conectado a la base de datos destino: ORCL (DBID=524232147, no abierto)

RMAN> restore datafile 8;

Iniciando restore en 11/07/08
se utiliza el archivo de control de la base de datos destino en lugar del catßlogo de recuperaci¾n
canal asignado: ORA_DISK_1
canal ORA_DISK_1: sid=155 devtype=DISK

creando archivo de datos fno=8 nombre=C:\PRUEBA02.DBF
no se ha realizado la restauraci¾n; todos los archivos son de s¾lo lectura, offline o ya se han restaur
restore terminado en 11/07/08

RMAN> recover datafile 8;

Iniciando recover en 11/07/08
se utiliza el archivo de control de la base de datos destino en lugar del catßlogo de recuperaci¾n
canal asignado: ORA_DISK_1
canal ORA_DISK_1: sid=159 devtype=DISK

iniciando la recuperaci¾n del medio fÝsico
recuperaci¾n del medio fÝsico terminada, tiempo transcurrido: 00:00:02

recover terminado en 11/07/08

RMAN> exit

C:\Documents and Settings>sqlplus "/ as sysdba"

SQL*Plus: Release 10.2.0.3.0

Copyright (c) 1982, 2006, Oracle. All Rights Reserved.


Conectado a:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> alter database open;

Sistema modificado.



Una vez recuperado el datafile, se puede eliminar de la siguiente forma:


SQL> alter tablespace prueba drop datafile 8;

Tablespace modificado.