一、控制文件的定位
启动到nomount状态后,Oracle就可以从参数文件中获得控制文件的位置信息,并根据控制文件中记录的数据文件位置进行数据文件的存在性判断。
在nomount状态,可以查询v$parameter视图,获得控制文件,这部分信息来自启动的参数文件;
SQL> select * from v$controlfile;
no rows selected
SQL> show parameter control_files
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_files string /home/oracle/app/oracle/oradat
a/orcl/control01.ctl, /home/or
acle/app/oracle/flash_recovery
_area/orcl/control02.ctl
当数据库mount之后,可以查询v$controlfile视图获得关于控制文件的信息,此时,这部分信息来自控制文件:
SQL> alter database mount;
Database altered.
SQL> select STATUS, NAME from v$controlfile;
STATUS NAME
--------- --------------------------------------------------------------
/home/oracle/app/oracle/oradata/orcl/control01.ctl
/home/oracle/app/oracle/flash_recovery_area/orcl/control02.ctl
在mount数据库的过程中,Oracle需要找到控制文件,锁定控制文件。Oracle的3个控制文件内容完全相同,丢失了其中一个可以通过复制来回复丢失的控制文件;如果丢失了所有控制文件,就需要恢复或重建控制文件来打开数据库。
二、数据文件的存在性判断
当mount数据库后,后台进程就可以根据控制文件中记录的数据文件信息来验证数据文件是否存在。
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/home/oracle/app/oracle/oradata/orcl/system01.dbf
/home/oracle/app/oracle/oradata/orcl/sysaux01.dbf
/home/oracle/app/oracle/oradata/orcl/undotbs01.dbf
/home/oracle/app/oracle/oradata/orcl/users01.dbf
/home/oracle/app/oracle/oradata/orcl/example01.dbf
三、控制文件的HeartBeat
在mount数据库的过程中,数据库需要计算mount id并将其记录在控制文件中,然后启动心跳(HeartBeat),每3秒更新一次控制文件。控制文件在mount状态下发生改变的只有这个HeartBeat。
HeartBeat值可以从一个内部表X$kCCCP中查到:
SQL> select cphbt from X$KCCCP;
CPHBT
----------
801632556
Oracle在数据库内部通过等待时间control file heartbeat来记录这个事件的相关等待;如果使用自动存储管理技术,那么还会增加一个ASM实例的心跳事件。
SQL> select event#, name
2 from v$event_name where name like '%heart%';
EVENT# NAME
---------- ----------------------------------------------------------------
75 heartbeat monitor sleep
380 ASM mount : wait for heartbeat
563 control file heartbeat
四、口令文件的作用
数据库的口令文件位于$ORACLE_HOME/dbs目录下,缺省的名称为orapw<ORACLE_SID>。口令文件中存放SYSDBA/SYSOPER用户的用户名及口令。
对于口令文件,Oracle缺省查找orapw<ORACLE_SID>文件,如果该文件不存在,则继续查找orapw文件。
如果口令文件丢失,可以通过orapw工具即可重建,所以备份时可以不包含口令文件:
SQL> !orapwd
Usage: orapwd file=<fname> entries=<users> force=<y/n> ignorecase=<y/n> nosysdba=<y/n>
where
file - name of password file (required),
password - password for SYS will be prompted if not specified at command line,
entries - maximum number of distinct DBA (optional),
force - whether to overwrite existing file (optional),
ignorecase - passwords are case-insensitive (optional),
nosysdba - whether to shut out the SYSDBA logon (optional Database Vault only).
There must be no spaces around the equal-to (=) character.
启动过程中如果口令文件丢失,和口令文件相关的部分功能将无法使用,比如进行SYSDBA的授权或者尝试远程通过SYSDBA身份登录都会出现错误。
数据库例具有SYSDBA/SYSOPER权限的用户可以通过v$pwfile_users视图查询得到:
SQL> select * from v$pwfile_users;
USERNAME SYSDB SYSOP SYSAS
------------------------------ ----- ----- -----
SYS TRUE TRUE FALSE
五、lk<ORACLE_SID>文件及作用
存在于$ORACLE_HOME/dbs目录下,该文件在数据库启动时创建,用于操作系统对数据库的锁定。当数据库启动时获得锁定,数据库关闭时释放。
在Oracle 10g中Oracle引入了db_unique_name参数。如果想在同一台机器上mount相同DB_NAME的数据库需要修改此参数。
SQL> show parameter db_unique_name;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_unique_name string orcl