首页 > 其他 > 详细

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

时间:2014-02-27 02:35:28      阅读:535      评论:0      收藏:0      [点我收藏+]
       当数据库做了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


(06)重做日志损坏的恢复,布布扣,bubuko.com

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

原文:http://blog.csdn.net/xcl168/article/details/19945965

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!