Luego de un corte de energía, la base de
datos daba el siguiente error:
SQL>ALTER
DATABASE OPEN
ORA-01113:
file 5 needs media recovery
ORA-01110: data file
5: ‘D:\ORACLE\PRODUCT\10.1.0\ORADATA\PROD\DATOS01.DBF’
Revisando el
alert.log pude observer que al momento del corte estaba hacienda un backup
online, pues la sentencia anterior al startup era un ALTER TABLESPACE … BEGIN BACKUP:
Sat Aug 18 01:05:28 2012
ARC1: Evaluating archive thread 1 sequence
74097
ARC1: Unable to archive thread 1 sequence
74097
Log actively being archived by another process
Sat Aug 18 01:05:28 2012
Committing creation of archivelog
'D:\ARCHIVED_LOGS\ARCHIVED_PROD\ARCH_PROD_1_74097_611589480.ARC'
Sat Aug 18 01:05:29 2012
ALTER TABLESPACE "DATOS" BEGIN BACKUP
Completed: ALTER TABLESPACE
"DATOS" BEGIN BACKUP
Starting up ORACLE RDBMS Version: 10.1.0.5.0.
System parameters with non-default values:
processes = 150
sga_max_size =
1258291200
__shared_pool_size =
620756992
__large_pool_size = 8388608
__java_pool_size = 8388608
sga_target = 1258291200
control_files =
D:\ORACLE\PRODUCT\10.1.0\ORADATA\PROD\CONTROL01.CTL,
D:\ORACLE\PRODUCT\10.1.0\ORADATA\PROD\CONTROL02.CTL,
D:\ORACLE\PRODUCT\10.1.0\ORADATA\PROD\CONTROL03.CTL
db_block_size = 8192
__db_cache_size =
612368384
compatible =
10.1.0.5.0
log_archive_dest_1 =
LOCATION=D:\archived_logs\archived_prod\ MANDATORY
log_archive_format =
arch_prod_%t_%s_%r.arc
db_file_multiblock_read_count= 16
db_recovery_file_dest =
D:\oracle\product\10.1.0\flash_recovery_area
db_recovery_file_dest_size= 2147483648
undo_management = AUTO
undo_tablespace =
UNDOTBS1
remote_login_passwordfile= EXCLUSIVE
db_domain =
dispatchers =
(PROTOCOL=TCP) SERVICE=orclprodXDB)
job_queue_processes = 10
background_dump_dest =
D:\ORACLE\PRODUCT\10.1.0\ADMIN\PROD\BDUMP
user_dump_dest =
D:\ORACLE\PRODUCT\10.1.0\ADMIN\PROD\UDUMP
core_dump_dest =
D:\ORACLE\PRODUCT\10.1.0\ADMIN\PROD\CDUMP
db_name =
prod
open_cursors = 300
pga_aggregate_target =
209715200
Sat Aug 18 08:48:33 2012
starting up 1 dispatcher(s) for network
address '(ADDRESS=(PARTIAL=YES)(PROTOCOL=TCP))'...
CJQ0 started with pid=9, OS id=3440
RECO started with pid=8, OS id=3428
Sat Aug 18 08:48:33 2012
starting up 1 shared server(s) ...
PMON started with pid=2, OS id=3332
DBW0 started with pid=4, OS id=3368
LGWR started with pid=5, OS id=3380
CKPT started with pid=6, OS id=3400
MMAN started with pid=3, OS id=3348
Oracle Data Guard is not available in this
edition of Oracle.
Sat Aug 18 08:48:35 2012
alter database mount exclusive
Sat Aug 18 08:48:35 2012
Controlfile identified with block size
16384
SMON started with pid=7, OS id=3416
Sat Aug 18 08:48:39 2012
Setting recovery target incarnation to 1
Sat Aug 18 08:48:40 2012
Successful mount of redo thread 1, with
mount id 1589792867
Sat Aug 18 08:48:40 2012
Database mounted in Exclusive Mode.
Completed: alter database mount exclusive
Sat Aug 18 08:48:40 2012
alter database open
ORA-1113 signalled during: alter database open...
Lo que hice entonces es hacer un END BACKUP,
y luego pudo abrir sin problemas:
SQL> ALTER
TABLESPACE DATOS END BACKUP;
Tablespace
altered.
SQL >
ALTER DATABASE OPEN;
Database altered.
Explicación
El BEGIN BACKUP
realizado sobre el tablespace “congela” algunas secciones de los headers de los
datafiles, y a partir de ese momento, en redo se genera una marca de comienzo,
y se registran las modificaciones. En los datafiles en las secciones de datos también
se van registran los cambios. Cuando levantamos la base, parte de ese header se
encuentra desactualizado por lo que para Oracle el datafile requiere una
recuperación. Al realizarse el END BACKUP esos headers se actualizan, y en los
redologs se registra una marca de fin.
Otras formas de
solucionar el problema
Asi mismo, se podría
hacer también un ALTER DATABASE END BACKUP, lo cual quita de modo backup todos
los tablespaces que pudieran habre quedado marcados:
SQL> STARTUP MOUNT
SQL> ALTER DATABASE END BACKUP;
IMPORTANTE: no
utilizar end backup si no se esta seguro si los datafiles están actualizados,
esto es, si hubo una restauración de algún backup hay que realizar un recover como se indica:
SQL>
STARTUP MOUNT
SQL>
RECOVER DATABASE;
Referencias