Chinaunix首页 | 论坛 | 博客
  • 博客访问: 254860
  • 博文数量: 59
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 698
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-19 21:17
文章分类

全部博文(59)

文章存档

2009年(14)

2008年(45)

我的朋友

分类: Oracle

2008-11-04 20:44:15

    今天在公司闲着没事情,自己就搞了错误,自己来恢复恢复,随手就把所遇的日志文件全部给删除了。
我是在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) |
0

上一篇:约束测试

下一篇:RMAN备份策略(转载)

给主人留下些什么吧!~~