ORACLE的SPFILE与PFILE
ORACLE中的参数文件是一个包含一系列参数以及参数对应值的操作系统文件,可以分为两种类型。它们是在数据库实例启动时候加载的,决定了数据库的物理结构、内存、数据库的限制及系统大量的默认值、数据库的各种物理属性、指定数据库控制文件名和路径等信息,是进行数据库设计和性能调优的重要文件。
初始化参数文件(Initialization Parameters Files),Oracle 9i之前,ORACLE一直采用PFILE方式存储初始化参数,该文件为文本文件。
服务器参数文件(Server Parameter Files),从Oracle 9i开始,Oracle引入了SPFILE文件,该文件为二进制格式,不能通过手工修改。
1:PFILE与SPFILE的区别
1:PFILE是文本文件的,而SPFILE是二进制格式的。PFILE文件可以用文本编辑器打开手工配置、而SPFILE不行,只能通过SQL命令在线修改。从操作系统上可以看到这两者的区别,初始化参数文件为ASCII文本文件,SPFILE为数据文件。

很多人有个很纳闷的疑问,为什么SPFILE是二进制文件,但是可以用more命令查看?如下所示
[oracle@DB-Server dbs]$ more spfilewgods.ora _size=3992977408
wgods.__java_pool_size=16777216
wgods.__large_pool_size=16777216
wgods.__shared_pool_size=234881024
wgods.__streams_pool_size=16777216
*.aq_tm_processes=0
*.audit_file_dest='/database/admin/wgods/adump'
*.background_dump_dest='/database/admin/wgods/bdump'
*.compatible='10.2.0.1.0'
*.control_files='/database/oradata/wgods/control01.ctl', '/database/oradata/wgods/control02.ctl', '/database/oradata/wgods/control03.ctl'
*.core_dump_dest='/database/admin/wgods/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_files=1024
*.db_name='wgods'
*.db_recovery_file_dest='/database/flash_recovery_area'
*.db_recovery_file_dest_size=2147483648
*.db_writer_processes=3
*.dispatchers='(PROTOCOL=TCP) (SERVICE=wgodsXDB)'
*.job_queue_processes=5
*.nls_territory='CHINA'
*.open_cursors=300
*.pga_aggregate_target=761266176
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_max_size=4294967296
*.sga_target=4294967296
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/database/admin/wgods/udump'
*.utl_file_dir='/database/flash_recovery_area/WGODS/logmnr_dict'
大家把这个文件用文本编辑器打开,就会发现确实是二进制文件,如下图所示:

2:SPFILE的修改是可以通过SQL命令在线修改,不再需要通过手工修改,对于动态参数所有更改可以立即生效,而PFILE的修改必须重启实例才能生效。
3:手动创建数据库而不是通过DBCA,则开始创建数据库时,只能定义PFILE。
修改spfile参数的三种模式:
scope=both 立即并永久生效,(默认模式)
scope=spfile 下次启动才能生效。
scope=memory 立即生效但下次启动时失效
2: 如何查看SPFILE与PFILE的目录位置?
2.1 方法一
- SELECT NAME, VALUE, DISPLAY_VALUE FROM V$PARAMETER WHERE NAME ='spfile';
2.2 方法二
- SQL> show parameter spfile
- NAME TYPE VALUE
- ------------------------ ----------- ------------------------------
- spfile string /database/product/dbhome_1/dbs/spfilewgods.ora
- SQL> show parameter pfile
- NAME TYPE VALUE
- ------------------------ ----------- ------------------------------
- spfile string /database/product/dbhome_1/dbs/spfilewgods.ora
注意:如果数据库使用spfile参数文件,那么用show parameter spfile与 show parameter pfile的结果一致,如果数据库使用pfile参数文件,那么上面命令得到的结果都是空,这是为什么呢?
- SQL> show parameter spfile;
- NAME TYPE VALUE
- -------------------------------- ----------- -----------
- spfile string
- SQL> show parameter pfile;
- NAME TYPE VALUE
- -------------------------------- ----------- -----------
- spfile string
- SQL>
我们可以通过SQL_TRACE跟踪查看具体原因:
- SQL> ALTER SESSION SET SQL_TRACE=TRUE;
- Session altered.
- SQL> show parameter spfile;
- NAME TYPE VALUE
- ------------ ----------- ------------------------------
- spfile string /u01/app/oracle/product/dbhome_1/dbs/spfilegsp.ora
- SQL> ALTER SESSION SET SQL_TRACE=FALSE;
- Session altered.
- SQL> SELECT T.VALUE || '/' || LOWER(RTRIM(I.INSTANCE, CHR(0))) || '_ora_' ||
- P.SPID || '.trc' TRACE_FILE_NAME
- FROM
- ( SELECT P.SPID
- FROM V$MYSTAT M, V$SESSION S, V$PROCESS P
- WHERE M.STATISTIC# =1
- AND S.SID = M.SID
- AND P.ADDR = S.PADDR
- ) P,
- ( SELECT T.INSTANCE
- FROM V$THREAD T, V$PARAMETER V
- WHERE V.NAME ='thread'
- AND(V.VALUE = 0 OR T.THREAD# = TO_NUMBER(V.VALUE))
- ) I,
- (SELECT VALUE FROM V$PARAMETER WHERE NAME='user_dump_dest') T;
- TRACE_FILE_NAME
- --------------------------------------------------------------------------------
- /u01/app/oracle/admin/orcl/udump/gsp_ora_3010.trc
- SQL>
此时查看/u01/app/oracle/admin/orcl/udump/gsp_ora_3010.trc可以得知,其实show parameter命令本质是通过转换成下面的SQL语句执行的
- SELECT NAME NAME_COL_PLUS_SHOW_PARAM,
- DECODE(TYPE,1,'boolean',2,'string',3,'integer',
- 4,'file',5,'number',
- 6,'big integer', 'unknown') TYPE,
- DISPLAY_VALUE VALUE_COL_PLUS_SHOW_PARAM
- FROM V$PARAMETER WHERE UPPER(NAME) LIKE UPPER('%spfile%')
- ORDER BY NAME_COL_PLUS_SHOW_PARAM,ROWNUM
所以show parameter pfile转化为如下SQL语句
- SELECT NAME NAME_COL_PLUS_SHOW_PARAM,
- DECODE(TYPE,1,'boolean',2,'string',3,'integer',
- 4,'file',5,'number',
- 6,'big integer', 'unknown') TYPE,
- DISPLAY_VALUE VALUE_COL_PLUS_SHOW_PARAM
- FROM V$PARAMETER WHERE UPPER(NAME) LIKE UPPER('%pfile%')
- ORDER BY NAME_COL_PLUS_SHOW_PARAM,ROWNUM
而动态视图V$PARAMETER里面没有参数pfile,所以两者结果一致,当数据库以参数pfile启动时,查询结果为空。
3: 判断数据库从SPFILE还是PFILE启动?
方法1:查询动态视图V$PARAMETER,如果VALUE值为非空,则是SPFILE启动,否则是PFILE。
SELECT NAME, VALUE, DISPLAY_VALUE FROM V$PARAMETER WHERE NAME ='spfile';
方法2:SHOW PARAMETER命令查看
SQL> show parameter spfile;
方法3:通过v$spparameter视图,如果一下查询返回0值,表示你在使用pfile,否则表明你使用的是spfile
SQL> SELECT COUNT(1) FROM v$spparameter where value is not null;
COUNT(1)
----------
22
或
SQL> select decode(count(1), 1, 'spfile', 'pfile') USED
2 from v$spparameter
3 where rownum=1 and isspecified ='TRUE';
USED
--------------
spfile
参数文件的搜索顺序
参数文件的搜索顺序如下:
1)spfile<sid>.ora
Unix/Linux缺省目录 $ORACLE_HOME/dbs/
Windows缺省目录 %ORACLE_HOME%\database
2) spfile.ora
Unix/Linux缺省目录 $ORACLE_HOME/dbs/
Windows缺省目录 %ORACLE_HOME%\database
3) init<sid>.ora
Unix/Linux缺省目录 $ORACLE_HOME/dbs/
Windows缺省目录 %ORACLE_HOME%\database
重建PFILE或SPFILE
create spfile[='xxxxx'] from pfile[='xxxx'];
create pfile[='xxxxx'] from spfile[='xxxx'];
通过spfile创建pfile文件(此时会在$ORACLE_HOME/dbs目录下生成pfile:initwgods.ora),当然你也可以指定参数文件的位置。
SQL> create pfile from spfile;
File created.
scope参数说明:
静态参数 必须指定为scope
动态参数issys_modifiable为IMMEDIATE不加scope默认的是 both,而动态参数issys_modifiable为DEFERRED的必须加上scope=spfile 或者 加上derferred,
|
参数类型 |
spfile |
memory |
both |
deferred |
|
静态参数 |
可以,重启服务器生效 |
不可以 |
不可以 |
不可以 |
|
动态参数(issys_modifiable为immediate |
可以,重启服务器生效 |
可以,立即生效,重启服务失效 |
可以,立即生效,重启服务器仍然有效果 |
可以 |
|
动态参数(issys_modifiable为deferred) |
参考资料:[深入解析Oracle.DBA入门进阶与诊断案例].盖国强
ORACLE的SPFILE与PFILE的更多相关文章
- oracle spfile和pfile文件
pfile(Parameter File)从oracle8i开始使用,在oracle9i中也可以用.它以文本文件的形式存在,可以用vi等编辑器对 其中数据库参数进行修改.文件格式为initSID.or ...
- oracle spfile和pfile文件(转)
--======================== -->Oracle 参数文件 --======================== /* 参数文件(10g中的参数文件) 主要用来记录数据库 ...
- oracle参数文件spfile和pfile
一.参数文件说明 PFILE(Initialiazation Parameter Files)初始化参数文件,是文本文件,可直使用文本编辑器查看.如果数据库使用的是初始化参数文件PFILE,要想永久修 ...
- Oracle 初始化参数文件pfile和spfile
pfile和spfile差额 pfile :Oracle 9i之前.ORACLE使用我们一直PFILE存储的初始化参数,,能够在操作系统级别改动. 当spfile文件改动出现错误导致oracle无法启 ...
- 判断ORACLE启动时使用spfile还是pfile
自Oracle 9i以后启动的时候默认使用的初始化文件是spfile,我们可以通过如下三种方式来判断是SPFILE还是PFILE方式启动数据库.1.show parameter spfile2.sho ...
- oracle基础知识(六)----spfile与pfile
一, 认识参数文件 Oracle中的参数文件是一个包含一系列参数以及参数对应值的操作系统文件.它们是在数据库实例启动时候加载的,决定了数据库的物理 结构.内存.数据库的限制及系统大量的默认值 ...
- 浅谈oracle10G spfile与pfile(转)
转自:http://blog.csdn.net/onebigday/article/details/6108348,http://www.linuxidc.com/Linux/2012-11/7371 ...
- SPFILE 、PFILE 的全面解读
这里先阐述一下数据库的启动过程: 1. 启动实例/例程(nomount状态)时,读取参数文件(文本文件PFILE 或服务器参数文件SPFILE),分配SGA.启动后台进程.打开告警文件及后台 ...
- 修改oracle系统参数spfile导致数据库无法启动解决
错误示范: SQL> alter system set nls_date_format='yyyy-mm-dd 24hh:mi:ss' scope=spfile;System altered.我 ...
随机推荐
- DB2 Enterprise Server Edition(DB2 ESE)9.1在Windows Server 2008 下出现无法新建数据库的情况,及解决办法
在安装有,DB2 9.1版本的Windows Server 2008 上面,使用默认的安装方式导致无法创建数据库,相关的错误提示: "SQL3012C 发生系统错误(原因码= "& ...
- Sql Server函数全解(五)之系统函数
系统信息包括当前使用的数据库名称,主机名,系统错误消息以及用户名称等内容.使用SQL SERVER中的系统函数可以在需要的时候获取这些信息.下面介绍系统函数的作用和使用方法. 1.返回表中指定字段的 ...
- jQuery-1.9.1源码分析系列(二)jQuery选择器续1
在分析之前说一点题外话. ownerDocument和 documentElement的区别 ownerDocument是Node对象的一个属性,返回的是某个元素的根节点文档对象:即document对 ...
- seajs的使用--主要了解模块化
一个使用sea.js的Demo sea.js可以解决命名问题,js文件间的依赖等. index.html内容如下: <!DOCTYPE html> <html xmlns=" ...
- C#~异步编程再续~大叔所理解的并行编程(Task&Parallel)
返回目录 并行这个概念出自.net4.5,它被封装在System.Threading.Tasks命名空间里,主要提供一些线程,异步的方法,或者说它是对之前Thread进行的二次封装,为的是让开发人员更 ...
- 大叔也说并行和串行`性能提升N倍(N由操作系统位数和cpu核数决定)
返回目录 并行是.net4.5主打的技术,同时被封装到了System.Threading.Tasks命名空间下,对外提供了静态类Parallel,我们可以直接使用它的静态方法,它可以并行一个委托数组, ...
- SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别
SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别 MSSQL为我们提供了两种动态执行SQL语句的命令,分别是 EXEC 和 SP_EXECUTESQL ,我们先来看一下两种方 ...
- for xml path 将单表中一个字段用逗号分隔
我也是才知道这种用法的,刚好又用到写个简单的例子. select Name from tc_order_detail 如下表,现在要将做到将name每个以逗号连接 declare @df nvarch ...
- 【C#】委托-Delegate
C# 委托(Delegate) C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针.委托(Delegate) 是存有对某个方法的引用的一种引用类型变量.引用可在运行时被改变. 委托 ...
- css遮罩代码(已验证)
#mask { background-color: rgb(0, 0, 0); display:none; opacity: 0.0; /* Safari, Opera */ -moz-opacity ...