(06)重做日志损坏的恢复

       当数据库做了DML或DDL操作之后,LGWR进程会将这些操作记录到重做日志中。

  Oracle最少要包含两个日志组。 一个日志组可以有多个日志成员,每个成员互为镜像, 内容完全一致。

      重做日志损坏严重时,会造成数据库不能打开或造成运行状态下的数据库被中止。特别是当前活动日志组因为文件系统损坏或其它原因

  整个损坏时,恢复会是件非常麻烦的事。

  下面是几种损坏情况下的恢复方法.

一. 删除损坏的日志组成员

   1.确定出现介质失败的日志成员
      SELECT member FROM v$logfile WHERE status='INVALID';
   2.如果介质失败的日志成员是当前日志组的成员,则需要将其变为非当前日志组
     alter system switch logfile;
   3.删除损坏的日志组成员
      alter database drop logfile member '/u01/app/oracle/oradata/xcldb/REDO1_2.LOG';
   4.增加日志成员
     alter database add logfile member '/u01/app/oracle/oradata/xcldb/REDO1_3.LOG' to group 组号;

二.非活动日志组损坏
  1. open状态下,非活动的日志组成员全部损坏

     直接清除掉损坏的日志组,使LGWR进程可以继续。     
     alter database clear unarchived logfile group 组号;
     清除过后,Oracle会重建立日志组的所有成员。
     要注意的是,因为之前损坏的日志组成员没有被归档,所以最好重新做好备份。

  2. close状态下,非活动(INVALID)的日志组成员全部损坏
   可删除原有日志组,增加新日志组
   2.1. alter database add logfile group 新组号
   ('/u01/app/oracle/oradata/xcldb/redo4_1.log',
    '/u01/app/oracle/oradata/xcldb/redo4_2.log') size 10m reuse;
   2.2. alter database drop logfile group 旧组号;
   2.3. alter database open;

三.当前日志组的所有成员都损坏
   3.1. open状态下,当前活动的日志组成员全部损坏
    必须使用数据文件备份,归档日志执行基于取消的不完全恢复
    1. SQL>startup mount   
    2. 如果有数据文件备份,将冷备份的数据文件还原回去
    3. 执行不完全恢复
       SQL>recover database until cancel
    SQL>cancel
    4.resetlogs方式open数据库
    SQL>alter database open resetlogs;

   但上面的情况下,很少会有合适的冷备份,可按下面的方法做:
    1. 设置两个隐含参数: 

       SQL>ALTER SYSTEM SET _allow_resetlogs_corruption=TRUE SCOPE=SPFILE; 

       SQL>ALTER SYSTEM SET _allow_error_simulation=TRUE SCOPE=SPFILE;

        _allow_resetlogs_corruption 跳过文件头的一致性检查,强制启动数据库
        _allow_error_simulation     增进scn
       如果使用了隐含参数仍不能打开的话,就只能再采取其它方法做恢复了。
    2.使用修改过后的pfile来启动数据库
       SQL>shutdown immediate
       SQL>startup
       如果有开闪回区,关掉闪回
       SQL>alter database flashback off;
    3. open数据库
       SQL>alter database open resetlogs;
    4. 此时数据库的当前日志仍在被损坏的日志组上
       强制切换日志组
       SQL>alter system switch logfile;
       再次查询日志状态,直到日志组转到其它日志组上
       SQL> select a.group#,a.status,b.member from v$log a,v$logfile b where a.group#=b.group#;
    5. 将非当前的已损坏的那个日志组给删了
       SQL> alter database drop logfile group 损坏了的组号;
       SQL> alter system switch logfile;
       SQL> alter database add logfile group 新组号
            ('/u01/app/oracle/oradata/xcldb/redo4_1.log',
             '/u01/app/oracle/oradata/xcldb/redo4_2.log') size 10m reuse;
       SQL> alter system switch logfile;
       再次查询确认下日志状态
       SQL> select a.group#,a.status,b.member from v$log a,v$logfile b where a.group#=b.group#;
   6. 经过上面的步骤,数据库应当已正常了,此时只要把隐含参数拿掉重启就正式结束恢复了。
      SQL>ALTER SYSTEM SET _allow_resetlogs_corruption=FALSE SCOPE=SPFILE; 
      SQL>ALTER SYSTEM SET _allow_error_simulation=FALSE SCOPE=SPFILE;
      SQL>shutdown immediate
      SQL>startup
 
  3.2. close状态下,当前活动的日志组成员全部损坏
  因为是关闭状态,数据文件,控制文件等都处于完全一致的状态 
    SQL>recover database until cancel
    SQL>alter database open resetlogs;
 
  resetlogs 选项打开数据库后,会重建所有日志成员,并且过去

  的备份不能直接使用,所以需重新备份所有数据文件和控制文件。


MAIL: xcl_168@aliyun.com

BLOG: http://blog.csdn.net/xcl168


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值