在网上看到关于丢失重做日志的文档,自己做了一下。下面是过程。
OS:WINDOWS XP SP2
DB:ORACLE 9.2.0.1
联机日志分为当前联机日志和非当前联机日志,非当前联机日志的损坏是比较简单的,一般通过clear命令就可以解决问题。
损坏当前联机日志:
归档模式下当前日志的损坏有两种情况,
一、是数据库是正常关闭,日志文件中没有未决的事务需要实例恢复,当前日志组的损坏就可以直接用alter database clear unarchived logfile group n来重建。
二、是日志组中有活动的事务,数据库需要媒体恢复,日志组需要用来同步,有两种补救办法
A. 最好的办法就是通过不完全恢复,可以保证数据库的一致性,但是这种办法要求在归档方式下,并且有可用的备份
B. 通过强制性恢复,但是可能导致数据库不一致。
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.
C:\Documents and Settings\zero>sqlplus "/ as sysdba"
SQL*Plus: Release 9.2.0.1.0 - Production on 星期日 1月 27 16:24:56 2008
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
已连接。
SP2-0614: 服务器版本太低,不能实现此功能
SP2-0614: 服务器版本太低,不能实现此功能
SQL> shutdown abort;
ORACLE 例程已经关闭。
SQL> startup;
ORACLE 例程已经启动。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
1、进行非当前重做日志的故障模拟和恢复
SQL> select group#,sequence#,archived,status from v$log;
GROUP# SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
1 226 YES INACTIVE
2 227 NO CURRENT
3 225 YES INACTIVE
4 224 YES INACTIVE
SQL> shutdown abort;
ORACLE 例程已经关闭。
SQL> host move LOGZERO4.ORA logzero04.ora.bak
系统找不到指定的文件。
SQL> host move D:\oracle\oradata\zero\LOGZERO4.ORA D:\oracle\oradata\zero\logzero04.ora.bak
SQL> startup;
ORACLE 例程已经启动。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
ORA-00313: 无法打开日志组 4 (线程 1) 的成员
ORA-00312: 联机日志 4 线程 1: 'D:\ORACLE\ORADATA\ZERO\LOGZERO4.ORA'
SQL> select group#,sequence#,archived,status from v$log;
GROUP# SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
1 226 YES INACTIVE
2 227 NO INVALIDATED
3 225 YES INACTIVE
4 224 YES INACTIVE
SQL> alter database clear logfile group 4;
数据库已更改。
SQL> alter database open;
数据库已更改。
SQL> host del D:\oracle\oradata\zero\logzero04.ora.bak;
SQL> select group#,sequence#,archived,status from v$log;
GROUP# SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
1 226 YES INACTIVE
2 227 YES INACTIVE
3 225 YES INACTIVE
4 228 NO CURRENT
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> select group#,sequence#,archived,status from v$log;
select group#,sequence#,archived,status from v$log
*
ERROR 位于第 1 行:
ORA-01034: ORACLE not available
2、进行当前重做日志(未归档)故障模拟和恢复(有数据库备份)
SQL> host move D:\oracle\oradata\zero\LOGZERO4.ORA D:\oracle\oradata\zero\logzero04.ora.bak
SQL> startup;
ORACLE 例程已经启动。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
ORA-00313: 无法打开日志组 4 (线程 1) 的成员
ORA-00312: 联机日志 4 线程 1: 'D:\ORACLE\ORADATA\ZERO\LOGZERO4.ORA'
SQL> alter database clear unarchived logfile group 4;
alter database clear unarchived logfile group 4
*
ERROR 位于第 1 行:
ORA-00313: 无法打开日志组 4 (线程 1) 的成员
ORA-00312: 联机日志 4 线程 1: 'D:\ORACLE\ORADATA\ZERO\LOGZERO4.ORA'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
SQL> select group#,sequence#,archived,status from v$log;
GROUP# SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
1 226 YES INACTIVE
2 227 YES INACTIVE
3 0 YES UNUSED
4 0 NO CLEARING_CURRENT
SQL> alter database clear unarchived logfile group 1;
数据库已更改。
SQL> alter database clear unarchived logfile group 4;
alter database clear unarchived logfile group 4
*
ERROR 位于第 1 行:
ORA-00313: 无法打开日志组 4 (线程 1) 的成员
ORA-00312: 联机日志 4 线程 1: 'D:\ORACLE\ORADATA\ZERO\LOGZERO4.ORA'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
由于之前没有备份,所以在此处暂时物理恢复。
SQL> host move D:\oracle\oradata\zero\logzero04.ora.bak D:\oracle\oradata\zero\LOGZERO4.ORA
SQL> alter database open;
数据库已更改。
完成之后,在rman里面做一次数据库全备份。然后进行下面操作
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> host move D:\oracle\oradata\zero\LOGZERO4.ORA D:\oracle\oradata\zero\logzero04.ora.bak
SQL> startup;
ORACLE 例程已经启动。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> alter database clear unarchived logfile group 4;
数据库已更改。
SQL> select group#,sequence#,archived,status from v$log;
GROUP# SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
1 230 NO CURRENT
2 227 YES INACTIVE
3 229 YES INACTIVE
4 0 YES UNUSED
SQL> host del D:\oracle\oradata\zero\logzero04.ora.bak;
SQL> select group#,sequence#,archived,status from v$log;
GROUP# SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
1 230 NO CURRENT
2 227 YES INACTIVE
3 229 YES INACTIVE
4 0 YES UNUSED
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> host move D:\oracle\oradata\zero\REDO01.LOG D:\oracle\oradata\zero\REDO01.LOG.BAK
SQL> startup;
ORACLE 例程已经启动。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
ORA-00313: 无法打开日志组 1 (线程 1) 的成员
ORA-00312: 联机日志 1 线程 1: 'D:\ORACLE\ORADATA\ZERO\REDO01.LOG'
SQL> alter database clear unarchived logfile group 1;
alter database clear unarchived logfile group 1
*
ERROR 位于第 1 行:
ORA-00313: 无法打开日志组 1 (线程 1) 的成员
ORA-00312: 联机日志 1 线程 1: 'D:\ORACLE\ORADATA\ZERO\REDO01.LOG'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
SQL> select group#,sequence#,archived,status from v$log;
GROUP# SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
1 0 NO CLEARING_CURRENT
2 227 YES INACTIVE
3 229 YES INACTIVE
4 0 YES UNUSED
SQL> recover database until cancel;
完成介质恢复。
SQL> alter database open resetlogs;
数据库已更改。
SQL> host del D:\oracle\oradata\zero\redo01.log.bak;
SQL>
SQL> select group#,sequence#,archived,status from v$log;
GROUP# SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
1 1 YES INACTIVE
2 2 YES INACTIVE
3 3 NO CURRENT
4 0 YES UNUSED
SQL> alter system archive log current;
系统已更改。
SQL> alter system archive log current;
系统已更改。
SQL> select group#,sequence#,archived,status from v$log;
GROUP# SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
1 5 NO CURRENT
2 2 YES INACTIVE
3 3 YES INACTIVE
4 4 YES INACTIVE
注意,在使用resetlogs打开数据库之后,sequence#重置了。
3、进行当前重做日志(未归档)故障模拟和恢复(无数据库备份)
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> host move D:\oracle\oradata\zero\REDO01.LOG D:\oracle\oradata\zero\REDO01.LOG.BAK
SQL> host move D:\oracle\oradata\zero\REDO01.LOG.BAK D:\oracle\oradata\zero\REDO01.LOG
SQL> startup;
ORACLE 例程已经启动。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> select group#,sequence#,archived,status from v$log;
GROUP# SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
1 5 YES INACTIVE
2 6 NO CURRENT
3 3 YES INACTIVE
4 4 YES INACTIVE
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> host move D:\oracle\oradata\zero\REDO01.LOG D:\oracle\oradata\zero\REDO01.LOG.BAK
SQL> startup;
ORACLE 例程已经启动。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
ORA-00313: 无法打开日志组 1 (线程 1) 的成员
ORA-00312: 联机日志 1 线程 1: 'D:\ORACLE\ORADATA\ZERO\REDO01.LOG'
SQL> host move D:\oracle\oradata\zero\REDO01.LOG.BAK D:\oracle\oradata\zero\REDO01.LOG
SQL> alter database open;
数据库已更改。
SQL> select group#,sequence#,archived,status from v$log;
GROUP# SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
1 5 YES INACTIVE
2 6 YES INACTIVE
3 7 NO CURRENT
4 4 YES INACTIVE
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> host move D:\oracle\oradata\zero\REDO03.LOG D:\oracle\oradata\zero\REDO03.LOG.BAK
SQL> startup;
ORACLE 例程已经启动。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
ORA-00313: 无法打开日志组 3 (线程 1) 的成员
ORA-00312: 联机日志 3 线程 1: 'D:\ORACLE\ORADATA\ZERO\REDO03.LOG'
SQL> select group#,sequence#,archived,status from v$log;
GROUP# SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
1 5 YES INACTIVE
2 6 YES INACTIVE
3 7 NO CURRENT
4 4 YES INACTIVE
SQL> alter database clear unarchived logfile group 3;
alter database clear unarchived logfile group 3
*
ERROR 位于第 1 行:
ORA-00313: 无法打开日志组 3 (线程 1) 的成员
ORA-00312: 联机日志 3 线程 1: 'D:\ORACLE\ORADATA\ZERO\REDO03.LOG'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
SQL> create pfile='d:\init.ora' from spfile;
文件已创建。
SQL> shutdown immediate;
ORA-01109: 数据库未打开
已经卸载数据库。
ORACLE 例程已经关闭。
在init.ora里面加入_allow_resetlogs_corruption=TRUE参数。然后利用init.ora启动实例
SQL> startup mount pfile ='d:\init.ora';
ORACLE 例程已经启动。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
SQL> recover database until cancel;
完成介质恢复。
SQL> alter database open resetlogs;
数据库已更改。
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount pfile ='d:\init.ora';
ORACLE 例程已经启动。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
SQL> create spfile from pfile='d:\init.ora';
文件已创建。
SQL> shutdown immediate;
ORA-01109: 数据库未打开
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup;
ORACLE 例程已经启动。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> alter system archive log current;
系统已更改。
SQL> select group#,sequence#,archived,status from v$log;
GROUP# SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
1 2 YES INACTIVE
2 3 YES ACTIVE
3 1 YES INACTIVE
4 4 NO CURRENT
SQL>
至此,数据库恢复完成,但是数据库数据可能会出现不一致。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/79499/viewspace-417646/
,如需转载,请注明出处,否则将追究法律责任。