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具体使用方法不展开叙述。

  • 相关阅读:
    poj 2187 Beauty Contest(旋转卡壳)
    poj 2540 Hotter Colder(极角计算半平面交)
    poj 1279 Art Gallery(利用极角计算半平面交)
    poj 3384 Feng Shui(半平面交的联机算法)
    poj 1151 Atlantis(矩形面积并)
    zoj 1659 Mobile Phone Coverage(矩形面积并)
    uva 10213 How Many Pieces of Land (欧拉公式计算多面体)
    uva 190 Circle Through Three Points(三点求外心)
    zoj 1280 Intersecting Lines(两直线交点)
    poj 1041 John's trip(欧拉回路)
  • 原文地址:https://www.cnblogs.com/6yuhang/p/5897310.html
Copyright © 2011-2022 走看看