控制文件是个相当小的二进制文件,最多能增长到64m左右。
参数文件告诉实例控制文件的位置。而控制文件告诉实例:数据库名,数据文件的名称及其位置,在线重做日志文件的名称及其位置,以及系统和各个数据文件的SCN信息。
我们的Oracle内部的几个人,都比较喜欢往ctl上面写东东,比如:
server process会把数据库结构的变化更新到control file
LGWR会把当前日志序列号记录到control file
CKPT会把检查点信息记录到control file
ARCn会把归档日志信息记录到control file
有了以上的信息,因此,在mount阶段,SMON会去读控制文件,确认它上面的记录是否正确:
1)上次关机的SCN A
上次关机的checkpoint B
2)日志组最后一条的记录 C
RBA指针的位置 D
若正常关机,则 A=B C=D
若不正常关机,则 A>B D>C
这时,就需要派SMON去前滚,按重做日志的记录在内存中重做一遍,直到C=D。
以下是我的控制文件的部分摘录:
平台是:RHEL-5.8 ora10g
*** SERVICE NAME:() 2012-07-10 10:09:23.691
*** SESSION ID:(159.3) 2012-07-10 10:09:23.691
Thread 1 checkpoint: logseq 17, block 2, scn 676899
cache-low rba: logseq 17, block 40599
on-disk rba: logseq 17, block 40868, scn 697180
start recovery at logseq 17, block 40599, scn 0
我们对控制文件的一些常见操作,比如:
1)如何多路镜像控制文件?
正常关机,cp一份,修改pfile,生成spfile,重启数据库
2)查看控制文件的位置?
i SQL> show parameter control_files
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_files string /u01/app/oracle/oradata/ORCL/c
ontrolfile/o1_mf_7xzsjpnk_.ctl
, /u01/app/oracle/flash_recove
ry_area/ORCL/controlfile/o1_mf
_7xzsjq6j_.ctl
ii SQL> select name from v$controlfile;
NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/ORCL/controlfile/o1_mf_7xzsjpnk_.ctl
/u01/app/oracle/flash_recovery_area/ORCL/controlfile/o1_mf_7xzsjq6j_.ctl
iii SQL> select value from v$parameter where name='control_files';
VALUE
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/ORCL/controlfile/o1_mf_7xzsjpnk_.ctl, /u01/app/oracle/fl
ash_recovery_area/ORCL/controlfile/o1_mf_7xzsjq6j_.ctl
3)查看控制文件的内容?
alter database backup controlfile to trace;
然后到udump下去找