Oracle current redo.log出现坏块后的不完全恢复案例一则

1异常出现

     8月30日下午2时左右,接同事电话,说数据库异常宕机了,现在启动不了。

2初步分析

  我让现场把alert.log发过来,先看看是什么问题。


 

    关于ORA-00353和ORA-00334,先查一查是什么错误:

 

  根据上述信息可知,30日10点39分,在进行crash recovery时,REDO03.LOG文件的block=3759889处存在corruption block(坏块。属物理损坏,一般与介质异常与操作系统调用失败有关)。

  当发现坏块后,oracle后台进程将REDO03.LOG中的所有内容DUMP到orcl\trace\orcl_ora_1908.trc文件中。分析该文件:

 

  通过对该trace文件的分析,可以看到,crash recovery将从REDO03.LOG的cache-low rba开始恢复,一直要恢复到REDO01.LOG的on-disk rba处。而REDO03.LOG文件的corruption block 3759889(REDO文件大小为2G,REDO BLOCKSIZE=512B,因此block范围为1~4194304),正处于这个区间内,如下图所示。

 

 

 

 

 

  此时,REDO01.LOG的状态是CURRENT,而REDO03.LOG的状态是ACTIVE,由于坏块在REDO03.LOG上。因此REDO01.LOG整个文件,以及REDO03.LOG上corrption block之后的redo entry(重做条目)不可恢复。所以,数据库只能以不完全恢复启动

3处理过程

  到了现场,以如下方式启动数据库:

   1.参数文件中添加_allow_resetlogs_corruption=true

   2.Startup mount;

   3.recover database until cancel;

   4.alter database open resetlogs;

  以这种方式,可以将数据库SCN推进到corruption rba处的SCN,但此时的数据库因为丢矢了corruption rba了重做日志,所以,现在的数据库并不是一致的状态。

数据库打开了,然而没运行多久,就又自动宕机了。再次检查alert.log,发现出现了ORA-00600 [2662] 错误。

 

  针对现场的数据库版本v11.2.0.1,在MOS上查询ORA-00600 [2662],文档ID 28929.1中有关解释,内容如下:


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 

 

  从文档描述可知,当curren SCN小于dependent SCN时,出现ORA-00600 [2662],它有5个参数,见上图ARGUMENTS部分。

  Current SCN来自于控制文件,当前值为(2387*232)+ 275355755= 10252362291307,该值实际上代表的是corruption rba处(非完全一致,但接近)的SCN。

  Dependent SCN当前值为(2387*232)+ 275361895=10252362297447, 10252362297447-10252362291307=6140,可知相差非常小(对于SCN来说,这个值的确非常小)。

  另外,第5个参数[83597025],代表的是Dependent SCN从何处得到。它是一个DBA(data block address),计算该DBA的具体位置:

 

 

  通过查询v$datafile,可知FILE_ID=19是一个业务相关的数据文件。

    根据图6的说明,如果Current SCN与Dependent SCN非常接近时,重启几次,让Current SCN追上直至超过Dependent SCN即可。


                  图6

    在alert.log中,可以看到,重启多次之后,current SCN逐渐追上了depentend SCN,直至数据库可以启动为止。不过,由于数据库是以不完全恢复启动的,所以启动会必须立刻将数据库DUMP出来,并在其它数据库中恢复。

4其它说明

    此案例中,由于current SCN与depentend SCN相差较近,所以选择使用多次启动的方式,使current SCN逐渐追上depentend SCN的方式来启动。但如果current SCN与depentend SCN相差较远,需要用其它方式来手动推进current SCN。

  1)set the following hidden parameter in init.ora

    *._allow_error_simulation = TRUE

*._smu_debug_mode = 268435456

 2)通过adjust_scn事件

1.set "*._allow_error_simulation = TRUE" in init.ora

2.alter system set events 'immediate trace name adjust_scn level 1';

  3)设置current SCN最小起始值(1表示1*230)

   Set "*._minimum_giga_scn=1" in init.ora

  4)修改实例的Global Lamport SCN,在SGA中由kcsgscn变量存储

   1.oradebug setmypid

   2.oradebug DUMPvar SGA kcsgscn

   3.ORADEBUG POKE 0x060012658 4 0xfffff

  5)用BBED工具修改datafile header实现修改SCN

   主要是修改datafile header kcvfh.kcvfhckp.kcvcpscn,bbed具体使用方法不展开叙述。

posted @ 2016-09-22 17:42  6宇航  阅读(789)  评论(0编辑  收藏  举报