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即使生成了,数据库也无法打开.
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即使生成了,数据库也无法打开.
相关文章推荐
- 【Oracle Log file 恢复】 已归档、非当前的 Redo LogFile 损坏
- redo文件丢失恢复
- Oracle非关键文件恢复,redo、临时文件、索引文件、密码文件
- Oracle备份恢复-redo文件损坏的各种场景恢复专题
- 查看当前redo logfile文件使用率
- 详解MySQL恢复psc文件记录数为0的解决方案
- redo文件破坏恢复
- SVN删除文件及其恢复问题详解
- MySQL单表ibd文件恢复方法详解
- Oracle linux下 rm 数据文件恢复测试详解
- bzip2recover命令_Linux bzip2recover 命令用法详解:恢复被破坏的.bz2压缩包中的文件
- Oracle数据库RMAN恢复之数据文件的恢复详解
- 详解MySQL恢复psc文件记录数为0的解决方案
- restorecon命令_Linux restorecon 命令用法详解:恢复文件的安全上下文
- Oracle 联机重做日志文件OnlineRedoLogFile 推荐
- 【Oracle Log file 恢复】 已归档、非当前的 Redo LogFile 损坏
- 从备份集恢复参数文件、控制文件、数据文件,redo文件、密码文件
- Linux恢复删除文件的lsof命令详解
- 同时丢失参数文件、控制文件及redo log file的不完全恢复(有数据文件的热备和归档)
- 未启用归档数据库非数据文件(spfile,control,redo,undo,temp)全丢失的恢复方法