唉,对Oracle的学习一直断断续续,我本身是做开发的,更多是从开发角度接触数据库。终于又开始继续学习了,希望别再中断了,呵呵。
昨天正好看到spfile这部分,看了一些资料,做了一些实验,记录一下
环境:Windows Server 2003 SP2,Oracle 10g release 10.2.0.1.0
Oracle官方文档指出了pfile和spfile的默认位置,如下:
UNIX/Linux中,默认存放路径是$ORACLE_HOME/dbs,或者和数据文件在同一个目录
Windows中,默认存放路径是%ORACLE_HOME%/database
我的测试环境是Windows Server 2003,自然默认路径应该是%ORACLE_HOME%/database
但是发现在Windows上安装Oracle10g,默认在%ORACLE_HOME%/dbs/目录下有一个spfile,而%ORACLE_HOME%/database目录并没有这个文件。
根据官方文档描述和实际查看,都说明这时Instance确实是使用spfile启动的,为啥这个目录和Oracle官方文档上说的不一样呢?
在官方文档所说的%ORACLE_HOME%/database/目录下有一个pfile,打开一看,pfile的内容并不是参数设置,而是一个指向spfile的路径。
Oracle10g安装后默认是使用spfile启动的。实际上经过试验,我觉得Oracle启动时确实是像官方文档所说的在%ORACLE_HOME%/database/目录下寻找spfile,因为没有找到,所以进而寻找pfile(这是Oracle寻找参数文件的顺序)。
于是Oracle在默认路径下果然找到了pfile,但Oracle此时发现pfile中并不是参数设置,而是一个指向spfile的路径,Oracle按照这个路径果真找到了spfile,于是就使用spfile启动了Instance。以上是个人的理解。
由此可知,spfile可以放在我们认为合适的目录中,只要能访问即可,然后在默认查找目录下放一个pfile,pfile的内容是一个指向spfile的路径即可让Oracle使用我们的spfile启动Instance。
好,那么继续实验,数据库已经按照默认方式使用spfile启动完成
C:/>sqlplus /nolog
SQL>connect sys/sys as sysdba;
SQL>show parameter spfile;
可以看到spfile的路径,%ORACLE_HOME%/dbs/spfile<oracle_sid>.ora
SQL>select decode(count(*),1,'SP','P') from v$spparameter where rownum=1 and isspecified='TRUE';
结果是SP
这些都可以说明Oracle是使用spfile启动的
SQL>create pfile from spfile;
这时默认目录下的pfile不再是指向spfile的目录了,而是从spfile创建而来的参数设置。
SQL>shutdown immediate;
SQL>startup;
数据库成功启动并打开
SQL>show parameter spfile;
可以看到spfile的路径那一列已经没有值了
SQL>select decode(count(*),1,'SP','P') from v$spparameter where rownum=1 and isspecified='TRUE';
结果是P
这些都可以说明Oracle是使用pfile启动的
SQL>create spfile from pfile;
文件成功创建,这时发现文件是创建在默认目录下的,而不是%ORACLE_HOME%/dbs/
此时在默认目录下同时存在pfile和spfile,pfile中不再是指向spfile的路径了,而是参数设置(因为刚才执行过create pfile from spfile)
SQL>shutdown immediate;
SQL>startup;
SQL>show parameter spfile;
可以看到spfile的路径,%ORACLE_HOME%/database/spfile<oracle_sid>.ora
SQL>select decode(count(*),1,'SP','P') from v$spparameter where rownum=1 and isspecified='TRUE';
结果是SP
这些都可以说明Oracle是使用spfile启动的,而且是使用默认路径下的spfile启动的,而不是最初的%ORACLE_HOME%/dbs/路径下的spfile
那么这就更明显了,正如Oracle官方文档所说,在windows上,Oracle的参数文件默认路径是%ORACLE_HOME%/database/。Oracle在这个路径下按照顺序搜索spfile、pfile,如果二者都没找到,Oracle Instance the startup will abort。
至于在windows上为啥默认安装后,要把spfile放在%ORACLE_HOME%/dbs/中,而在默认路径下用pfile做一个到spfile的链接就不清楚了。这给了初学者一点点点点点的迷惑。
当然如果需要,可以通过startup命令的选项使Oracle绕过spfile,而直接使用pfile启动Instance。
例如 startup pfile=%ORACLE_HOME%/database/init<oracle_sid>.ora
OK了,Oracle是如何使用参数文件启动的基本了解了一些。
那么spfile和pfile有什么区别呢?
1、spfile是由Oracle Server管理的,所以可通过alter system命令直接将对系统参数的修改固化在存储上,而alter system命令无法修改pfile
2、spfile的主要部分存为二进制数据,所以不能直接编辑,而pfile则是纯文本的
大概主要是这两个区别吧,至少目前来看就是这些了,呵呵
sqlplus命令show parameters,显示目前正在使用的参数值,呵呵,看了一下,貌似比目前spfile文件中记录的参数多好多,而且大部分我还不知道具体作用,继续学习吧。
视图v$parameter显示的是session级的参数,也就是当前session的参数信息。如果没有使用alter session单独设置当前session的参数值,那么默认和system级的参数应该是一样的。
视图v$parameter2显示的内容和v$parameter是一致的,只是前者显示的格式可能更容易阅读一些。
视图v$system_parameter显示的是system级的参数,保存的是使用alter system修改的值(scope=both或scope=memory)。这两个(v$parameter和v$system_parameter)都是当前已经生效的参数值。
视图v$spparameter显示的就是保存在spfile中的参数值(scope=both或scope=spfile)。
呵呵,目前对于spfile了解了一点了。继续学习中。。。。。。。
2010-7-20