li
  当前位置:主页 > 性能优化 > 文章内容
li
案例分析:ORA-01178错误释疑
来源: www.ixdba.net  作者: IXDBA.NET官方    时间:2007-12-31   阅读:10  

新建datafile丢失,无备份,要恢复,得满足下面两个条件:
1.
有建datafile以来的全部归档
2.
能从早于datafile创建的某个时间点开始恢复,应用日志。

第一个条件很容易理解,没有日志那一切免谈。


第二个条件,从早于datafile创建的时间开始应用日志,才能读到创建datafile的记录,才能在控制文件中恢复出该dataflie的记录,才能使用alter database create datafile的重新创建该datafile的物理文件。

www.ixdba.net



对于使用创建datafile之前的备份的控制文件来做恢复的情况,明显可以符合上面的条件,所以之前我的实验可以成功。

对于重建控制文件的情况,如果重建控制文件的脚本中的所有datafile是处于一致的状态的,那么重建控制文件后,是不会从早于丢失的datafile的某个时间点开始恢复的,也就应用不到创建datafile的日志,控制文件中也就恢复不出该datafile的记录,这个时间数据库可以open,但是该datafile丢失。

为什么有些人重建控制文件也可以恢复?
1.
非正常关闭数据库
2.
创建datafile的日志还在online redo logfile中,在最后一次checkpoint之前

这种情况下,重建控制文件后,recover database until time,由于非正常关闭数据库,可以从最后一次checkpoint处开始应用日志,就能读取到创建datafile的记录,从而在controlfile中恢复出该datafile的记录,后面也就能alter database create datafile了。

猜想另外一种情况:
如果有其他某个datafile早于丢失的这个datafile的创建时间点的备份文件,且有这个备份后的所有归档,将这个datafile  restore,然后重建控制文件后,再来recover database until time到创建datafile后的一个时间点,应该可以从备份的那个datafile的时间开始恢复,应当是可以恢复成功的。

 

 

以下是ORA-01178错误释疑

操作步骤:


1:建立测试表空间,并且dump出控制文件信息,然后关闭数据库删除测试表空间数据文件。
2
:重新创建控制文件,进行create恢复。发生ORA-01178错误。
3
dump出此时的控制文件信息。
4
:比较创建控制文件前后控制文件信息的异同。

具体如下:
[oracle@test cicro]$ sqlplus "/as sysdba"

SQL*Plus: Release 9.2.0.1.0 - Production on Mon Aug 28 14:10:26 2006

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
/以下建立测试表空间
SQL>create tablespace exitgogo datafile '/opt/oracle/oradata/exitgogo/exitgogo.dbf' size 100m;
Tablespace created
/建立测试表,添加数据
SQL> create table b tablespace exitgogo as select * from all_objects;

Table created.

SQL> insert into b select * from b;

29621 rows created.

SQL> /

59242 rows created.

SQL> /

118484 rows created.

SQL> commit;

Commit complete.
/生成控制文件备份
SQL> alter database backup controlfile to trace;
Database altered.

/dump出控制文件信息
SQL>alter session set events 'immediate trace name CONTROLF level 10;
session altered.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> quit
[oracle@test exitgogo]$ sqlplus "/as sysdba"
SQL*Plus: Release 9.2.0.1.0 - Production on Mon Aug 28 14:18:29 2006
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Connected to an idle instance.

/重新创建控制文件
SQL> @exitgogo
ORACLE instance started.

Total System Global Area 235999352 bytes
Fixed Size 450680 bytes
Variable Size 201326592 bytes
Database Buffers 33554432 bytes
Redo Buffers 667648 bytes

Control file created.
SQL> quit
Disconnected from Oracle9i Release 9.2.0.1.0 - Production
JServer Release 9.2.0.1.0 – Production

/删除exitgogo表空间数据文件
[oracle@test exitgogo]$ mv exitgogo.dbf exitgogo1.dbf temp
[oracle@test exitgogo]$ sqlplus "/as sysdba"
SQL*Plus: Release 9.2.0.1.0 - Production on Mon Aug 28 14:20:22 2006
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Connected to:
Oracle9i Release 9.2.0.1.0 - Production
JServer Release 9.2.0.1.0 - Production
/尝试打开数据库
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01157: cannot identify/lock data file 15 - see DBWR trace file
ORA-01110: data file 15: '/opt/oracle/oradata/exitgogo/exitgogo.dbf'

/由于数据文件不存在,尝试创建数据文件,但是不能创建成功。
SQL> alter database create datafile '/opt/oracle/oradata/exitgogo/exitgogo.dbf'
2 ;
alter database create datafile '/opt/oracle/oradata/exitgogo/exitgogo.dbf'
*
ERROR at line 1:
ORA-01178: file 15 created before last CREATE CONTROLFILE, cannot recreate
ORA-01110: data file 15: '/opt/oracle/oradata/exitgogo/exitgogo.dbf'

SQL> quit
Disconnected from Oracle9i Release 9.2.0.1.0 - Production
JServer Release 9.2.0.1.0 – Production

/恢复刚才产出的数据文件,可以正常打开数据库
[oracle@test exitgogo]$ mv temp/exitgogo* .
[oracle@test exitgogo]$ sqlplus "/as sysdba"
SQL*Plus: Release 9.2.0.1.0 - Production on Mon Aug 28 14:25:46 2006
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Connected to:
Oracle9i Release 9.2.0.1.0 - Production
JServer Release 9.2.0.1.0 - Production

SQL> recover database;
ORA-00283: recovery session canceled due to errors
ORA-00264: no recovery required
SQL> alter database open;
Database altered.
/dump出此时的控制文件信息
SQL>alter session set events 'immediate trace name CONTROLF level 10;
session altered.

以下是对此操作的释疑:


此时我们根据在创建控制文件前后,抓取的控制文件信息,通过diff命令选取控制文件中exitgogo.dbf文件的信息新旧对比如下:

< DATA FILE #11:
< (name #7) /opt/oracle/oradata/cicro/exitgogo.dbf
< creation size=0 block size=8192 status=0x2 head=7 tail=7 dup=1
< tablespace 13, index=11 krfil=11 prev_file=12
---
> TA FILE #11:
> (name #15) /opt/oracle/oradata/cicro/exitgogo.dbf
> creation size=640 block size=8192 status=0xe head=15 tail=15 dup=1
> tablespace 13, index=12 krfil=11 prev_file=0
6,7c6,7

< Checkpoint cnt:21 scn: 0x0000.01859b9c 08/28/2006 10:43:37
< Stop scn: 0xffff.ffffffff 08/28/2006 11:00:04
---
> Checkpoint cnt:20 scn: 0x0000.0182bc59 08/27/2006 19:10:57
> Stop scn: 0xffff.ffffffff 08/27/2006 19:03:57
9,11c9,11

< thread:0 rba:(0x0.0.0)
< enabled threads: 00000000 00000000 00000000 00000000 00000000 00000000
< 00000000 00000000
---
> thread:1 rba:(0x1e.2cc.10)
> enabled threads: 01000000 00000000 00000000 00000000 00000000 00000000
> 00000000 00000000
13c13



  
以上就是创建控制文件前后exitgogo.dbf在控制文件中的不同点,其实主要是creationCheckpoint cnt以及rba的不同。

由于oracle在重新创建控制文件后,creationCheckpoint cnt以及rba的不同,控制文件中记录的原来创建表空间数据文件信息丢失,因此oracle是不会从早于丢失的datafile的某个时间点开始恢复的,也就应用不到创建datafile的日志,从控制文件中也就恢复不出该datafile的记录,这个时间如果没有备份,可以offline掉此数据文件,数据库可以open,但是该datafile数据丢失。




  上一篇: 案例分析:ORA-01000: maximum o...   下一篇: 案例分析:ORA-01461错误
li
 §相关评论  
 热点文章

·Resize datafile导致ASM Crash
·在Oracle10g RAC下新增ASM磁盘
·ORACLE SQL性能优化系列 (一)
·oracle性能调优:管理oracle日志
·oracle RAC环境中系统时钟的调
·why:Rac的心跳线不支持交叉线?
·RAC的VIP及实例依赖关系:版本O
·如何启动DataGuard的备用数据库
·系统表空间IO错误 数据损坏处理
·不幸中的万幸:遭遇ORA-00600 [
·用ORACLE的高级复制实现内外网
li
 编辑推荐
·Resize datafile导致ASM Crash
·在Oracle10g RAC下新增ASM磁盘
·ORACLE SQL性能优化系列 (一)
·oracle性能调优:管理oracle日志
·oracle RAC环境中系统时钟的调
·why:Rac的心跳线不支持交叉线?
·RAC的VIP及实例依赖关系:版本O
·如何启动DataGuard的备用数据库
·系统表空间IO错误 数据损坏处理
·不幸中的万幸:遭遇ORA-00600 [
·用ORACLE的高级复制实现内外网
li
 相关篇章
·案例分析:ORA-01000: maximum o...
·案例分析:ora-04031与ora-04030...
·oracle大师谈:OS与oracle异同探...
·问题释疑:如何配置才能使客户端...
·32bit oracle 扩展SGA原理
·强烈推荐:oracle10g+rac配置sta...
·关于数据库open的深入探究
·oracle优化:oracle诊断性能问题
·强烈推荐:ORACLE学习笔记--性能优...
·PGA:关于pga_aggregate_target的...
·案例分析:ORA-01461错误
·案例分析:ORA-12500错误案例
·案例分析:ORA-25153: Temporary...
·Oracle优化经典文章--磁盘I/O和碎...
·oracle问题小结一:ORACLE常见错...
·Java用OCI驱连Oracle数据库的实现...
·Oracle数据库ASM功能详解
·阿里巴巴公司DBA笔试题
·案例解决:一次oracle掉电的处理...
·我的oracle笔记,欢迎收看!
 
li
设为首页 | 关于我们 | 技术服务 | 收藏本站 | 网站地图 | 联系方式 | 本站友情连接