0
点赞
收藏
分享

微信扫一扫

(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 选项打开数据库后,会重建所有日志成员,并且过去


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




举报

相关推荐

0 条评论