方法一:用命令清空日志组方法
1 正常关闭数据库
SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
2 删除所有的重做日志文件
3 启动数据库
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 167772160 bytes
Fixed Size 1247876 bytes
Variable Size 67110268 bytes
Database Buffers 92274688 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
ORA-00313: 无法打开日志组 1 (用于线程 1) 的成员
ORA-00312: 联机日志 1 线程 1:
'E:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO01.LOG'
4查看当前日志状态
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ---------------
FIRST_CHANGE# FIRST_TIME
------------- --------------
1 1 0 52428800 1 YES UNUSED
543031 19-5月 -10
3 1 0 52428800 1 YES CLEARING
519887 18-5月 -10
2 1 50 52428800 1 NO CURRENT
563367 19-5月 -10
(1) 由于redo01.log不是当前日志,可以对这类非当前日志直接clear,系统会重新自动生成一个重做日志文件
SQL> alter database clear logfile group 1;
数据库已更改。
5 继续启动数据库
SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-00313: 无法打开日志组 2 (用于线程 1) 的成员
ORA-00312: 联机日志 2 线程 1:
'E:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG'
(2) 发现redo02.log也得恢复,因为redo02.log是当前重做日志文件,尝试直接clear,失败
SQL> alter database clear logfile group 2;
alter database clear logfile group 2
*
第 1 行出现错误:
ORA-00350: 日志 2 (实例 orcl 的日志, 线程 1) 需要归档
ORA-00312: 联机日志 2 线程 1:
'E:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG'
尝试alter database clear unarchived logfile group 2,失败
SQL> alter database clear unarchived logfile group 2;
alter database clear unarchived logfile group 2
*
第 1 行出现错误:
ORA-00313: 无法打开日志组 2 (用于线程 1) 的成员
ORA-00312: 联机日志 2 线程 1:
'E:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
(3) 从有效的备份中拷贝过来一个redo02.log后
SQL> alter database clear unarchived logfile group 2;
数据库已更改。
SQL> alter database open;
数据库已更改。
结论: (1)非当前(current)的未归档日志文件恢复都可以直接alter database clear logfile group n来重新生成,非当前的归档日志文件恢复可以用alter database clear unarchived logfile group n来重新生成;对于当前日志, 归档日志文件恢复必须从有效的备份中复制一个,然后用alter database clear unarchived logfile group n;
方法二:用cancel模式恢复数据库
1 关闭数据库
SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
2 删除所有重做日志文件
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 167772160 bytes
Fixed Size 1247876 bytes
Variable Size 67110268 bytes
Database Buffers 92274688 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
ORA-00313: 无法打开日志组 1 (用于线程 1) 的成员
ORA-00312: 联机日志 1 线程 1:
'E:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO01.LOG'
3 用recover命令
SQL> recover database until cancel;
完成介质恢复。
SQL> alter database open;
alter database open
第 1 行出现错误:
ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项
SQL> alter database open resetlogs;
数据库已更改。
resetlogs是根据控制文件让系统自动重新生成重做日志文件,如果noresetlogs的话,就不会重新生成redo,缺少了文件,数据库无法启动。
方法三 通过重新生成控制文件来恢复redo
1 关闭数据库
SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
删除所有重做日志文件
2
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 167772160 bytes
Fixed Size 1247876 bytes
Variable Size 67110268 bytes
Database Buffers 92274688 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
ORA-00313: 无法打开日志组 1 (用于线程 1) 的成员
ORA-00312: 联机日志 1 线程 1:
'E:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO01.LOG'
3
SQL> alter database backup controlfile to trace;
数据库已更改。
4
SQL> shutdown immediate
ORA-01109: 数据库未打开
已经卸载数据库。
ORACLE 例程已经关闭。
5修改备份的控制文件中的脚本,如下,保存在E:/create.sql
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 'E:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO01.LOG' SIZE 50M,
GROUP 2 'E:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG' SIZE 50M,
GROUP 3 'E:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO03.LOG' SIZE 50M
-- STANDBY LOGFILE
DATAFILE
'E:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/SYSTEM01.DBF',
'E:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/UNDOTBS01.DBF',
'E:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/SYSAUX01.DBF',
'E:/ORACLE/PRODUCT/10.2.0/ORCL/TEST.DBF'
CHARACTER SET ZHS16GBK
;
6 执行create.sql
SQL> @E:/create.sql
ORACLE 例程已经启动。
Total System Global Area 167772160 bytes
Fixed Size 1247876 bytes
Variable Size 67110268 bytes
Database Buffers 92274688 bytes
Redo Buffers 7139328 bytes
控制文件已创建。
7用resetlogs打开数据库
SQL> alter database open resetlogs;
数据库已更改。
方法四 修改系统参数方法
SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 5月 19 22:44:14 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> conn sys/admin as sysdba
已连接。
SQL> conn test/test
已连接。
SQL> select * from test;
ID
----------
1
2
3
4
5
6
已选择6行。
SQL> insert into test values(7);
已创建 1 行。
SQL> commit;
提交完成。
SQL> conn sys/admin as sysdba
已连接。
SQL> shutdown abort;
ORACLE 例程已经关闭。
1 在initorcl.ora里加入_allow_resetlogs_corruption=true
2指定pfile启动数据库到mount
SQL> startup mount pfile='E:/oracle/product/10.2.0/admin/orcl/pfile/initorcl.ora';
ORACLE 例程已经启动。
Total System Global Area 167772160 bytes
Fixed Size 1247876 bytes
Variable Size 62915964 bytes
Database Buffers 96468992 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项
SQL> alter database open resetlogs;
数据库已更改。
3 检验数据是否丢失
SQL> select * from test.test;
ID
----------
1
2
3
4
5
6
已选择6行。
由于执行了shutdown abort,这时候对数据的修改还没有保存到数据文件中,虽然执行了commit,这个时候数据还在联机日志中,等待CKPT触发数据库写进程将数据写入数据文件,redo被删除后,数据也丢失了。