ITPub博客

首页 > Linux操作系统 > Linux操作系统 > REDO文件丢失或者损坏的恢复

REDO文件丢失或者损坏的恢复

原创 Linux操作系统 作者:djb1008 时间:2010-09-14 08:12:28 0 删除 编辑
  1. REDO文件的功能描述

REDO文件存储所有数据库的变更内容和每一次变更所需的重做脚本,是数据库不可缺少的一部分,如果REDO GROUP中只有一个REDO文件,同时这个REDO文件被损坏,则系统切换到这个REDO GROUP时,数据库将直接DOWN机;如果REDO GROUP中有多个REDO文件,其中一个或者多个REDO被损坏,只要该组中还有一个好的REDO文件,则系统将报警(写入alert.log文档中),数据库仍然可以正常运行。

REDO文件在数据库恢复时提供前滚所需的内容。


查看REDO 相关信息的视图有:V$LOG,V$LOGFILE,V$INSTANCE_RECOVERY

SQL> DESC V$INSTANCE_RECOVERY;

名称 是否为空? 类型

----------------------------------------- -------- ------

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 的大小也最好一致。

  1. REDO文件恢复实例

2.1查看REDO 相关视图

SQL> select * from v$log;

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME

---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- -------------------

1 1 14 10485760 2 YES ACTIVE 1304089 2006-07-06 12:33:59

2 1 15 10485760 2 YES INACTIVE 1314889 2006-07-06 15:55:10

3 1 16 10485760 2 NO CURRENT 1323514 2006-07-07 08:33:21

STATUS状态的解释:

CURRENT: 当前的REDO文件,REDO BUFFER 的内容由LGWR进程写入当前REDO文件,如果丢失该组文件,会造成数据的丢失.

ACTIVE : 文件中含有的内容还没有写入到ARCHIVELOG文件中,如果丢失该组文件也会造成数据的丢失.

INACTIVE: 已经归档,丢失文件不会造成数据丢失,不过在做数据库的恢复时,该组文件可以用来做前滚操作.

SQL> SELECT * FROM V$LOGFILE ORDER BY GROUP#;

GROUP# STATUS TYPE MEMBER IS_

---------- ------- ------- ------------------------------ ---

1 ONLINE C:ORADATAAIDUREDO01.LOG NO

1 ONLINE C:ORADATAAIDUREDO01B.LOG NO

2 ONLINE C:ORADATAAIDUREDO02.ORA NO

2 ONLINE C:ORADATAAIDUREDO02B.ORA NO

3 ONLINE C:ORADATAAIDUREDO03.LOG NO

3 ONLINE C:ORADATAAIDUREDO03B.LOG NO

已选择6行。

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

2.2 增加REDO GROUP

SQL> alter database add logfile group 4 'C:ORADATAAIDUREDO04.ORA' SIZE 10M REUSE;

数据库已更改。

SQL> SELECT * FROM V$LOGFILE ORDER BY GROUP#;

GROUP# STATUS TYPE MEMBER IS_

---------- ------- ------- ------------------------------ ---

1 ONLINE C:ORADATAAIDUREDO01B.LOG NO

1 ONLINE C:ORADATAAIDUREDO01.LOG NO

2 ONLINE C:ORADATAAIDUREDO02.ORA NO

2 ONLINE C:ORADATAAIDUREDO02B.ORA NO

3 ONLINE C:ORADATAAIDUREDO03B.LOG NO

3 ONLINE C:ORADATAAIDUREDO03.LOG NO

4 ONLINE C:ORADATAAIDUREDO04.ORA NO

已选择7行。

2.3 删除REDO GROUP

SQL> ALTER DATABASE DROP LOGFILE GROUP 4;

数据库已更改。

SQL> SELECT * FROM V$LOGFILE ORDER BY GROUP#;

GROUP# STATUS TYPE MEMBER IS_

---------- ------- ------- ------------------------------ ---

1 ONLINE C:ORADATAAIDUREDO01.LOG NO

1 ONLINE C:ORADATAAIDUREDO01B.LOG NO

2 ONLINE C:ORADATAAIDUREDO02.ORA NO

2 ONLINE C:ORADATAAIDUREDO02B.ORA NO

3 ONLINE C:ORADATAAIDUREDO03.LOG NO

3 ONLINE C:ORADATAAIDUREDO03B.LOG NO

已选择6行。

2.4 REDO GROUP中增加REDO文件(MEMBER)

SQL> ALTER DATABASE ADD LOGFILE MEMBER 'C:ORADATAAIDUREDO01C.LOG' TO GROUP 1;

数据库已更改。

SQL> SELECT * FROM V$LOGFILE ORDER BY GROUP#;

GROUP# STATUS TYPE MEMBER IS_

---------- ------- ------- ------------------------------ ---

1 INVALID ONLINE C:ORADATAAIDUREDO01C.LOG NO

1 ONLINE C:ORADATAAIDUREDO01.LOG NO

1 ONLINE C:ORADATAAIDUREDO01B.LOG NO

2 ONLINE C:ORADATAAIDUREDO02.ORA NO

2 ONLINE C:ORADATAAIDUREDO02B.ORA NO

3 ONLINE C:ORADATAAIDUREDO03.LOG NO

3 ONLINE C:ORADATAAIDUREDO03B.LOG NO

已选择7行。

我们注意到新建的MEMBER的状态为INVALID,这个不用担心,等下次切换到该组,然后状态就会修改为正常。

2.5 REDO GROUP中删除REDO 文件(MEMBER)

SQL> ALTER DATABASE DROP LOGFILE MEMBER 'C:ORADATAAIDUREDO01C.LOG';

数据库已更改。

SQL> SELECT * FROM V$LOGFILE ORDER BY GROUP#;

GROUP# STATUS TYPE MEMBER IS_

---------- ------- ------- ------------------------------ ---

1 ONLINE C:ORADATAAIDUREDO01.LOG NO

1 ONLINE C:ORADATAAIDUREDO01B.LOG NO

2 ONLINE C:ORADATAAIDUREDO02.ORA NO

2 ONLINE C:ORADATAAIDUREDO02B.ORA NO

3 ONLINE C:ORADATAAIDUREDO03.LOG NO

3 ONLINE C:ORADATAAIDUREDO03B.LOG NO

已选择6行。

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

SQL> ALTER DATABASE DROP LOGFILE MEMBER 'C:ORADATAAIDUREDO01.LOG';

数据库已更改。

SQL> ALTER DATABASE DROP LOGFILE MEMBER 'C:ORADATAAIDUREDO01B.LOG';

ALTER DATABASE DROP LOGFILE MEMBER 'C:ORADATAAIDUREDO01B.LOG'

*第 1 行出现错误:

ORA-00361: 无法删除最后一个日志成员 C:ORADATAAIDUREDO01B.LOG (组 1)

2.6 已经归档的REDO文件损坏的恢复

所谓已经归档的REDO文件就是在V$LOG视图中状态为INACTIVE的REDO文件。

这些文档的丢失,不会对数据库造成任何影响,但需要及时的恢复,否则切换到这个组时将会发生错误。

解决问题有两个办法:

  1. 删除这个REDO GROUP,记住删除后数据库的REDO GROUP数目不应小于2,如果当前REDO GROUP数目为2,则不可以使用这个办法。
  2. 在组中增加新的同样大小的REDO文件,然后删除原来的MEMBER。增加、删除REDO文件的方法见上面的2.4,2.5。

2.7没有归档的REDO文件损坏的恢复

2.7.1 简述

所谓没有归档的REDO文件就是在V$LOG视图中状态为ACTIVE,CURRENT的REDO文件。如果没有归档的REDO GROUP中含有多个REDO 文件,丢失或者损坏的只是部分REDO文件,则可以通过复制正常的REDO文件,覆盖损坏的REDO文件的方式解决问题,数据不会丢失,不用做恢复操作。

如果没有归档的REDO GROUP组中所有的REDO文件都丢失或者损坏,将会导致数据库数据丢失,如果没有归档的REDO GROUP 为当前组,则数据库立即DOWN机。当这个情况发生时,就意味着数据的丢失,我们只能将数据库恢复到前一次的归档日志切换时刻。

2.7.2 建立测试环境

检查当前的REDO GROUP为第1组.

SQL> SELECT * FROM V$LOG;

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS

---------- ---------- ---------- ---------- ---------- --- ----------------

FIRST_CHANGE# FIRST_TIME

------------- -------------------

1 1 17 10485760 1 NO CURRENT

1333209 2006-07-07 11:47:23

2 1 15 10485760 2 YES INACTIVE

1314889 2006-07-06 15:55:10

3 1 16 10485760 2 YES INACTIVE

1323514 2006-07-07 08:33:21

建立一个测试表,这个数据库的变化存放在当前的REDO文件中。

SQL> CREATE TABLE AIDU.TEST_FOR_REDO AS SELECT * FROM AIDU.TEST02;

表已创建。

2.7.3 模拟灾难发生

SQL> SHUTDOWN ABORT;

ORACLE 例程已经关闭。

SQL>HOST DELETE C:ORADATAAIDUREDO01*.* #删除当前日志组的所有成员文件

SQL> STARTUP #启动数据库时将报找不到数据库文件的错误,数据库只能启动到MOUNT状态。

ORA-32004: obsolete and/or deprecated parameter(s) specified

ORACLE 例程已经启动。

Total System Global Area 268435456 bytes

Fixed Size 1248504 bytes

Variable Size 96469768 bytes

Database Buffers 167772160 bytes

Redo Buffers 2945024 bytes

数据库装载完毕。

ORA-00313: 无法打开日志组 1 (用于线程 1) 的成员

ORA-00312: 联机日志 1 线程 1: 'C:ORADATAAIDUREDO01B.LOG'

ORA-27041: 无法打开文件

OSD-04002: 无法打开文件

O/S-Error: (OS 2) 系统找不到指定的文件。

SQL> SELECT OPEN_MODE FROM V$DATABASE;

OPEN_MODE

----------

MOUNTED

2.7.4 进行灾难恢复

尝试使用RESETLOG或者NORESETLOGS打开数据库,结果失败

SQL> alter database open resetlogs;

alter database open resetlogs

*第 1 行出现错误:

ORA-01139: RESETLOGS 选项仅在不完全数据库恢复后有效

SQL> alter database open noresetlogs;

alter database open noresetlogs

*第 1 行出现错误:

ORA-01139: RESETLOGS 选项仅在不完全数据库恢复后有效

尝试删除当前被破坏的REDO GROUP,结果失败

SQL> alter database drop logfile group 1;

alter database drop logfile group 1

*

第 1 行出现错误:

ORA-01623: 日志 1 是实例 aidu (线程 1) 的当前日志 - 无法删除

ORA-00312: 联机日志 1 线程 1: 'C:ORADATAAIDUREDO01B.LOG'

清除当前日志组的内容,然后重新建立

SQL> ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 1;

*第 1 行出现错误:

ORA-01624: 日志 1 是紧急恢复实例 aidu (线程 1) 所必需的

ORA-00312: 联机日志 1 线程 1: 'C:ORADATAAIDUREDO01B.LOG'

这样我们只能做不完全的恢复了,恢复的方法有两个:

  1. 使用RMAN或者手工进行基于CANCEL的恢复。

SQL>SHUTDOWN IMMEDIATE;

手工删除数据文件(DATAFILE)

C:>RMAN TARGET /

RMAN>STARTUP MOUNT

RMAN>RUN{

ALLOCATE CHANNEL D1 TYPE DISK;

RESTORE DATABASE;

RECOVER DATABASE;

RELEASE CHANNEL D1;}

RMAN>ALTER DATABASE OPEN RESETLOGS;

这里不详细讨论RMAN的恢复。

  1. 使用EXP,IMP进行恢复。

具体操作步骤如下:

SQL>SHUTDOWN IMMEDIATE;

在init.ora中加入参数: _allow_resetlogs_corruption=TRUE

重新启动数据库,利用until cancel恢复

SQL>recover database until cancel;

Cancel

如果出错,不再理会,发出

SQL>alter database open resetlogs;

数据库被打开后,马上执行一个full export

shutdown数据库,去掉_all_resetlogs_corrupt参数

重建库

import并完成恢复

建议执行一下ANALYZE TABLE ...VALIDATE STRUCTURE CASCADE

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

请登录后发表评论 登录
全部评论

注册时间:2010-07-27

  • 博文量
    175
  • 访问量
    778873