您的位置:首页 > 其它

redo logfile文件恢复详解

2012-03-03 20:05 127 查看
一、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即使生成了,数据库也无法打开.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: