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