如果全部控制文件丢失,但是包含以前控制文件的备份,这时可以利用备份的控制文件进行恢复,不过在恢复后需要以RESETLOGS方式打开数据库。
根据联机重做日志文件是否可用和数据文件是否是最新的可以分为四种不同情况,这篇文章描述的是,联机重做日志可用,且数据文件是最新的情况。
一般重做日志全部丢失的话,数据库肯定会马上关闭。本测试为了模拟联机日志中包含待恢复数据的情况,在后台运行存储过程插入数据时,在另外的session使用SHUTDOWN ABORT关闭数据库。
SQL> CONN /@TEST AS SYSDBA
已连接。
SQL> SHUTDOWN ABORT
ORACLE 例程已经关闭。
数据库关闭后删除所有控制文件。
SQL> HOST DEL F:ORACLEORADATATEST*.CTL
然后利用备份的控制文件进行恢复
SQL> HOST COPY F:ORACLEBACKUPTEST20060215*.CTL F:ORACLEORADATATEST
SQL> STARTUP MOUNT
ORACLE 例程已经启动。
Total System Global Area 76619308 bytes
Fixed Size 454188 bytes
Variable Size 50331648 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
利用备份的控制文件启动,需要使用USING BACKUP CONTROLFILE语句。
SQL> RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL
ORA-00279: 更改 45609576 (在 02/15/2006 19:28:34 生成) 对于线程 1 是必需的
ORA-00289: 建议: F:ORACLEORADATATESTARCHIVEARC00059.001
ORA-00280: 更改 45609576 对于线程 1 是按序列 # 59 进行的
指定日志: {=suggested | filename | AUTO | CANCEL}
AUTO
ORA-00279: 更改 45610708 (在 02/16/2006 01:35:15 生成) 对于线程 1 是必需的
ORA-00289: 建议: F:ORACLEORADATATESTARCHIVEARC00060.001
ORA-00280: 更改 45610708 对于线程 1 是按序列 # 60 进行的
ORA-00278: 此恢复不再需要日志文件 'F:ORACLEORADATATESTARCHIVEARC00059.001'
ORA-00279: 更改 45610901 (在 02/16/2006 01:36:55 生成) 对于线程 1 是必需的
ORA-00289: 建议: F:ORACLEORADATATESTARCHIVEARC00061.001
ORA-00280: 更改 45610901 对于线程 1 是按序列 # 61 进行的
ORA-00278: 此恢复不再需要日志文件 'F:ORACLEORADATATESTARCHIVEARC00060.001'
ORA-00279: 更改 45612925 (在 02/16/2006 01:39:10 生成) 对于线程 1 是必需的
ORA-00289: 建议: F:ORACLEORADATATESTARCHIVEARC00062.001
ORA-00280: 更改 45612925 对于线程 1 是按序列 # 62 进行的
ORA-00278: 此恢复不再需要日志文件 'F:ORACLEORADATATESTARCHIVEARC00061.001'
ORA-00308: 无法打开存档日志 'F:ORACLEORADATATESTARCHIVEARC00062.001'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
ORA-01547: 警告: RECOVER 成功但 OPEN RESETLOGS 将出现如下错误
ORA-01194: 文件1需要更多的恢复来保持一致性
ORA-01110: 数据文件 1: 'F:ORACLEORADATATESTSYSTEM01.DBF'
最后出现的错误是由于SHUTDOWN ABORT后,使用备份的控制文件造成的。Oracle需要应用当前的重做日志文件来进行恢复,但是由于使用了备份的控制文件,备份之后的归档日志信息丢失,因此,这时需要手工输入需要恢复的联机重做日志文件。
其实这个时候是可以通过REDO的循环使用推断出最后需要使用的联机日志的。
SQL> SELECT GROUP#, SEQUENCE#, STATUS FROM V$LOG;
GROUP# SEQUENCE# STATUS
---------- ---------- ----------------
1 59 CURRENT
2 57 INACTIVE
3 58 INACTIVE
这时已经可以推断GROUP2将是60,GROUP3是61,而GROUP1则是62。不过在输入重做日志进行恢复时,即使输入错文件也没有关系,Oracle会提示错误。如果输入正确的重做日志,则Oracle会完成介质恢复。
SQL> RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL
ORA-00279: 更改 45612925 (在 02/16/2006 01:39:10 生成) 对于线程 1 是必需的
ORA-00289: 建议: F:ORACLEORADATATESTARCHIVEARC00062.001
ORA-00280: 更改 45612925 对于线程 1 是按序列 # 62 进行的
指定日志: {=suggested | filename | AUTO | CANCEL}
F:ORACLEORADATATESTREDO03.LOG
ORA-00310: 存档日志包含序列 61;要求序列 62
ORA-00334: 归档日志: 'F:ORACLEORADATATESTREDO03.LOG'
ORA-01547: 警告: RECOVER 成功但 OPEN RESETLOGS 将出现如下错误
ORA-01194: 文件1需要更多的恢复来保持一致性
ORA-01110: 数据文件 1: 'F:ORACLEORADATATESTSYSTEM01.DBF'
SQL> RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL
ORA-00279: 更改 45612925 (在 02/16/2006 01:39:10 生成) 对于线程 1 是必需的
ORA-00289: 建议: F:ORACLEORADATATESTARCHIVEARC00062.001
ORA-00280: 更改 45612925 对于线程 1 是按序列 # 62 进行的
指定日志: {=suggested | filename | AUTO | CANCEL}
F:ORACLEORADATATESTREDO01.LOG
已应用的日志。
完成介质恢复。
SQL> ALTER DATABASE OPEN RESETLOGS;
数据库已更改。
恢复到这里已经完成,现在需要做的是马上进行数据库的备份。