重做日志文件是ORACLE数据库不可缺少的组成部分,Oracle服务器将对数据库所有更改按顺序记录到重做日志缓冲区中,LGWR进程把重做条目从重做日志缓冲区写入联机重做日志文件中,在发生介质故障时,会提供恢复机制,这也是ORACLE数据库保证数据安全的一种手段。
在真实的环境中,可能会因为误删除或其他原因,丢失了重做日志文件,如果数据库在启动时检测到重做日志丢失,数据库将无法启动。如果数据库在运行时切换日志文件组,检测到下一组或者全部的重做日志丢失,数据库将会崩溃。所以有必要学习下Oracle重做日志恢复的技巧。
以下是模拟了一些丢失重做日志文件场景恢复过程,以供参考。
一、 丢失非活动日志文件的恢复
如果丢失的日志文件组状态为‘INACTIVE’,说明该日志组已经完成检查点,数据库不会发生数据丢失,但是千万不能够忽视,因为当日志切换到该日志组时会发生错误。恢复的方法有很多种,以下罗列了三种方法:
测试环境
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
PL/SQL Release 11.1.0.6.0 - Production
CORE 11.1.0.6.0 Production
TNS for Linux: Version 11.1.0.6.0 - Production
NLSRTL Version 11.1.0.6.0 – Production
SQL> select group#,members,status from v$log;
GROUP# MEMBERS STATUS
---------- ---------- ----------------
1 2 INACTIVE
2 1 CURRENT
3 2 INACTIVE
模拟故障
[oracle@mylinux2 ~]$ rm /u01/oradata/orcl/redo01.log
当数据库日志切换到该日志组后,发现日志文件不存在,数据库将会崩溃,除了DBA外其他用户都不能连接到数据库。
从警告日志可得到下面信息:
Sun Aug 08 15:57:51 2010
Errors in file /u01/diag/rdbms/orcl/dave/trace/dave_m000_10925.trc:
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: '/u01/oradata/orcl/redo01.log'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
启动数据库,会提示丢失了日志文件。
SQL> startup
ORACLE instance started.
Total System Global Area 422678528 bytes
Fixed Size 1300324 bytes
Variable Size 251660444 bytes
Database Buffers 163577856 bytes
Redo Buffers 6139904 bytes
Database mounted.
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: '/u01/oradata/orcl/redo01.log'
执行恢复(三种恢复方法)
l 直接删除丢失的重做日志文件组,但是删除后必须保证数据库的重做日志组数目不能小于2个。
a) 删除重做日志文件组:
SQL> alter database drop logfile group 1;
Database altered.
b) 增加重做日志文件组:
SQL>alter database add logfile group 1 ('/u01/oradata/orcl/redo1.log','/u01/oradata/orcl/redo01.log') size 50m;
Database altered.
l 在丢失的重做日志组中增加同样大小的REDO文件,然后删除丢失的MEMBER。
a) 增加重做日志文件成员:
SQL> alter database add logfile member '/u01/oradata/orcl/redo01.log' to group 1;
Database altered.
b) 删除丢失的日志文件:
SQL> alter database drop logfile member '/u01/oradata/orcl/redo1.log';
Database altered.
c) 这种方法只适合丢失的文件组中至少还有一个成员是可用的,如果丢失的日志文件所属的文件组只有这一个文件,那么这种方法是不适合的。在添加日志文件时会出错:
SQL> alter database add logfile member '/u01/oradata1/redo1.log' to group 1;
alter database add logfile member '/u01/oradata1/redo01.log' to group 1
*
ERROR at line 1:
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: '/u01/oradata/orcl/redo01.log'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
l 通过clear日志恢复
SQL> alter database clear logfile group 1;
Database altered.
SQL> alter database open;
Database altered.
需要说明的是,如果数据库处于归档模式下,则需要使用下面的命令来清除日志:
alter database clear unarchived logfile group 1;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12751636/viewspace-683981/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/12751636/viewspace-683981/