redo logfile文件恢复详解

一、REDO文件的作用
REDO文件存储所有数据库的变更内容和每一次变更所需的重做脚本,是数据库不可缺少的一部分,如果REDO GROUP中只有一个REDO文件,同时这个REDO文件被损坏,则系统切换到这个REDO GROUP时,数据库将直接DOWN机;如果REDO GROUP中有多个REDO文件,其中一个或者多个REDO被损坏,只要该组中还有一个好的REDO文件,则系统将报警(写入alert<sid>.log文档中),数据库仍然可以超常运行。
REDO文件在数据库恢复时提供前滚所需的内容。
查看REDO 相关信息的视图有:V$LOG,V$LOGFILE,V$INSTANCE_RECOVERY

SQL> desc v$log;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 GROUP#                                             NUMBER
 THREAD#                                            NUMBER
 SEQUENCE#                                          NUMBER
 BYTES                                              NUMBER
 MEMBERS                                            NUMBER
 ARCHIVED                                           VARCHAR2(3)
 STATUS                                             VARCHAR2(16)
 FIRST_CHANGE#                                      NUMBER
 FIRST_TIME                                         DATE


SQL> select * from v$log;


    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ----------------
FIRST_CHANGE# FIRST_TIM
------------- ---------
         1          1         20   52428800          1 NO  CURRENT
       944601 03-MAR-12


         2          1         18   52428800          1 NO  INACTIVE
       896864 02-MAR-12


         3          1         19   52428800          1 NO  INACTIVE
       914701 02-MAR-12

STATUS状态的解释:
CURRENT: 当前的REDO文件,REDO BUFFER 的内容有LGWR进程写入当前REDO文件,如果丢失该组文件,会造成数据的丢失.
ACTIVE : 文件中含有的内容还没有写入到ARCHIVELOG文件中,如果丢失该组文件也会造成数据的丢失.
INACTIVE: 已经归档,丢失文件不会造成数据丢失,不过在做数据库的恢复时,该组文件可以用来做前滚操作.

SQL> desc v$logfile
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 GROUP#                                             NUMBER
 STATUS                                             VARCHAR2(7)
 TYPE                                               VARCHAR2(7)
 MEMBER                                             VARCHAR2(513)
 IS_RECOVERY_DEST_FILE                              VARCHAR2(3)


SQL> select * from v$logfile;


    GROUP# STATUS  TYPE    MEMBER          IS_
---------- ------- ------- --------------- ---
         3 STALE   ONLINE  /opt/oracle/ora NO
                           data/orcl1/redo
                           03.log


         2         ONLINE  /opt/oracle/ora NO
                           data/orcl1/redo
                           02.log


         1         ONLINE  /opt/oracle/ora NO
                           data/orcl1/redo
                           01.log


    GROUP# STATUS  TYPE    MEMBER          IS_
---------- ------- ------- --------------- ---

可以看到,当前数据库有3个REDO GROUP,每个GROUP 含有一个MEMBER(REDO文件).

SQL> desc v$instance_recovery;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 RECOVERY_ESTIMATED_IOS                             NUMBER
 ACTUAL_REDO_BLKS                                   NUMBER
 TARGET_REDO_BLKS                                   NUMBER
 LOG_FILE_SIZE_REDO_BLKS                            NUMBER
 LOG_CHKPT_TIMEOUT_REDO_BLKS                        NUMBER
 LOG_CHKPT_INTERVAL_REDO_BLKS                       NUMBER
 FAST_START_IO_TARGET_REDO_BLKS                     NUMBER
 TARGET_MTTR                                        NUMBER
 ESTIMATED_MTTR                                     NUMBER
 CKPT_BLOCK_WRITES                                  NUMBER
 OPTIMAL_LOGFILE_SIZE                               NUMBER
 ESTD_CLUSTER_AVAILABLE_TIME                        NUMBER
 WRITES_MTTR                                        NUMBER
 WRITES_LOGFILE_SIZE                                NUMBER
 WRITES_LOG_CHECKPOINT_SETTINGS                     NUMBER
 WRITES_OTHER_SETTINGS                              NUMBER
 WRITES_AUTOTUNE                                    NUMBER
 WRITES_FULL_THREAD_CKPT                            NUMBER


一般情况下,最好有3-5个REDO GROUP,每个REDO GROUP中有两个成员,放在不同的磁盘资源上。同一个REDO GROUP 中的REDO文件的大小尽量设置为相同,否则系统以最小的一个为基准,比较浪费空间。各个REDO GROUP 的大小也最好一致。


增加REDO GROUP

SQL> alter database add logfile group 4 '/opt/oracle/oradata/orcl1/redo04.log' size 10m;


Database altered.


SQL> select * from v$logfile;


    GROUP# STATUS  TYPE    MEMBER          IS_
---------- ------- ------- --------------- ---
         3 STALE   ONLINE  /opt/oracle/ora NO
                           data/orcl1/redo
                           03.log


         2         ONLINE  /opt/oracle/ora NO
                           data/orcl1/redo
                           02.log


         1         ONLINE  /opt/oracle/ora NO
                           data/orcl1/redo
                           01.log


    GROUP# STATUS  TYPE    MEMBER          IS_
---------- ------- ------- --------------- ---


         4         ONLINE  /opt/oracle/ora NO
                           data/orcl1/redo
                           04.log

删除REDO GROUP

SQL> alter database drop logfile group 4;


Database altered.


SQL> select * from v$logfile;


    GROUP# STATUS  TYPE    MEMBER          IS_
---------- ------- ------- --------------- ---
         3 STALE   ONLINE  /opt/oracle/ora NO
                           data/orcl1/redo
                           03.log


         2         ONLINE  /opt/oracle/ora NO
                           data/orcl1/redo
                           02.log


         1         ONLINE  /opt/oracle/ora NO
                           data/orcl1/redo
                           01.log


REDO GROUP中增加REDO文件

SQL> alter database add logfile member '/opt/oracle/oradata/orcl1/redo01b.log' to group 1;


Database altered.


SQL> select * from v$logfile;


    GROUP# STATUS  TYPE    MEMBER          IS_
---------- ------- ------- --------------- ---
         3 STALE   ONLINE  /opt/oracle/ora NO
                           data/orcl1/redo
                           03.log


         2         ONLINE  /opt/oracle/ora NO
                           data/orcl1/redo
                           02.log


         1         ONLINE  /opt/oracle/ora NO
                           data/orcl1/redo
                           01.log


    GROUP# STATUS  TYPE    MEMBER          IS_
---------- ------- ------- --------------- ---


         1 INVALID ONLINE  /opt/oracle/ora NO
                           data/orcl1/redo
                           01b.log


我们看到新增加的REDO FILE状态为INVALID,这个不用担心,等到下次切换日志到本组时状态会自动正常。

SQL> alter system switch logfile;


System altered.

SQL> alter system switch logfile;


System altered.


SQL> select * from v$log;


    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------
         1          1         20   52428800          2 NO  ACTIVE                  944601 03-MAR-12
         2          1         21   52428800          1 NO  ACTIVE                  953908 04-MAR-12
         3          1         22   52428800          1 NO  CURRENT                 953919 04-MAR-12


SQL> select * from v$log;


    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------
         1          1         20   52428800          2 NO  ACTIVE                  944601 03-MAR-12
         2          1         21   52428800          1 NO  ACTIVE                  953908 04-MAR-12
         3          1         22   52428800          1 NO  CURRENT                 953919 04-MAR-12


SQL> alter system switch logfile;


System altered.


SQL> select * from v$log;


    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------
         1          1         23   52428800          2 NO  CURRENT                 953933 04-MAR-12
         2          1         21   52428800          1 NO  INACTIVE                953908 04-MAR-12
         3          1         22   52428800          1 NO  INACTIVE                953919 04-MAR-12


SQL> select * from v$logfile;


    GROUP# STATUS  TYPE    MEMBER          IS_
---------- ------- ------- --------------- ---
         3         ONLINE  /opt/oracle/ora NO
                           data/orcl1/redo
                           03.log


         2         ONLINE  /opt/oracle/ora NO
                           data/orcl1/redo
                           02.log


         1         ONLINE  /opt/oracle/ora NO
                           data/orcl1/redo
                           01.log


    GROUP# STATUS  TYPE    MEMBER          IS_
---------- ------- ------- --------------- ---


         1         ONLINE  /opt/oracle/ora NO
                           data/orcl1/redo
                           01b.log


REDO GROUP中删除REDO 文件

SQL> alter database drop logfile member '/opt/oracle/oradata/orcl1/redo01.log';
alter database drop logfile member '/opt/oracle/oradata/orcl1/redo01.log'
*
ERROR at line 1:
ORA-01609: log 1 is the current log for thread 1 - cannot drop members
ORA-00312: online log 1 thread 1: '/opt/oracle/oradata/orcl1/redo01.log'
ORA-00312: online log 1 thread 1: '/opt/oracle/oradata/orcl1/redo01b.log'

这时我们看到系统报错了,当前REDO LOG不能删除,我们switch log。

SQL> alter system switch logfile;


System altered.


SQL> alter database drop logfile member '/opt/oracle/oradata/orcl1/redo01.log';


Database altered.


SQL> select * from v$logfile;


    GROUP# STATUS  TYPE    MEMBER          IS_
---------- ------- ------- --------------- ---
         3         ONLINE  /opt/oracle/ora NO
                           data/orcl1/redo
                           03.log


         2         ONLINE  /opt/oracle/ora NO
                           data/orcl1/redo
                           02.log


         1         ONLINE  /opt/oracle/ora NO
                           data/orcl1/redo
                           01b.log


SQL> 

注意: 不可以删除REDO GROUP 中所有的REDO 文件,这样会报错,如下所示:

SQL> alter database drop logfile member '/opt/oracle/oradata/orcl1/redo01b.log';
alter database drop logfile member '/opt/oracle/oradata/orcl1/redo01b.log'
*
ERROR at line 1:
ORA-00361: cannot remove last log member /opt/oracle/oradata/orcl1/redo01b.log for group 1


二、REDO LOG FILE损坏的恢复

1.已经归档的REDO文件损坏的恢复
所谓已经归档的REDO文件就是在V$LOG视图中状态为INACTIVE的REDO文件。
这些文档的丢失,不会对数据库造成任何影响,但需要及时的恢复,否则切换到这个组时将会发生错误。
解决问题有两个办法:
A.删除这个REDO GROUP,记住删除后数据库的REDO GROUP数目不应小于2,如果当前REDO GROUP数目为2,则不可以使用这个办法。 
B.在组中增加新的同样大小的REDO文件,然后删除原来的MEMBER。增加、删除REDO文件的方法见上面的2.4,2.5。

2.没有归档的REDO文件损坏的恢复
所谓没有归档的REDO文件就是在V$LOG视图中状态为ACTIVE,CURRENT的REDO文件。如果没有归档的REDO GROUP中含有多个REDO 文件,丢失或者损坏的只是部分REDO文件,则可以通过复制正常的REDO文件,覆盖损坏的REDO文件的方式解决问题,数据不会丢失,不用做恢复操作。
如果没有归档的REDO GROUP组中所有的REDO文件都丢失或者损坏,将会导致数据库数据丢失,如果没有归档的REDO GROUP 为当前组,则数据库立即DOWN机。当这个情况发生时,就意味着数据的丢失,我们只能将数据库恢复到前一次的归档日志切换时刻。

下面来看一下具体的情况:

情况一
 当丢失的日志组是当前正在使用的,并且在数据库正常关闭后
1.      正常关闭数据库,然后将数据库的当前日志组所有成员更改名字,此时打开数据库
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE例程已经关闭。
SQL> startup
ORACLE例程已经启动。
 
Total System Global Area 448790528 bytes
Fixed Size                 1297220 bytes
Variable Size            130024636 bytes
Database Buffers         310378496 bytes
Redo Buffers               7090176 bytes
数据库装载完毕。
ORA-00313:无法打开日志组3 (用于线程1)的成员
ORA-00312:联机日志3线程1:
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\REDO03.LOG'
2.      oracle OD上说open resetlogs能打开数据库
 
SQL> alter database open resetlogs;
alter database open resetlogs
*
第1行出现错误:
ORA-01139: RESETLOGS选项仅在不完全数据库恢复后有效
 
3.      此时数据库并没有做不完全恢复,所以不能用resetlogs,于是想能不能骗一下oracle,于是做了如下操作.
SQL> recover database;
ORA-00283:恢复会话因错误而取消
ORA-00264:不要求恢复
 
 
SQL> recover database using backup controlfile until cancel;
ORA-00279:更改814667 (在03/23/2010 14:34:35生成)对于线程1是必需的
ORA-00289:建议:
D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\TEST\ARCHIVELOG\2010_03_23\O1_MF_1_
 
27_%U_.ARC
ORA-00280:更改814667 (用于线程1)在序列#27中
 
 
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
介质恢复已取消。
 
4.      此时再用resetlogs打开数据库,数据库能打开了
 
SQL> alter database open resetlogs;
 
数据库已更改。
 
SQL> select member from v$logfile;
 
MEMBER
----------------------------------------------------------------------
 
D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\REDO01.LOG
D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\REDO02.LOG
D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\REDO03.LOG
 
SQL> select * from v$log;
 
   GROUP#   THREAD# SEQUENCE#     BYTES   MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- -----------
FIRST_CHANGE# FIRST_TIME
------------- --------------
        1         1         1  52428800         1 YES INACTIVE
      814668 23-3月-10
 
        2         1         2  52428800         1 NO CURRENT
      814669 23-3月-10
 
        3         1         0  52428800         1 YES UNUSED
           0
 
可以看到数据库自动重新创建了此日志组.
 
情况二
 
当数据库正常关闭后,丢失的不是当前日志组时,
 
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE例程已经关闭。
SQL> startup
ORACLE例程已经启动。
 
Total System Global Area 448790528 bytes
Fixed Size                 1297220 bytes
Variable Size            130024636 bytes
Database Buffers         310378496 bytes
Redo Buffers               7090176 bytes
数据库装载完毕。
ORA-00313:无法打开日志组1 (用于线程1)的成员
ORA-00312:联机日志1线程1:
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\REDO01.LOG'
 
 
SQL> select * from v$log;
 
   GROUP#   THREAD# SEQUENCE#     BYTES   MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ----------------
FIRST_CHANGE# FIRST_TIME
------------- --------------
        1         1         1  52428800         1 YES INACTIVE
      814668 23-3月-10
 
        3         1         3  52428800         1 NO CURRENT
      816708 23-3月-10
 
        2         1         2  52428800         1 YES INACTIVE
      814669 23-3月-10
 
 
SQL> alter database clear logfile group 1;
 
数据库已更改。
 
SQL> alter database open;
 
数据库已更改。
使用alter database clear logfile group命令重建该日志组后能正常打开了.
 
情况三
 在数据库正常关闭后,所有日志组都丢失了的情况.
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE例程已经关闭。
SQL> startup
ORACLE例程已经启动。
 
Total System Global Area 448790528 bytes
Fixed Size                 1297220 bytes
Variable Size            130024636 bytes
Database Buffers         310378496 bytes
Redo Buffers               7090176 bytes
数据库装载完毕。
ORA-00313:无法打开日志组1 (用于线程1)的成员
ORA-00312:联机日志1线程1:
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\REDO01.LOG'
 
 
SQL> select * from v$log;
 
   GROUP#   THREAD# SEQUENCE#     BYTES   MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ----------------
FIRST_CHANGE# FIRST_TIME
------------- --------------
        1         1         4  52428800         1 YES INACTIVE
      816785 23-3月-10
 
        3         1         3  52428800         1 YES INACTIVE
      816708 23-3月-10
 
        2         1         5  52428800         1 NO CURRENT
      817206 23-3月-10
 
 
SQL> alter database clear logfile group 1;
 
数据库已更改。
 
SQL> alter database clear logfile group 3;
 
数据库已更改。
 
SQL> recover database using backup controlfile until cancel;
ORA-00279:更改817459 (在03/23/2010 15:31:34生成)对于线程1是必需的
ORA-00289:建议:
D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\TEST\ARCHIVELOG\2010_03_23\O1_MF_1
 
5_%U_.ARC
ORA-00280:更改817459 (用于线程1)在序列#5中
 
 
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
cancel;
ORA-00308:无法打开归档日志'cancel;'
ORA-27041:无法打开文件
OSD-04002:无法打开文件
O/S-Error: (OS 2)系统找不到指定的文件。
 
 
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
介质恢复已取消。
SQL> alter database open resetlogs;
 
数据库已更改。
 
SQL> select * from v$log;
 
   GROUP#   THREAD# SEQUENCE#     BYTES   MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ----------------
FIRST_CHANGE# FIRST_TIME
------------- --------------
        1         1         1  52428800         1 YES INACTIVE
      817460 23-3月-10
 
        2         1         2  52428800         1 NO CURRENT
      817461 23-3月-10
 
        3         1         0  52428800         1 YES UNUSED
           0
 
情况四
 当数据库非一致情况下关闭,即使用shutdown abort或者数据库直接crash掉,丢失了目前的日志组,此时数据库由于不一致,需要读取目前的日志组进行恢复.这时
SQL> shutdown abort
ORACLE例程已经关闭。
SQL> startup
ORACLE例程已经启动。
 
Total System Global Area 448790528 bytes
Fixed Size                 1297220 bytes
Variable Size            130024636 bytes
Database Buffers         310378496 bytes
Redo Buffers               7090176 bytes
数据库装载完毕。
ORA-00313:无法打开日志组2 (用于线程1)的成员
ORA-00312:联机日志2线程1:
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\REDO02.LOG'
ORA-27041:无法打开文件
OSD-04002:无法打开文件
O/S-Error: (OS 2)系统找不到指定的文件。
 
 
SQL> recover database using backup controlfile until cancel;
ORA-00279:更改817462 (在03/23/2010 15:34:14生成)对于线程1是必需的
ORA-00289:建议:
D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\TEST\ARCHIVELOG\2010_03_23\O1_MF_1_
 
2_%U_.ARC
ORA-00280:更改817462 (用于线程1)在序列#2中
 
 
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
ORA-01547:警告: RECOVER成功但OPEN RESETLOGS将出现如下错误
ORA-01194:文件1需要更多的恢复来保持一致性
ORA-01110:数据文件1: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\SYSTEM01.DBF'
 
ORA-01112:未启动介质恢复
 
SQL> alter system set "_allow_resetlogs_corruption"=true scope=spfile;
 
系统已更改。
 
SQL> shutdown immediate
ORA-01109:数据库未打开
 
已经卸载数据库。
ORACLE例程已经关闭。
SQL> startup mount
ORACLE例程已经启动。
 
Total System Global Area 448790528 bytes
Fixed Size                 1297220 bytes
Variable Size            130024636 bytes
Database Buffers         310378496 bytes
Redo Buffers               7090176 bytes
数据库装载完毕。
SQL> recover database using backup controlfile until cancel;
ORA-00279:更改817462 (在03/23/2010 15:34:14生成)对于线程1是必需的
ORA-00289:建议:
D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\TEST\ARCHIVELOG\2010_03_23\O1_MF_1_
 
2_%U_.ARC
ORA-00280:更改817462 (用于线程1)在序列#2中
 
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
ORA-01547:警告: RECOVER成功但OPEN RESETLOGS将出现如下错误
ORA-01194:文件1需要更多的恢复来保持一致性
ORA-01110:数据文件1: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\SYSTEM01.DBF'
 
ORA-01112:未启动介质恢复
 
SQL> alter database open resetlogs;
alter database open resetlogs
*
第1行出现错误:
ORA-01092: ORACLE实例终止。强制断开连接
此时数据库仍不能打开,根据oracle OD,只有做不完全恢复了.redo2即使生成了,数据库也无法打开.




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值