Oracle redo logfile group丢失情况分析
Redo logfile是用来记录oracle数据库的事务日志,当redo logfile无意丢失时,此时数据库将不能正常使用.之前,笔者就遇到过一些,对此做一些概括,有不足之处,欢迎补充
测试环境 windows 2003 + oracle 10204
当前日志组情况
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing op
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- -------------
FIRST_CHANGE# FIRST_TIME
------------- --------------
1 1 25 52428800 1 YES INACTIVE
725982 17-3月 -10
2 1 26 52428800 1 YES ACTIVE
765646 22-3月 -10
3 1 27 52428800 1 NO CURRENT
814523 23-3月 -10
情况一
当丢失的日志组是当前正在使用的,并且在数据库正常关闭后
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 中
指定日志: {=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 中
指定日志: {=suggested | filename | AUTO | CANCEL}
cancel;
ORA-00308: 无法打开归档日志 'cancel;'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
指定日志: {=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 中
指定日志: {=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 中
指定日志: {=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即使生成了,数据库也无法打开.
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14474335/viewspace-630234/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/14474335/viewspace-630234/