Pfile和实例的启动有密切关系的。
数据库启动分三个阶段:
(1)在nomount状态的时候会给实例分配相应的内存和启动后台进程,内存的参数需要获得相应的大小,这些大小从spfile里面去获取(初始化参数文件,pfile和spfile),有一些是oracle内部的默认值,还有一部分是手工配置的。(读取参数文件)
(2)在nomount状态进入到mount状态,mount状态需要读取控制文件,必须保证所有的控制文件都是可读的,可访问的,这样才可以保证数据库实例启动到mount状态。(读取控制文件)
(3)在mount状态读取控制文件内容,去检查所有数据库的数据文件,日志文件是否可以正常访问,还要检查数据库的一致性,当以上都没问题才进入open状态。(读取控制文件,检查数据,日志文件,检查数据库一致性)
Pfile是初始化参数文件,当数据库实例启动到nomount状态时候,需要读取pfile参数文件获取到相应的参数配置。
Pfile的位置:
[oracle@Database2 ~]$ cd $ORACLE_HOME/dbs
[oracle@Database2 dbs]$ ls
hc_oradb.dat initoradba.ora orapworadb spfileoradb.ora
init.ora lkORADB snapcf_oradb.f
Pfile的名字是init+实例名字(SID).ora,spfile名字是spfile+实例名.ora
Pfile:(1)这个文件是文本文件,所以这个文件可以通过手工编辑(2)编辑完之后实例重新启动才会生效(3)pfile文件可以通过spfile文件来创建
由于修改参数要编辑文件,编辑完之后还要重启才可以生效,所以一般使用spfile。
判断数据库使用了pfile启动还是使用了spfile启动使用下面命令就可以判断
SQL> show parameter spfile; --可以看到当前实例是使用了spfile来启动
NAME TYPE VALUE
------------------------------------ -------------------- ------------------------------
spfile string /u01/app/oracle/product/11.2.0
/db_1/dbs/spfileoradb.ora
SQL> create pfile from spfile; --生成pfile
File created.
当存在spfile和pfile,实例先去读取spfile,如果spfile不存在,那么会去读取pfile,如果两个都不存在,实例启动就会失败。
[oracle@Database2 dbs]$ ls
hc_oradb.dat initoradba.ora lkORADB snapcf_oradb.f
init.ora initoradb.ora orapworadb spfileoradb.ora
[oracle@Database2 dbs]$ rm -rf spfileoradb.ora --将spfile删除
SQL> startup force nomount; --启动到nomount状态下
ORACLE instance started.
Total System Global Area 1068937216 bytes
Fixed Size 2260088 bytes
Variable Size 671089544 bytes
Database Buffers 390070272 bytes
Redo Buffers 5517312 bytes
SQL> show parameter spfile; --可以看到spfile对应的值是空值,说明启动是使用pfile来启动的
NAME TYPE VALUE
------------------------------------ -------------------- ------------------------------
spfile
[oracle@Database2 ~]$ cd $ORACLE_HOME/dbs
[oracle@Database2 dbs]$ ls --在ORACLE_HOME/dbs下面有一个参数的模板文件init.ora
hc_oradb.dat init.ora initoradba.ora initoradb.ora lkORADB orapworadb snapcf_oradb.f
[oracle@Database2 dbs]$ more init.ora --在这个模板参数文件里面有一些最基本参数的信息,这个模板适合手工建库,先修改这个模板文件将数据库启动到nomount状态,然后再后续进行DBCA建库。(init.ora是用来快速生成一个pfile文件的)
db_name='ORCL'
memory_target=1G
processes = 150
audit_file_dest='<ORACLE_BASE>/admin/orcl/adump'
audit_trail ='db'
db_block_size=8192
db_domain=''
db_recovery_file_dest='<ORACLE_BASE>/flash_recovery_area'
db_recovery_file_dest_size=2G
diagnostic_dest='<ORACLE_BASE>'
dispatchers='(PROTOCOL=TCP) (SERVICE=ORCLXDB)'
open_cursors=300
remote_login_passwordfile='EXCLUSIVE'
undo_tablespace='UNDOTBS1'
# You may want to ensure that control files are created on separate physical
# devices
control_files = (ora_control1, ora_control2)
compatible ='11.2.0'
Oracle spfile的文章请参考:Spfile