ORA-00310: 存档日志包含序列 ;要求序列

 

控制文件数据文件 备份不同时  恢复尝试
【问题与背景】

使用备份控制文件恢复,是不是一定恢复不了在线日志中的数据吗?
答案是错误的,其实也能完全恢复(当然我们用trace更好)

还原用到的主要语句

select GROUP#,SEQUENCE#,archived, STATUS from v$log;

    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  CURRENT
         2          3 YES ACTIVE
         3          4 YES ACTIVE
查看当前归档日志情况


select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
查找当前数据库重作日志文件scn号和控制文件scn号

SQL> recover database using backup controlfile until cancel; -->>这个cancel是表示每次应用一个日志时都提示一下,直到输入cancel后结束
                                                                 cancel选项允许每次前滚一个日志文件,当需要停止恢复时,输入cancel
                                                                 ,在这种方式下不会自动运用联机日志文件.
原理:
在用备份redo日志还原到最接近控制文件scn号的时候在指定在在线日志文件进行恢复
使得在线日志文件强制应用来恢复数据文件

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
C:\oracle\oradata\testdb\REDO01.LOG

 

现在开始模拟
有控制文件备份,先于控制文件备份的所有数据文件备份

使用在线日志进行完全恢复


SQL> startup
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> create table arch (status varchar(2)) tablespace users;

表已创建。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'ok' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> insert into arch select * from arch;

已创建6166行。

SQL> /

已创建12332行。

SQL> /

已创建24664行。

SQL> /

已创建49328行。

SQL> commit;

提交完成。

SQL> alter system switch logfile;

系统已更改。

SQL> insert into arch select 'no' from dba_objects;

已创建6166行。

SQL> commit;

提交完成。

SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;

    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  CURRENT
         2          3 YES ACTIVE
         3          4 YES ACTIVE

SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69410

SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

还原备份控制文件,还原所有备份数据文件
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-00314: 日志 1 (线程 1),预计序号  与  不匹配
ORA-00312: 联机日志 1 线程 1: 'C:\ORACLE\ORADATA\TESTDB\REDO01.LOG'


SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 69257 (在 02/28/2010 11:08:18 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: 更改 69257 对于线程 1 是按序列 # 3 进行的


指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
介质恢复已取消。
SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69257

SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 69257 (在 02/28/2010 11:08:18 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: 更改 69257 对于线程 1 是按序列 # 3 进行的


指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: 更改 69362 (在 03/04/2010 11:21:25 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: 更改 69362 对于线程 1 是按序列 # 4 进行的
ORA-00278: 此恢复不再需要日志文件 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF'


指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: 更改 69408 (在 03/04/2010 11:21:26 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69408 对于线程 1 是按序列 # 5 进行的
ORA-00278: 此恢复不再需要日志文件 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF'


指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00308: 无法打开存档日志 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。


SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69408
            
~~~~~~~~~~~~~~            
到此是不完全恢复
那我们是不是可以
应用在线日志呢,那
我们先应用SEQUENCE=3和4
的日志C:\oracle\oradata\testdb\REDO02.LOG
C:\oracle\oradata\testdb\REDO03.LOG
我们可以看到恢复时这个文件不需要
~~~~~~~~~~~~~~~            

SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 69408 (在 03/04/2010 11:21:26 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69408 对于线程 1 是按序列 # 5 进行的


指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
C:\oracle\oradata\testdb\REDO02.LOG
ORA-00310: 存档日志包含序列 3;要求序列 5
ORA-00334: 归档日志: 'C:\ORACLE\ORADATA\TESTDB\REDO02.LOG'


SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 69408 (在 03/04/2010 11:21:26 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69408 对于线程 1 是按序列 # 5 进行的


指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
C:\oracle\oradata\testdb\REDO03.LOG
ORA-00310: 存档日志包含序列 4;要求序列 5
ORA-00334: 归档日志: 'C:\ORACLE\ORADATA\TESTDB\REDO03.LOG'


SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69408

~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我们看到非活动在线日志没有被应用
我们应用SEQUENCE=5
的日志C:\oracle\oradata\testdb\REDO01.LOG
我们可以看到恢复时这个文件是需要的
~~~~~~~~~~~~~~~  
SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 69408 (在 03/04/2010 11:21:26 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69408 对于线程 1 是按序列 # 5 进行的


指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
C:\oracle\oradata\testdb\REDO01.LOG --这步是关键
已应用的日志。
完成介质恢复。
SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69418 --在SEQUENCE=5中的SCN被应用了

SQL> alter database open resetlogs;

数据库已更改。

SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;

RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              69418               69516

SQL> select count(*),status from arch group by status;

  COUNT(*) ST
---------- --
      6166 no
     98656 ok
-->>完全恢复

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值