说明一:归档模式下当前日志的损坏有两种情况:
一、是数据库是正常关闭,日志文件中没有未决的事务需要实例恢复,当前日志组的损坏就可以直接用alter database clear unarchived logfile group n来重建。二、是日志组中有活动的事务,数据库需要介质恢复,日志组需要用来同步,有两种补救办法
A. 最好的办法就是通过不完全恢复,可以保证数据库的一致性,但是这种办法要求在归档方式下,并且有可用的备份
B. 通过强制性恢复即基于cancel,但是可能导致数据库不一致。
基于CANCEL的不一致恢复如下:
可以采用获取最近的SCN的办法用until scn恢复或用until cancel恢复
recover database until cancel 或者SCN号,
先选择auto,尽量恢复可以利用的归档日志,然后重新
recover database until cancel
这次输入cancel,完成不完全恢复,也就是说恢复两次。类似如下:
SQL> recover database until cancel;
Auto
……
SQL> recover database until cancel;
Cancel;
说明二:非当前日志损坏
1)、如果损坏的是非当前的联机日志文件,一般只需要clear就可以重建该日志文件,但是如果该数据库处于归档状态但该日志还没有归档,就需要强行clear。2)、建议clear,特别是强行clear后作一次数据库的全备份。
3)、此方法适用于归档与非归档数据库。
3.测试数据库-归档模式示例如下:
在startup时报如下错误:
SQL> alter database open;alter database open
*
ERROR at line 1:
ORA-16038: log 1 sequence# 56 cannot bearchived
ORA-19809: limit exceeded for recovery files
ORA-00312: online log 1 thread 1:'/u02/oradata/orcl/redo01.log'
从v$log中找到当前日志状态,可知当前日志组是3,而group 1还未归档;
SQL> select group#,sequence#,archived,status fromv$log;
GROUP# SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
1 56 NO INACTIVE
3 58 NO CURRENT
2 57 NO INACTIVE
用alter database clear logfile命令尝试重构logfile group1,失败;
SQL> alter database clear logfile group 1;
alter database clear logfile group 1
*
ERROR at line 1:
ORA-00350: log 1 of instance orcl (thread 1) needsto be archived
ORA-00312: online log 1 thread 1:'/u02/oradata/orcl/redo01.log'
失败的原因是group 1还没有归档,需要加上”unarchived”参数;
SQL> alter database clear unarchived logfilegroup 1;
Database altered.
成功后可以正常open了;
SQL> alter database open;
Database altered.