ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 恢复之非归档模式下数据库非正常关闭的备份与恢复

恢复之非归档模式下数据库非正常关闭的备份与恢复

原创 Linux操作系统 作者:zhengbao_jun 时间:2009-02-11 14:19:36 0 删除 编辑

产品数据库不会处于非归档模式下。而且冷备份的前提是数据库正常关闭,因此,一般不会存在使用非正常关闭的备份来进行数据库的恢复。

本文只是对这种特殊的情况进行一下测试,在实际中应该不会碰到这种情况。


首先,在另一个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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-08-08

  • 博文量
    209
  • 访问量
    871090