ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Redo故障的恢复

Redo故障的恢复

原创 Linux操作系统 作者:Dodd 时间:2008-01-23 11:40:08 0 删除 编辑

环境: windows XP Pro + oracle 9.2.0.4

一、redo logfile group的删除
为了模拟日志故障,需要手工删除一些日志组,下面介绍如何删除日志组,以及影响:
logfile group的状态有3种current、active、inactive。
其中active和inactive的都可以删除。在数据库open状态或其他状态都可以。这里所说的删除是用操作系统的删除。如果用alter database drop logfile group * 的话,则只能删除inactive状态的logfile group。
其中删除active状态的logfile group后,最好alter system checkpoint,因为,这时如果不手工发出检查点的话,一旦数据库出现问题(abort,由于instance recovery需要active的logfile group),将不能正常恢复。
当前(current)日志组不能在open状态下删除。原因显而易见,至于删除之后如何恢复,下面将予以介绍。
 
二、丢失非活动的日志组
1、系统是noarchivelog
 
SQL> select * from v$log;
    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ----------------
FIRST_CHANGE# FIRST_TIME
------------- ----------
         1          1         22  104857600          1 NO  INACTIVE
       243099 26-8月 -06
         2          1         23  104857600          1 NO  CURRENT
       243170 26-8月 -06
         3          1         21  104857600          1 NO  INACTIVE
       243097 26-8月 -06
现在在系统中删除 group 3,这时系统是open状态。
手工switch logfile后,例程马上崩溃;
SQL> alter system switch logfile;
alter system switch logfile
*
ERROR 位于第 1 行:
ORA-03113: 通信通道的文件结束
恢复方法有两种:
(1) drop相应的logfile group,添加新的logfile group。
  • 将数据库mount状态
    SQL> startup mount
    ORACLE 例程已经启动。
    Total System Global Area  135339844 bytes
    Fixed Size                   454468 bytes
    Variable Size             109051904 bytes
    Database Buffers           25165824 bytes
    Redo Buffers                 667648 bytes
    数据库装载完毕。
    SQL> alter database open;
    alter database open
    *
    ERROR 位于第 1 行:
    ORA-00313: 无法打开日志组 3 (线程 1) 的成员
    ORA-00312: 联机日志 3 线程 1: 'E:\ORACLE\ORADATA\FOX\REDO03.LOG'
  • alter database drop logfile group 3;
    SQL> alter database drop logfile group 3;
    数据库已更改。
    SQL> select * from v$log;
     GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS
    ---------- ---------- ---------- ---------- ---------- --- ----------------
    FIRST_CHANGE# FIRST_TIME
    ------------- ----------
             1          1         22  104857600          1 NO  INACTIVE
           243099 26-8月 -06
             2          1         23  104857600          1 NO  INVALIDATED
           243170 26-8月 -06
    SQL> select * from v$logfile;
        GROUP# STATUS  TYPE
    ---------- ------- -------
    MEMBER
    ----------------------------------
             1         ONLINE
    E:\ORACLE\ORADATA\FOX\REDO01.LOG
             2 STALE   ONLINE
    E:\ORACLE\ORADATA\FOX\REDO02.LOG
    此时,group 2变成INVALIDATED,是因为,发生日志切换过程中,数据库crash,所以group 2变成INVALIDATED,REDO02.LOG变成了stale(stale经常出现在上一次操作失败后,下一次成功操作后会恢复正常)
  • alter database add logfile group 3
    ('e:\oracle\oradata\fox\redo03.log') size 100M;
    SQL> alter database add logfile group 3
      2  ('e:\oracle\oradata\fox\redo03.log')
      3  size 100M;
    数据库已更改。
    SQL> select * from v$log;
        GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS
    ---------- ---------- ---------- ---------- ---------- --- ----------------
    FIRST_CHANGE# FIRST_TIME
    ------------- ----------
             1          1         22  104857600          1 NO  INACTIVE
           243099 26-8月 -06
             2          1         23  104857600          1 NO  INVALIDATED
           243170 26-8月 -06
             3          1          0  104857600          1 YES UNUSED
  • alter database open;
    SQL> alter database open;
    数据库已更改。
    SQL>  select * from v$log;
        GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS
    ---------- ---------- ---------- ---------- ---------- --- ----------------
    FIRST_CHANGE# FIRST_TIME
    ------------- ----------
             1          1         22  104857600          1 NO  INACTIVE
           243099 26-8月 -06
             2          1         23  104857600          1 NO  INACTIVE
           243170 26-8月 -06
             3          1         24  104857600          1 NO  CURRENT
           263663 26-8月 -06
    注意,打开数据库后,group 2 inactive状态,日志自动切换到group 3。

(2) alter database clear logfile group *的方法
上面试验到数据库mount状态后,运行
SQL> alter database clear logfile group 3;

数据库已更改。

SQL>
SQL> alter database open;

记住,alter database clear logfile group 3这种方法,数据库会自动重建redo03.log日志文件。


2、系统是archivelog的
(1)删除的为已经archive的group
数据库日志状态为:
SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ----------------
FIRST_CHANGE# FIRST_TIME
------------- ----------
         1          1         26  104857600          1 NO  CURRENT
      2012333 26-8月 -06

         2          1         24  104857600          1 YES INACTIVE
       765483 24-8月 -06

         3          1         25  104857600          1 YES INACTIVE
      1987398 24-8月 -06
在系统中删除 redo02.log后,手工switch logfile,instance立即崩溃。
SQL> alter system switch logfile;
alter system switch logfile
*
ERROR 位于第 1 行:
ORA-03113: 通信通道的文件结束
重启数据库:
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  135339844 bytes
Fixed Size                   454468 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
SQL>
SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-00313: 无法打开日志组 2 (线程 1) 的成员
ORA-00312: 联机日志 2 线程 1: 'E:\ORACLE\ORADATA\MYDB\REDO02.LOG'
对redo02进行恢复:
SQL> alter database clear logfile group 2;

数据库已更改。

SQL>
SQL> alter database open;

数据库已更改。

当然,也可以通过 drop掉 group 2,然后再添加的方法恢复group 2 了。
(2)如果删除的inactive日志还没归档的话
则使用 alter database unarchived logfile group * 来恢复,恢复后系统以前的备份无效,需要重新进行数据库全备。

三、丢失activecurrent的日志组

1、在丢失之前系统正常关闭的状态下
由于,关闭前系统已经完成了检查点,此种情况对于8i可以对当前日志进行 clear,对于9i可以进行until cancel恢复。然后open resetlogs打开数据库。

2、在丢失之前系统异常关闭
此时,对于noarchivelog模式下,只能从数据库全备中恢复了

对于archivelog模式,可以找到最近一次的数据库备份,然后作基于cancel的恢复。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7220098/viewspace-157766/,如需转载,请注明出处,否则将追究法律责任。

下一篇: Oracle 8i 密码验证
请登录后发表评论 登录
全部评论

注册时间:2008-01-22

  • 博文量
    46
  • 访问量
    159447