启动到nomount之后,Oracle从参数文件中找到控制文件的信息,然后打开控制文件。
SQL> show parameter control_files;
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
control_files string
/export/home/oracle/oradata/ue
p4x/control01.ctl, /export/hom
e/oracle/oradata/uep4x/control
02.ctl, /export/home/oracle/or
adata/uep4x/control03.ctl
这三个控制文件的内容是完全一致的,如果其中一个控制文件损坏,我们可以用另外两个来恢复。
bash-3.00# mv control01.ctl control01.b
SQL> alter database mount
2 ;
alter database mount
*
ERROR at line 1:
ORA-00205: error in identifying control file, check alert log for more info
然后看一下日志文件:
bash-3.00# tail -20 alert_uep4x.log
......
Tue Jul 7 18:46:04 2009
alter database mount
Tue Jul 7 18:46:04 2009
ORA-00202: ????: ''/export/home/oracle/oradata/uep4x/control01.ctl''
ORA-27037: ????????
SVR4 Error: 2: No such file or directory
Additional information: 3
Tue Jul 7 18:46:07 2009
ORA-205 signalled during: alter database mount
然后我们复制一个控制文件:
bash-3.00# cp control02.ctl control01.ctl
bash-3.00# ls -l control*
-rw-r----- 1 oracle install 7061504 7月 7日 09:04 control01.b
-rw-r----- 1 root root 7061504 7月 7日 18:53 control01.ctl
-rw-r----- 1 oracle install 7061504 7月 7日 09:04 control02.ctl
-rw-r----- 1 oracle install 7061504 7月 7日 09:04 control03.ctl
bash-3.00# chown oracle:install control01.ctl
SQL> alter database mount;
Database altered.
这时候,数据库可以正常启动到mount状态了。我们可以再v$controlfile这个视图里查看到控制文件。
SQL> column name format a20
SQL> select * from v$controlfile;
STATUS NAME IS_ BLOCK_SIZE FILE_SIZE_BLKS
------- -------------------- --- ---------- --------------
/export/home/oracle/ NO 16384 430
oradata/uep4x/contro
l01.ctl
/export/home/oracle/ NO 16384 430
oradata/uep4x/contro
l02.ctl
/export/home/oracle/ NO 16384 430
oradata/uep4x/contro
l03.ctl
Oracle找到控制文件之后,就开始根据控制文件里的内容验证数据文件是否存在了。
SQL> column name format a50
SQL> select name from v$datafile;
NAME
--------------------------------------------------
/export/home/oracle/oradata/uep4x/system01.dbf
/export/home/oracle/oradata/uep4x/undotbs01.dbf
/export/home/oracle/oradata/uep4x/sysaux01.dbf
/export/home/oracle/oradata/uep4x/users01.dbf
/export/home/oracle/oradata/uep4x/example01.dbf
/export/home/oracle/oradata/uep4x/uep.dbf
/export/home/oracle/oradata/uep4x/UEP_CAF_FM.dbf
/export/home/oracle/oradata/uep4x/UEP_PM.dbf
/export/home/oracle/oradata/uep4x/n3common.dbf
/export/home/oracle/oradata/uep4x/IP_CM.dbf
/export/home/oracle/oradata/uep4x/IP_PM.dbf
NAME
--------------------------------------------------
/export/home/oracle/oradata/uep4x/IP_PM_INDEX.dbf
现在,我们做个试验,删除一个数据文件。在启动到open阶段的时候检查:
bash-3.00# mv UEP_PM.dbf UEP_PM.dbf.b
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01157: cannot identify/lock data file 8 - see DBWR trace file
ORA-01110: data file 8: '/export/home/oracle/oradata/uep4x/UEP_PM.dbf'
SQL> select FILE# from v$recover_file;
FILE#
----------
8
SQL> select name from v$datafile
2 where FILE#=8;
NAME
--------------------------------------------------
/export/home/oracle/oradata/uep4x/UEP_PM.dbf