首先找加了SID的SPFILE,如果找不到,就找不带SID的SPFILE;如果还是找不到,就找PFILE。如果为startup 指定一个PFILE的路径,则该PFILE会覆盖默认的查找顺序。
/*=====================演示启动过程==========================*/
[oracle@localhost ~]$ cd /oracle/11g/dbs
[oracle@localhost dbs]$ ll
total 28-rw-rw----. 1 oracle oinstall 1544 Sep 9 03:26 hc_orcl.dat-rw-r--r--. 1 oracle oinstall 2851 May 15 2009 init.ora-rw-r--r--. 1 oracle oinstall 861 Sep 9 03:27 initorcl.ora# PFILE-rw-r-----. 1 oracle oinstall 24 Aug 5 18:28 lkORCL-rw-r-----. 1 oracle oinstall 1536 Aug 7 16:08 orapworcldrwx------. 2 oracle oinstall 4096 Aug 5 18:25 peshm_orcl_0-rw-r-----. 1 oracle oinstall 2560 Sep 8 22:10 spfileorcl.ora# SPFILE
[oracle@localhost ~]$ sqlplus /nolog
SQL*Plus: Release 11.2.0.1.0 Production on Tue Sep 903:26:57 2014
Copyright (c) 1982, 2009, Oracle. All rights reserved.
SQL> conn / as sysdba
Connected to an idle instance.
SQL> startup
ORACLE instance started. Total System Global Area 422670336 bytesFixed Size 1336960 bytesVariable Size 318769536 bytesDatabase Buffers 96468992 bytesRedo Buffers 6094848 bytesDatabase mounted.Database opened.-- 默认的启动方式使用的是SPFILE文件
[oracle@localhost dbs]$ mkdir old
[oracle@localhost dbs]$ mv spfileorcl.ora old
# 将SPFILE移动到old目录下
[oracle@localhost dbs]$ rm -f initorcl.ora
[oracle@localhost dbs]$ cp old/spfileorcl.ora ./spfileabc.ora
[oracle@localhost dbs]$ vim abc123.ora
spfile=$ORACLE_HOME/dbs/spfileabc.ora# 创建一个PFILE,在这个PFILE里面指定SPFILE的路径
[oracle@localhost dbs]$ ll
total 32-rw-r--r--. 1 oracle oinstall 38 Sep 9 03:38 abc123.ora-rw-rw----. 1 oracle oinstall 1544 Sep 9 03:32 hc_orcl.dat-rw-r--r--. 1 oracle oinstall 2851 May 15 2009 init.ora-rw-r-----. 1 oracle oinstall 24 Aug 5 18:28 lkORCLdrwxr-xr-x. 2 oracle oinstall 4096 Sep 9 03:34 old-rw-r-----. 1 oracle oinstall 1536 Aug 7 16:08 orapworcldrwx------. 2 oracle oinstall 4096 Aug 5 18:25 peshm_orcl_0-rw-r-----. 1 oracle oinstall 2560 Sep 9 03:36 spfileabc.ora
SQL> shutdown immediate
Database closed.Database dismounted.ORACLE instance shut down.-- 关闭现有的Instance
SQL> startuppfile=$ORACLE_HOME/dbs/abc123.ora
-- 启动实例是指定PFILE的路径ORACLE instance started. Total System Global Area 422670336 bytesFixed Size 1336960 bytesVariable Size 318769536 bytesDatabase Buffers 96468992 bytesRedo Buffers 6094848 bytesDatabase mounted.Database opened.
Unix/Linux的root用户,或者Windows的administrator 具有启动关闭数据库的权限;如果Database是基于口令认证的,而某个用户被授予了SYSDBA和SYSOPER的权限,就可以启动关闭数据库, SYSOPER的权限略小于SYSDBA;
[oracle@localhost dbs]$ id
uid=500(oracle) gid=500(oinstall)groups=500(oinstall),501(dba)context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
SQL> startup
-- 这里没有要求输入口令,这是由于当前用户已经登录了操作系统,oracle就默认该用户有启动数据库的权限;如果该用户是远程连接数据库的,那么就会提示输入口令。ORACLE instance started. Total System Global Area 422670336 bytesFixed Size 1336960 bytesVariable Size 318769536 bytesDatabase Buffers 96468992 bytesRedo Buffers 6094848 bytesDatabase mounted.Database opened.
Instance started是分配SGA,启动后台进程的过程:
启动时会将很多启动参数写入日志文件,如果启动过程中出现了问题,可以查看相关的日志文件。日志文件中的参数可以拷贝出来构造成一个新的parameterfile。
/*============下面来演示一下startup nomount的状态 ==============*/
[oracle@localhost ~]$ sqlplus /nolog
SQL*Plus: Release 11.2.0.1.0 Production on Tue Sep 903:59:30 2014Copyright (c) 1982, 2009, Oracle. All rights reserved.
SQL> conn /as sysdba
Connected to an idle instance.
[oracle@localhost dbs]$ ps -ef | grep oracle
oracle 1235112347 0 03:16 ? 00:00:00 sshd: oracle@pts/1oracle 1235212351 0 03:16 pts/1 00:00:00 -bashoracle 1319712315 0 03:59 pts/0 00:00:00 sqlplus oracle 13198 13197 0 03:59 ? 00:00:00 oracleorcl(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))# 当前的数据库连接进程oracle 13204 12352 0 04:00 pts/1 00:00:00 ps -eforacle 13205 12352 0 04:00 pts/1 00:00:00 greporacle
[oracle@localhost dbs]$ ipcs
# 查看ipcs会发现此时SGA是空的------ Shared MemorySegments --------key shmid owner perms bytes nattch status ------ Semaphore Arrays--------key semid owner perms nsems ------ Message Queues--------key msqid owner perms used-bytes messages
SQL> startup nomount
--以nomount的模式启动ORACLE instance started. Total System GlobalArea 422670336 bytesFixed Size 1336960 bytesVariable Size 318769536 bytesDatabase Buffers 96468992 bytesRedo Buffers 6094848 bytes
[oracle@localhost dbs]$ ps -ef | grep oracle
oracle 13197 12315 0 03:59 pts/0 00:00:00sqlplus oracle 13286 1 0 04:04 ? 00:00:00 ora_pmon_orcloracle 13288 1 1 04:04 ? 00:00:00 ora_vktm_orcloracle 13292 1 0 04:04 ? 00:00:00 ora_gen0_orcloracle 13294 1 0 04:04 ? 00:00:00 ora_diag_orcloracle 13296 1 0 04:04 ? 00:00:00 ora_dbrm_orcloracle 13298 1 0 04:04 ? 00:00:00 ora_psp0_orcloracle 13300 1 0 04:04 ? 00:00:00 ora_dia0_orcloracle 13302 1 0 04:04 ? 00:00:00 ora_mman_orcloracle 13304 1 0 04:04 ? 00:00:00 ora_dbw0_orcloracle 13306 1 0 04:04 ? 00:00:00 ora_lgwr_orcloracle 13308 1 0 04:04 ? 00:00:00 ora_ckpt_orcloracle 13310 1 0 04:04 ? 00:00:00 ora_smon_orcloracle 13312 1 0 04:04 ? 00:00:00 ora_reco_orcloracle 13314 1 0 04:04 ? 00:00:00 ora_mmon_orcloracle 13316 1 0 04:04 ? 00:00:00 ora_mmnl_orcloracle 13318 1 0 04:04 ? 00:00:00 ora_d000_orcloracle 13320 1 0 04:04 ? 00:00:00 ora_s000_orcl# Oracle的后台进程都已经启动了oracle 13323 13197 0 04:04 ? 00:00:00oracleorcl (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))oracle 13347 12352 0 04:05 pts/1 00:00:00 ps -eforacle 13348 12352 0 04:05 pts/1 00:00:00 greporacle
[oracle@localhost dbs]$ ipcs
------ Shared MemorySegments --------key shmid owner perms bytes nattch status 0x85abc748 425984 oracle 660 4096 0 # 再次查看ipcs的资源,会发现SGA已经分配好了 ------ Semaphore Arrays--------key semid owner perms nsems 0x974edfd4 983042 oracle 660 154 ------ Message Queues--------key msqid owner perms used-bytes messages
/*=========已经可以查看到数据库的部分信息了=========*/
SQL> show parameter db_nam
NAME TYPE VALUE----------------------------------------------- ------------------------------db_name string orcl
SQL> show parameter db_block_size
NAME TYPE VALUE----------------------------------------------- ------------------------------db_block_size integer 8192
Mount的过程就是将实例和数据库建立关联的过程,要mount数据库,首先要找到并打开control files,这个查找的路径由初始化参数中CONTROL_FILES指定。Mount时会读取controlfiles中数据库的name和redo log files等相关信息。
这个阶段数据库仍然是关闭状态,普通用户不能访问数据库,只有管理员可以对数据库做一些维护工作,如备份和恢复等。
===================演示mount数据库的过程========================
[oracle@localhostdbs]$ strings spfileorcl.ora | more
orcl.__shared_pool_size=159383552orcl.__streams_pool_size=4194304*.audit_file_dest='/oracle/admin/orcl/adump'*.control_files='/oracle/oradata/orcl/control01.ctl','/oracle/flash_recovery_area/orcl/control02.ctl'# 启动项中规定的control files文件的路径*.db_block_size=8192*.db_domain=''*.db_name='orcl'
SQL> alter database mount;
--Mount数据库Database altered.
此阶段control files中指定的文件如redolog 或联机数据文件等都会打开;普通用户已经可以连接数据库了。
但是在上一次关闭数据库之前就已经处于offline状态的tablespace,此时仍然处于offline状态,如果要使其变成online状态,需要使用相应的启动命令。
如果某些数据文件或redo log files有错误,而导致数据库无法正常打开,那么需要先将数据库调整为mount状态,然后进行一些恢复工作。
SQL> alter database open;
Database altered.
注意,数据库的启动过程是单向的,即只能从mount到open,但不能从mount到nomount。
[oracle@localhost ~]$sqlplus /nolog
SQL*Plus: Release11.2.0.1.0 Production on Tue Sep 9 04:38:48 2014Copyright (c) 1982, 2009,Oracle. All rights reserved.
SQL> conn / as sysdba
Connected to an idleinstance.
SQL> startup mount;
ORACLE instance started. Total System GlobalArea 422670336 bytesFixed Size 1336960 bytesVariable Size 318769536 bytesDatabase Buffers 96468992 bytesRedo Buffers 6094848 bytesDatabase mounted.
SQL> alter databasenomount;
alter database nomount *ERROR at line 1:ORA-02231: missing orinvalid option to ALTER DATABASE-- 不能从mount到nomount状态
SQL> alter database open;
Database altered.-- 但是可以由mount到open状态