今天在公司闲着没事情,自己就搞了错误,自己来恢复恢复,随手就把所遇的日志文件全部给删除了。
我是在windows下做的试验,在我删除日志文件的时候数据库是clean shutdown的。因此我相信没无论通过什么手段,这个库肯定是可以起来的。
我在shutdown数据库之前还做过一个操作那就是转储数据库的控制文件,因为自己感觉可能需要重新创建控制文件,因此就提前把控制文件的创建脚本给搞下来了。
我使用如下语句对控制文件进行转储:alter database backup controlfile to trace as 'c:\control.txt'
转储后有用的控制文件的重要脚本如下:
STARTUP NOMOUNT;
CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS NOARCHIVELOG
MAXLOGFILES 5
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 1
MAXLOGHISTORY 226
LOGFILE
GROUP 1 'E:\ORADATA\REDO01.LOG' SIZE 100M,
GROUP 2 'E:\ORADATA\REDO02.LOG' SIZE 100M,
GROUP 3 'E:\ORADATA\REDO03.LOG' SIZE 100M
DATAFILE
'E:\ORADATA\SYSTEM01.DBF',
'E:\ORADATA\UNDOTBS01.DBF',
'E:\ORADATA\CKTS_DATA01.DBF'
CHARACTER SET ZHS16GBK;
-------------------------------------------------------------------
CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS NOARCHIVELOG
-- SET STANDBY TO MAXIMIZE PERFORMANCE
MAXLOGFILES 5
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 1
MAXLOGHISTORY 226
LOGFILE
GROUP 1 'E:\ORADATA\REDO01.LOG' SIZE 100M,
GROUP 2 'E:\ORADATA\REDO02.LOG' SIZE 100M,
GROUP 3 'E:\ORADATA\REDO04.LOG' SIZE 100M
DATAFILE
'E:\ORADATA\SYSTEM01.DBF',
'E:\ORADATA\UNDOTBS01.DBF',
'E:\ORADATA\CKTS_DATA01.DBF'
CHARACTER SET ZHS16GBK;
以下是我个人做试验的过程:
在mount阶段所有的控制文件以及数据文件都是不可以删除的,那就说明,这些文件已经被oracle所关联上了,就是在创建控制文件中可能需要寻找这些文件在物理阶段是否存在,如果不存在的话,可能是不允许创建这些控制文件的。
----当日志文件删除后,直接启动会报错的
SQL> startup
ORACLE instance started.
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
Database mounted.
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: 'E:\ORADATA\REDO01.LOG'
-----查询数据库的状态为mount
SQL> select instance_name,status from v$instance;
INSTANCE_NAME STATUS
---------------- ------------
orcl MOUNTED
------查询数据库当前的数据库日志文件组
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ----------------
FIRST_CHANGE# FIRST_TIM
------------- ---------
1 1 0 104857600 1 YES UNUSED
0
2 1 1 104857600 1 NO CURRENT
442807 03-NOV-08
SQL> select * from v$logfile;
GROUP# STATUS TYPE
---------- ------- ------- MEMBER
--------------------------------------------------------------------------------
2 ONLINE
E:\ORADATA\REDO02.LOG
1 ONLINE
E:\ORADATA\REDO01.LOG
-----尝试清空日志文件组,这个命令如果执行成功,好像是可以创建该日志文件的
SQL> alter database clear logfile group 2;
alter database clear logfile group 2
*
ERROR at line 1:
ORA-00313: open failed for members of log group 2 of thread 1
ORA-00312: online log 2 thread 1: 'E:\ORADATA\REDO02.LOG'
ORA-27041: unable to open file
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
----关闭数据库,我从新开始尝试创建控制文件
SQL> shutdown immediate
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.
SQL> startup nomount
ORACLE instance started.
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS NOARCHIVELOG
2 MAXLOGFILES 5
3 MAXLOGMEMBERS 3
4 MAXDATAFILES 100
5 MAXINSTANCES 1
6 MAXLOGHISTORY 226
7 LOGFILE
8 GROUP 1 'E:\ORADATA\REDO01.LOG' SIZE 100M,
9 GROUP 2 'E:\ORADATA\REDO02.LOG' SIZE 100M,
10 GROUP 3 'E:\ORADATA\REDO03.LOG' SIZE 100M
11 DATAFILE
12 'E:\ORADATA\SYSTEM01.DBF',
13 'E:\ORADATA\UNDOTBS01.DBF',
14 'E:\ORADATA\CKTS_DATA01.DBF'
15 CHARACTER SET ZHS16GBK;
CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS NOARCHIVELOG
*
ERROR at line 1:
ORA-01503: CREATE CONTROLFILE failed
ORA-01565: error in identifying file 'E:\ORADATA\REDO01.LOG'
ORA-27041: unable to open file
OSD-04002: N^7(4r?*ND<~
O/S-Error: (OS 2) O5M3UR2;5=V86(5DND<~!#
/***************************************************************************************
创建控制文件出错,我伤心啊,呵呵。原来自己对这个错误是很有把握的呀,今天运气怎么这么背呢
****************************************************************************************/
---突然发现,既然数据库日志文件全部不存在,那么肯定是要在打开数据库时需要resetlogs打开数据
库的,那么在创建控制文件时有一个选项是决定是否需要open resetlogs打开数据库。这个时候我才醒悟。
于是使用如下语句创建控制文件。
SQL> CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS NOARCHIVELOG
2 -- SET STANDBY TO MAXIMIZE PERFORMANCE
3 MAXLOGFILES 5
4 MAXLOGMEMBERS 3
5 MAXDATAFILES 100
6 MAXINSTANCES 1
7 MAXLOGHISTORY 226
8 LOGFILE
9 GROUP 1 'E:\ORADATA\REDO01.LOG' SIZE 100M,
10 GROUP 2 'E:\ORADATA\REDO02.LOG' SIZE 100M,
11 GROUP 3 'E:\ORADATA\REDO04.LOG' SIZE 100M
12 DATAFILE
13 'E:\ORADATA\SYSTEM01.DBF',
14 'E:\ORADATA\UNDOTBS01.DBF',
15 'E:\ORADATA\CKTS_DATA01.DBF'
16 CHARACTER SET ZHS16GBK;
Control file created.
SQL> /
CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS NOARCHIVELOG
*
ERROR at line 1:
ORA-01503: CREATE CONTROLFILE failed
ORA-01100: database already mounted
-----上述错误是因为只能在nomount下创建,并且创建的目录中已经含有相同的控制文件名,要么删除,
要么reuse否则会出现错误的。
SQL> shutdown immediate
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.
SQL> startup nomount
ORACLE instance started.
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS NOARCHIVELOG
2 -- SET STANDBY TO MAXIMIZE PERFORMANCE
3 MAXLOGFILES 5
4 MAXLOGMEMBERS 3
5 MAXDATAFILES 100
6 MAXINSTANCES 1
7 MAXLOGHISTORY 226
8 LOGFILE
9 GROUP 1 'E:\ORADATA\REDO01.LOG' SIZE 100M,
10 GROUP 2 'E:\ORADATA\REDO02.LOG' SIZE 100M,
11 GROUP 3 'E:\ORADATA\REDO04.LOG' SIZE 100M
12 DATAFILE
13 'E:\ORADATA\SYSTEM01.DBF',
14 'E:\ORADATA\UNDOTBS01.DBF',
15 'E:\ORADATA\CKTS_DATA01.DBF'
16 CHARACTER SET ZHS16GBK;
Control file created.
-----控制文件成功创建后,因为原来数据库就是在一致性的状态,因此只需要open resetlogs打开数据库就可以了。
SQL> alter database open resetlogs;
Database altered.
/************************
更加进一步的结论:
1、用Noresetlogs重建控制文件时,控制文件中的各数据文件的Checkpoint来自Online logs中的Current log头。(可以用Alter session set events 'immediate trace name redohdr level 3;),因此在创建控制文件的时候,需要含有全部的日志文件,否则无法创建控制文件。
2、用Resetlogs重建控制文件时,控制文件中的各数据文件的Checkpoint来自各数据文件头。那这个时候创建控制文件需要所有的数据文件都要存在,而既然是resetlogs那么所以其就不检查日志文件文件是否存在了。
比如说users表空间的数据文件丢失了,那么使用resetlogs的脚本去创建文件时,发现users01.dbf文件无法找到,还是会报系统错误,这个时候我们可以在控制文件中去掉那个数据文件,可以使控制文件创建成功,然后打开数据库。但是此时控制文件中没有包含的数据文件名变为:C:\WINDOWS\ORACLE9I\DATABASE\MISSING00004。我们可以通过alter database rename file to 等方法去重新命名该数据文件,在重新命名的时候,命名后的数据文件必须已经存在。如果丢失的是系统表空间文件,那么数据库无法打开的。
其实这也比较好理解,不Resetlogs的话,因为可能logs中文件中部分日志信息,可能还没有写进数据文件。当前Online log中肯定是含有最新的Checkpoint,一旦Resetlogs,说明当前Online log 不可用,也就只好从各数据文件头来读取相应的Checkpoint了。
当然还有更进一步的结论为:
1)如果是非当前的日志文件坏掉,则可使用如下方法
alter database clear (unarchived) logfile group group#;
2)如果是当前的日志文件丢失
则加入_allow_resetlogs_corruption=true参数
当然还有什么adjust_scn的,那是更特殊的情况了。
阅读(1354) | 评论(0) | 转发(0) |