产品数据库不会处于非归档模式下。而且冷备份的前提是数据库正常关闭,因此,一般不会存在使用非正常关闭的备份来进行数据库的恢复。
本文只是对这种特殊的情况进行一下测试,在实际中应该不会碰到这种情况。
首先,在另一个SESSION循环插入数据,然后非正常关闭数据库,并在这种情况下备份数据库:
SQL> CONN /@TEST1 AS SYSDBA
已连接。
SQL> SHUTDOWN ABORT
ORACLE 例程已经关闭。
SQL> HOST COPY F:ORACLEORADATATEST1* F:ORACLEBACKUPTEST120060305
Oracle文档并不推荐备份联机日志文件,但是对于非归档模式下,非正常关闭的数据库来说,备份了联机日志文件至少可以保证数据库可以一致性打开。
打开数据库,进行数据的修改:
SQL> STARTUP
ORACLE 例程已经启动。
Total System Global Area 76619308 bytes
Fixed Size 454188 bytes
Variable Size 50331648 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> SELECT COUNT(*) FROM YANGTK.TEST;
COUNT(*)
----------
20001
SQL> DELETE YANGTK.TEST WHERE ID > 1;
已删除19000行。
SQL> COMMIT;
提交完成。
SQL> ALTER SYSTEM SWITCH LOGFILE;
系统已更改。
下面利用刚才生成的备份进行数据库的恢复,由于数据库只进行了少量的操作,备份之后所有的操作都存在于联机日志文件中,且联机日志文件还没有被重用。
这个时候的恢复可以选择是否恢复备份的联机日志文件。如果不恢复备份的联机日志文件,数据库是可以不丢失数据打开的:
SQL> SHUTDOWN IMMEDIATE
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> HOST COPY F:ORACLEBACKUPTEST120060305*.CTL F:ORACLEORADATATEST1
SQL> HOST COPY F:ORACLEBACKUPTEST120060305*.DBF F:ORACLEORADATATEST1
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: 更改 36693083 (在 03/05/2006 10:28:00 生成) 对于线程 1 是必需的
ORA-00289: 建议: F:ORACLEORACLE920RDBMSARC01042.001
ORA-00280: 更改 36693083 对于线程 1 是按序列 # 1042 进行的
指定日志: {=suggested | filename | AUTO | CANCEL}
F:ORACLEORADATATEST1REDO01.LOG
ORA-00310: 存档日志包含序列 1043;要求序列 1042
ORA-00334: 归档日志: 'F:ORACLEORADATATEST1REDO01.LOG'
SQL> RECOVER DATABASE USING BACKUP CONTROLFILE
ORA-00279: 更改 36693083 (在 03/05/2006 10:28:00 生成) 对于线程 1 是必需的
ORA-00289: 建议: F:ORACLEORACLE920RDBMSARC01042.001
ORA-00280: 更改 36693083 对于线程 1 是按序列 # 1042 进行的
指定日志: {=suggested | filename | AUTO | CANCEL}
F:ORACLEORADATATEST1REDO03.LOG
ORA-00279: 更改 36724400 (在 03/06/2006 00:57:42 生成) 对于线程 1 是必需的
ORA-00289: 建议: F:ORACLEORACLE920RDBMSARC01043.001
ORA-00280: 更改 36724400 对于线程 1 是按序列 # 1043 进行的
ORA-00278: 此恢复不再需要日志文件 'F:ORACLEORADATATEST1REDO03.LOG'
指定日志: {=suggested | filename | AUTO | CANCEL}
F:ORACLEORADATATEST1REDO01.LOG
ORA-00279: 更改 36724695 (在 03/06/2006 00:59:07 生成) 对于线程 1 是必需的
ORA-00289: 建议: F:ORACLEORACLE920RDBMSARC01044.001
ORA-00280: 更改 36724695 对于线程 1 是按序列 # 1044 进行的
ORA-00278: 此恢复不再需要日志文件 'F:ORACLEORADATATEST1REDO01.LOG'
指定日志: {=suggested | filename | AUTO | CANCEL}
F:ORACLEORADATATEST1REDO02.LOG
已应用的日志。
完成介质恢复。
SQL> ALTER DATABASE OPEN RESETLOGS;
数据库已更改。
查询YANGTK.TEST表就可以发现,数据库数据并未丢失:
SQL> SELECT COUNT(*) FROM YANGTK.TEST;
COUNT(*)
----------
1001
如果采用恢复联机日志文件的方式,则数据库可以正常打开,但是会丢失备份之后所有的修改:
SQL> SHUTDOWN IMMEDIATE
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> HOST COPY F:ORACLEBACKUPTEST120060305* F:ORACLEORADATATEST1
SQL> STARTUP
ORACLE 例程已经启动。
Total System Global Area 76619308 bytes
Fixed Size 454188 bytes
Variable Size 50331648 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> SELECT COUNT(*) FROM YANGTK.TEST;
COUNT(*)
----------
20001
如果是数据库已经运行一段时间,用于将SHUTDOWN ABORT正常打开的联机日志文件已经被重用的情况:
SQL> DELETE YANGTK.TEST WHERE ID > 15;
已删除5000行。
SQL> COMMIT;
提交完成。
SQL> ALTER SYSTEM SWITCH LOGFILE;
系统已更改。
SQL> DELETE YANGTK.TEST WHERE ID > 10;
已删除5000行。
SQL> COMMIT;
提交完成。
SQL> ALTER SYSTEM SWITCH LOGFILE;
系统已更改。
这个时候的恢复如果将联机日志文件恢复,则和刚才的恢复操作没有区别,数据库恢复到备份的时刻,并利用备份时刻的联机日志文件将数据库一致性打开。如果不恢复联机日志文件,或者没有备份当时的联机日志文件:
SQL> SHUTDOWN IMMEDIATE
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> HOST COPY F:ORACLEBACKUPTEST120060305*.CTL F:ORACLEORADATATEST1
SQL> HOST COPY F:ORACLEBACKUPTEST120060305*.DBF F:ORACLEORADATATEST1
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 UNTIL CANCEL USING BACKUP CONTROLFILE
ORA-00279: 更改 36693083 (在 03/05/2006 10:28:00 生成) 对于线程 1 是必需的
ORA-00289: 建议: F:ORACLEORACLE920RDBMSARC01042.001
ORA-00280: 更改 36693083 对于线程 1 是按序列 # 1042 进行的
指定日志: {=suggested | filename | AUTO | CANCEL}
CANCEL
ORA-01547: 警告: RECOVER 成功但 OPEN RESETLOGS 将出现如下错误
ORA-01194: 文件1需要更多的恢复来保持一致性
ORA-01110: 数据文件 1: 'F:ORACLEORADATATEST1SYSTEM01.DBF'
ORA-01112: 未启动介质恢复
这个时候数据库已经无法正常的打开了,这是由于在非正常关闭情况下进行的备份。这时候或者利用更早的备份进行不完整恢复,或者提供备份时刻备份的联机重做日志。
SQL> RECOVER DATABASE UNTIL CANCEL USING BACKUP CONTROLFILE
ORA-00279: 更改 36693083 (在 03/05/2006 10:28:00 生成) 对于线程 1 是必需的
ORA-00289: 建议: F:ORACLEORACLE920RDBMSARC01042.001
ORA-00280: 更改 36693083 对于线程 1 是按序列 # 1042 进行的
指定日志: {=suggested | filename | AUTO | CANCEL}
F:ORACLEBACKUPTEST120060305REDO03.LOG
已应用的日志。
完成介质恢复。
SQL> ALTER DATABASE OPEN RESETLOGS;
数据库已更改。
SQL> SELECT COUNT(*) FROM YANGTK.TEST;
COUNT(*)
----------
20001
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/235507/viewspace-548688/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/235507/viewspace-548688/