zoukankan      html  css  js  c++  java
  • 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 raceorcl_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具体使用方法不展开叙述。

  • 相关阅读:
    nyoj 202 红黑树
    nyoj 237 游戏高手的烦恼
    nyoj 203 三国志
    nyoj 118 修路方案
    nyoj 714 Card Trick
    nyoj 710 外星人的供给站
    nyoj 712探 寻 宝 藏
    nyoj 709 异 形 卵
    nyoj 711 最舒适的路线
    HTML5表格简单应用案例之[招聘需求表]
  • 原文地址:https://www.cnblogs.com/6yuhang/p/5897310.html
Copyright © 2011-2022 走看看