8050fkdh_.dbf
[oracle@localhost datafile]$ rm o1_mf_system_8050fk2z_.dbf
[oracle@localhost datafile]$ rm o1_mf_sysaux_8050fk3w_.dbf
[oracle@localhost datafile]$ rm o1_mf_users_8050fkdh_.dbf
[oracle@localhost datafile]$ rm o1_mf_undotbs1_8050fkc6_.dbf
[sql]
[oracle@localhost ~]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on Tue Jul 17 20:57:00 2012
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> conn / as sysdba
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area 419430400 bytes
Fixed Size 1219760 bytes
Variable Size 142607184 bytes
Database Buffers 272629760 bytes
Redo Buffers 2973696 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 1 - see DBWR trace file
ORA-01110: data file 1:
'/u01/app/oracle/oradata/ORCL/datafile/o1_mf_system_8050fk2z_.dbf'
因为,有控制文件,所以,我们会到mount状态,这是个oracle的介态。这个状态,我们可以做很多事。这时,它报文件1不能锁定。那么,我们一个个来。先把冷备的文件1拷来。
[oracle@localhost datafile]$ cp o1_mf_system_8050fk2z_.dbf /u01/app/oracle/oradata/ORCL/datafile
[sql]
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01113: file 1 needs media recovery
ORA-01110: data file 1:
'/u01/app/oracle/oradata/ORCL/datafile/o1_mf_system_8050fk2z_.dbf'
这个时候报的错误不一样了。报文件1需要媒介恢复。oracle是根据什么报这个错误的呢?要了解这个,我们需要借助两个视图。 www.2cto.com
[sql]
SQL> select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 587004
2 587004
3 587004
4 587004
5 587004
SQL> select file#,checkpoint_change# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 583375
2 0
3 0
4 0
5 587004
这两个视图所取的信息来源完全不一样。v$datafile的信息来自控制文件;v$datafile_header的信息则来自每个数据文件的文件头。我们刚刚已经把file 1拷回来,所以,oracle可以读到它头上的scn。而2,3,4已经被删了便是读不到的。但是,file 1在两处的scn不一致。记住了,oracle会横向比较,纵向是不会比较的。即:不会拿file 1和file 3比较。oracle打开的必要条件是控制文件和数据文件的文件头的scn要一致。那么大于583375,而小于585469的scn都在归档日志里面。每个scn对应相关的操作。
[sql]
SQL> select sequence#,first_change#,next_change# from v$archived_log;
SEQUENCE# FIRST_CHANGE# NEXT_CHANGE#
---------- ------------- ------------
5 544404 558719
6 558719 559931
7 559931 560709
8 560709 560959
9 560959 560981
10 560981 583374
什么是next_change# 日志组由当前日志组却换到非当前日志组时,所取的
系统scn,来作为它的最大scn。first_change#是它成为current的开始;而next_change#则是它结束了current生涯的标志。
我们知道,比583375小的scn都已经写入数据文件。现在,我们需要确定583375是落在哪对first_change#和next_change#之间。从而确定广义前滚的起点。
[sql]
SQL> select sequence#,first_change#,next_change# from v$archived_log
2 where 583375>=first_change# and
3 583375<=next_change#;
SEQUENCE# FIRST_CHANGE# NEXT_CHANGE#
---------- ------------- ------------
11 583374 586090
由此,我们知道,583375落在归档日志11的first_change#