在这个过程里,Oracle首先会根据一定的顺序寻找参数文件,然后根据参数文件中的设置,创建实例,分配内存,启动后台进程。NOMOUNT的过程也就是启动数据库实例的过程。
在NOMOUNT初始化的过程中,只要拥有参数文件即可。这一步骤并不需要任何控制文件或者数据文件等的参与。
--***************************************************************************--
SQL*Plus: Release 10.2.0.1.0 - Production on Fri Jul 13 09:27:21 2012
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> conn / as sysdba
Connected to an idle instance.
SQL> startup nomount
ORACLE instance started.
Total System Global Area 524288000 bytes
Fixed Size 1220360 bytes
Variable Size 146800888 bytes
Database Buffers 373293056 bytes
Redo Buffers 2973696 bytes--***************************************************************************--
Oracle会根据参数文件的内容,创建Instance,分配相应的内存区域,启动了相应的后台进程。
由于所有参数文件中定义的非缺省参数都会在告警日志中显示,那么我们想进一步了解,就可以观察告警日志文件。
--***************************************************************************--
Starting ORACLE instance (normal)
Cannot determine all dependent dynamic libraries for /proc/self/exe
Unable to find dynamic library libocr10.so in search paths
RPATH = /ade/aime1_build2101/oracle/has/lib/:/ade/aime1_build2101/oracle/lib/:/ade/aime1_build2101/oracle/has/lib/:
LD_LIBRARY_PATH is not set!
The default library directories are /lib and /usr/lib
Unable to find dynamic library libocrb10.so in search paths
Unable to find dynamic library libocrutl10.so in search paths
Unable to find dynamic library libocrutl10.so in search paths
LICENSE_MAX_SESSION = 0
LICENSE_SESSIONS_WARNING = 0
Picked latch-free SCN scheme 2
Using LOG_ARCHIVE_DEST_1 parameter default value as /u01/app/oracle/product/10.2.0/dbhome_1/dbs/arch
Autotune of undo retention is turned on.
IMODE=BR
ILAT =132
LICENSE_MAX_USERS = 0
SYS auditing is disabled
ksdpec: called for event 13740 prior to event group initialization
Starting up ORACLE RDBMS Version: 10.2.0.1.0.
System parameters with non-default values:
processes = 1000
sessions = 1200
__shared_pool_size = 138412032
__large_pool_size = 4194304
__java_pool_size = 4194304
__streams_pool_size = 0
sga_target = 524288000
control_files = /u01/app/oracle/oradata/PROD/control01.ctl, /u01/app/oracle/oradata/PROD/control02.ctl, /u01/app/oracle/oradata/PROD/control03.ctl
db_block_size = 8192
__db_cache_size = 373293056
compatible = 10.2.0
undo_management = AUTO
undo_tablespace = undotbs
shared_servers = 3
db_name = PROD
open_cursors = 1024
pga_aggregate_target = 367001600
--***************************************************************************--
可以看到这一阶段的启动过程:读取参数文件,应用参数启动实例。
--***************************************************************************--
PMON started with pid=2, OS id=31012
PSP0 started with pid=3, OS id=31014
MMAN started with pid=4, OS id=31016
DBW0 started with pid=5, OS id=31018
LGWR started with pid=6, OS id=31020
CKPT started with pid=7, OS id=31022
SMON started with pid=8, OS id=31024
RECO started with pid=9, OS id=31026
MMON started with pid=10, OS id=31028
MMNL started with pid=11, OS id=31030
--***************************************************************************--
创建实例之后,后台进程会依次启动,输出中包含了PID和OS ID。PID代表该进程在数据库内部的标识符编号,而OS ID则代表该进程在操作系统上的进程标号。
在告警日志的进程启动信息中,并没有包含pid=1的进程。在NOMOUNT的状态下,可以查询的系统视图。我们通过V$PROCESS验证pid=1的进程是否存在。
--***************************************************************************--
--** V$PROCESS记录了对应于操作系统的每个进程的相关信息。
--***************************************************************************--
SQL> col PROGRAM format a40
SQL> set linesize 120 pagesize 140
SQL> select addr,pid,spid,program from v$process where pid =1;
ADDR PID SPID PROGRAM
-------- ---------- ------------ ----------------------------------------
3E6B1228 1 PSEUDO--***************************************************************************--
--** SPID列代表操作系统上的进程号。
--***************************************************************************--
结果很明显,pid=1的进程是一个PSEUDO进程,这个进程是初始化数据库的进程,就是说它在其他进程启动之前就已经存在,并在数据库中一直存在。
这里还涉及一个问题,参数文件。Oracle是如何查找参数文件的呢?从Oracle9i开始,spfile被引入Oracle数据库,Oracle首选spfile<ORACLE_SID>.ora文件作为启动参数文件;若该文件不存在,Oracle选择spfile.ora文件;如果前两者都不存在,Oracle将会选择pfile<ORACLE_SID>.ora;若此文件也不存在,Oracle将会选择init<ORACLE_SID>.ora文件;若以上文件都不存在,Oracle将无法创建和启动Instance。在启动过程中,会在特定的路径中寻找参数文件,默认情况下LINUX/UNIX在$ORACLE_HOME/dbs目录,而Windows下则在$ORACLE_HOME/database目录。
--***************************************************************************--
SQL> show parameter spfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string--***************************************************************************--
--** 此值为空则不在使用spfile
--***************************************************************************--
PS:此过程只和参数文件有关.