oracle redo故障,Redo故障的恢复

环境: windows XP Pro + oracle 9.2.0.4

一、redologfile 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 * 来恢复,恢复后系统以前的备份无效,需要重新进行数据库全备。

1、在丢失之前系统正常关闭的状态下

由于,关闭前系统已经完成了检查点,此种情况对于8i可以对当前日志进行 clear,对于9i可以进行until cancel恢复。然后open resetlogs打开数据库。

2、在丢失之前系统异常关闭

此时,对于noarchivelog模式下,只能从数据库全备中恢复了

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值