一、nomount状态
数据库启动到nomount状态后会创建Instance,分配相应的内存区域,启动先应的后台进程。启动过程可以在告警日志文件(alert_<ORACLE_SID>.log)中查阅到,这一过程会对去参数文件,使用参数启动实例。
二、v$process视图
通过v$process视图,可以找到对应于操作系统的每一个进程信息
三、参数文件的选择
spfile<ORACLE_SID>.ora -> spfile.ora -> init<ORACLE_SID>.ora
SQL> show parameter spfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string $ORACLE_HOME/dbs/spfile<SID>.ora
四、实例启动最小参数需求
实例启动的最小参数需求是DB_NAME。
如果不设置background_dump_dest目录(告警日志文件的存放地点)缺省位于$ORACLE_HOME/rdbms/log目录下:
SQL> show parameter background_dump
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
background_dump_dest string /home/oracle/app/oracle/diag/r
dbms/orcl/orcl/trace
其它几个缺省路径地点:
SQL> show parameter dump_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
background_dump_dest string /home/oracle/app/oracle/diag/r
dbms/orcl/orcl/trace
core_dump_dest string /home/oracle/app/oracle/diag/r
dbms/orcl/orcl/cdump
user_dump_dest string /home/oracle/app/oracle/diag/r
dbms/orcl/orcl/trace
SQL> show parameter control_file
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time integer 7
control_files string /home/oracle/app/oracle/oradat
a/orcl/control01.ctl, /home/or
acle/app/oracle/flash_recovery
_area/orcl/control02.ctl
五、ORACL_SID的含义
ORACLE_SID就是Oracle System IDentifier的缩写,当Oracle实例启动时,在操作系统上fork的进程就一句这个ORACLE_SID来创建。
Oracle的实例是由一块共享内存区域(SGA)和一组后台进程共同组成的,而后台进程是数据库和操作系统进行交互的通道,这些进程的名称就是通过ORACLE_SID决定的。
ORACLE_SID还决定实例启动时所需参数文件的名称。
在不同的$ORACLE_HOME下,即使在同一台主机上,Oracle也能够创建相同ORACLE_SID的实例。
六、INSTANCE_NAME的含义
Oracle数据库内部存在一个初始化参数INSTANCE_NAME,用于表示数据库实例的名称,其缺省值通常就是ORACLE_SID;INSTANCE_NAME与ORACLE_SID可以不同,不同的实例也可以用于相同的INSTANCE_NAME.
在同一个ORACLE_HOME下,只要ORACLE_SID不同,数据库并不校验INSTANCE_NAME参数。
在数据库内部视图v$instance中也记录着一个INSTANCE_NAME,这个INSTANCE_NAME来自数据库实例的SID,始终和ORACLE_SID保持一致,这就可能出现数据库中这两个INSTANCE_NAME不一致的情况。
从Oracle 10g开始,参数文件中缺省不再记录INSTANCE_NAME,此时INSTANCE_NAME可以动态从系统获得。
INSTANCE_NAME除了用来标识实例名称之外,在监听器动态注册时还会用于监听器注册。监听器动态注册信息中的Instance内容就来自INSTANCE_NAME参数设置。
v$instance视图和数据库实例的生命周期相关,用于显示当前实例的状态,通过这个视图可以获得包括实例的启动时间、运行主机等重要信息。
七、DB_NAME与INSTANCE_NAME
DB_NAME代表了实例即将挂接的数据库名称,关系到具体的物理文件。通常缺省的数据库INSTANCE_NAME和DB_NAME可以设置相同(在RAC环境下,由于多个实例对应一个数据库,所以INSTANCE_NAME和DB_NAME不同)。
DB_NAME被记录在数据文件、日志文件和控制文件中。如果数据库实例启动过程中参数文件中的DB_NAME和控制文件中的数据库名称不一致,则数据库不能启动。
常见的几个结论有:
- 一个实例可以MOUNT并打开任何数据库,但是同一时间一个实例只能打开一个数据库。
- 一个数据库可以被一个或多个实例所MOUNT并打开(在OPS/RAC环境下,一个数据库可以被多个实例所打开)
- 在非并行模式(OPS/RAC)下,一个数据库同时只能被一个实例加载。
参数文件中的db_name和控制文件中的db_name不一致,数据库无法启动,错误提示指定的数据库名称和控制文件中记录的名称不符。
八、RMAN的缺省实例
在使用RMAN(Recovery Manager)时存在更为特殊的情况,Oracle允许在不存在参数文件的情况下启动一个实例,数据库的db_name会被缺省地命名为DUMMY。
九、小结
数据库的nomount过程实质上就是在创建实例,这个步骤只和参数文件相关。