一般情况下,是无法利用RESETLOGS操作之前的备份进行数据库的恢复的。但是在特定条件下利用RESETLOGS之前的备份进行恢复是可行的。
本文讨论表空间级的恢复过程。
利用RESETLOGS操作之前的表空间的备份的前提是,表空间在备份时处于READ ONLY或正常脱机状态,且在RESETLOGS操作之前一直处于这个状态。
下面假设由于发生故障,导致控制文件的丢失,利用备份的控制文件恢复后,以RESETLOGS方式打开数据库。
SQL> CONN /@TEST AS SYSDBA
已连接。
SQL> SHUTDOWN IMMEDIATE
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> HOST DEL F:ORACLEORADATATEST*.CTL
SQL> HOST COPY F:ORACLEBACKUPTEST20060308CONTROL01.CTL F:ORACLEORADATATEST
SQL> HOST COPY F:ORACLEBACKUPTEST20060308CONTROL01.CTL F:ORACLEORADATATESTCONTROL02.CTL
SQL> HOST COPY F:ORACLEBACKUPTEST20060308CONTROL01.CTL F:ORACLEORADATATESTCONTROL03.CTL
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
数据库装载完毕。
SQL> RECOVER DATABASE USING BACKUP CONTROLFILE
ORA-00279: 更改 46367789 (在 03/09/2006 18:52:07 生成) 对于线程 1 是必需的
ORA-00289: 建议: F:ORACLEORADATATESTARCHIVEARC00004.001
ORA-00280: 更改 46367789 对于线程 1 是按序列 # 4 进行的
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
F:ORACLEORADATATESTREDO03.LOG
已应用的日志。
完成介质恢复。
SQL> ALTER DATABASE OPEN RESETLOGS;
数据库已更改。
数据库以RESETLOGS方式应该马上进行备份,因为这时绝大部分之前的备份已经失效。只有在备份时就处于READ ONLY和正常OFFLINE的表空间的备份可以利用。但是,必须保证表空间的状态在RESETLOGS打开之前一直不变,而RESETLOGS之后变化则没有问题。
SQL> ALTER TABLESPACE INDX READ WRITE;
表空间已更改。
SQL> ALTER TABLESPACE TOOLS ONLINE;
表空间已更改。
SQL> ALTER TABLESPACE TOOLS OFFLINE;
表空间已更改。
SQL> ALTER TABLESPACE INDX OFFLINE;
表空间已更改。
SQL> HOST COPY F:ORACLEBACKUPTEST20060308INDX01.DBF F:ORACLEORADATATEST
www.ixdba.net
SQL> HOST COPY F:ORACLEBACKUPTEST20060308TOOLS01.DBF F:ORACLEORADATATEST
SQL> RECOVER TABLESPACE TOOLS;
完成介质恢复。
SQL> RECOVER TABLESPACE INDX;
完成介质恢复。
SQL> ALTER TABLESPACE TOOLS ONLINE;
表空间已更改。
SQL> ALTER TABLESPACE INDX ONLINE;
表空间已更改。