当数据库做了DML或DDL操作之后,LGWR进程会将这些操作记录到重做日志中。
Oracle最少要包含两个日志组。 一个日志组可以有多个日志成员,每个成员互为镜像, 内容完全一致。
重做日志损坏严重时,会造成数据库不能打开或造成运行状态下的数据库被中止。特别是当前活动日志组因为文件系统损坏或其它原因
整个损坏时,恢复会是件非常麻烦的事。
下面是几种损坏情况下的恢复方法.
一. 删除损坏的日志组成员
1.确定出现介质失败的日志成员
SELECT member FROM v$logfile WHERE status=‘INVALID‘;
2.如果介质失败的日志成员是当前日志组的成员,则需要将其变为非当前日志组
alter system switch logfile;
3.删除损坏的日志组成员
alter database drop logfile member ‘/u01/app/oracle/oradata/xcldb/REDO1_2.LOG‘;
4.增加日志成员
alter database add logfile member ‘/u01/app/oracle/oradata/xcldb/REDO1_3.LOG‘ to group 组号;
二.非活动日志组损坏
1. open状态下,非活动的日志组成员全部损坏
直接清除掉损坏的日志组,使LGWR进程可以继续。
alter database clear unarchived logfile group 组号;
清除过后,Oracle会重建立日志组的所有成员。
要注意的是,因为之前损坏的日志组成员没有被归档,所以最好重新做好备份。
2. close状态下,非活动(INVALID)的日志组成员全部损坏
可删除原有日志组,增加新日志组
2.1. alter database add logfile group 新组号
(‘/u01/app/oracle/oradata/xcldb/redo4_1.log‘,
‘/u01/app/oracle/oradata/xcldb/redo4_2.log‘) size 10m reuse;
2.2. alter database drop logfile group 旧组号;
2.3. alter database open;
三.当前日志组的所有成员都损坏
3.1. open状态下,当前活动的日志组成员全部损坏
必须使用数据文件备份,归档日志执行基于取消的不完全恢复
1. SQL>startup mount
2. 如果有数据文件备份,将冷备份的数据文件还原回去
3. 执行不完全恢复
SQL>recover database until cancel
SQL>cancel
4.resetlogs方式open数据库
SQL>alter database open resetlogs;
但上面的情况下,很少会有合适的冷备份,可按下面的方法做:
1. 设置两个隐含参数:
SQL>ALTER SYSTEM SET _allow_resetlogs_corruption=TRUE SCOPE=SPFILE;
SQL>ALTER SYSTEM SET _allow_error_simulation=TRUE SCOPE=SPFILE;
_allow_resetlogs_corruption 跳过文件头的一致性检查,强制启动数据库
_allow_error_simulation 增进scn
如果使用了隐含参数仍不能打开的话,就只能再采取其它方法做恢复了。
2.使用修改过后的pfile来启动数据库
SQL>shutdown immediate
SQL>startup
如果有开闪回区,关掉闪回
SQL>alter database flashback off;
3. open数据库
SQL>alter database open resetlogs;
4. 此时数据库的当前日志仍在被损坏的日志组上
强制切换日志组
SQL>alter system switch logfile;
再次查询日志状态,直到日志组转到其它日志组上
SQL> select a.group#,a.status,b.member from v$log a,v$logfile b where a.group#=b.group#;
5. 将非当前的已损坏的那个日志组给删了
SQL> alter database drop logfile group 损坏了的组号;
SQL> alter system switch logfile;
SQL> alter database add logfile group 新组号
(‘/u01/app/oracle/oradata/xcldb/redo4_1.log‘,
‘/u01/app/oracle/oradata/xcldb/redo4_2.log‘) size 10m reuse;
SQL> alter system switch logfile;
再次查询确认下日志状态
SQL> select a.group#,a.status,b.member from v$log a,v$logfile b where a.group#=b.group#;
6. 经过上面的步骤,数据库应当已正常了,此时只要把隐含参数拿掉重启就正式结束恢复了。
SQL>ALTER SYSTEM SET _allow_resetlogs_corruption=FALSE SCOPE=SPFILE;
SQL>ALTER SYSTEM SET _allow_error_simulation=FALSE SCOPE=SPFILE;
SQL>shutdown immediate
SQL>startup
3.2. close状态下,当前活动的日志组成员全部损坏
因为是关闭状态,数据文件,控制文件等都处于完全一致的状态
SQL>recover database until cancel
SQL>alter database open resetlogs;
resetlogs 选项打开数据库后,会重建所有日志成员,并且过去
的备份不能直接使用,所以需重新备份所有数据文件和控制文件。
MAIL: xcl_168@aliyun.com
BLOG: http://blog.csdn.net/xcl168
(06)重做日志损坏的恢复,布布扣,bubuko.com
(06)重做日志损坏的恢复
原文:http://blog.csdn.net/xcl168/article/details/19945965