zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

ORACLE的SPFILE与PFILE

Oracle SPFILE
2023-09-14 08:58:21 时间

     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为数据文件。

image

很多人有个很纳闷的疑问,为什么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

 

大家把这个文件用文本编辑器打开,就会发现确实是二进制文件,如下图所示:

image

    2:SPFILE的修改是可以通过SQL命令在线修改,不再需要通过手工修改,对于动态参数所有更改可以立即生效,而PFILE的修改必须重启实例才能生效。

    3:手动创建数据库而不是通过DBCA,则开始创建数据库时,只能定义PFILE。

 

修改spfile参数的三种模式:


scope=both       立即并永久生效,(默认模式)

scope=spfile     下次启动才能生效。

scope=memory     立即生效但下次启动时失效

 

2: 如何查看SPFILE与PFILE的目录位置?

 

     2.1 方法一


------------------------ ----------- ------------------------------       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参数文件,那么上面命令得到的结果都是空,这是为什么呢?

 


------------ ----------- ------------------------------      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

此时查看/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
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,

 


潇湘隐者 网名潇湘隐者/潇湘剑客、英文名Kerry,兴趣广泛,广泛涉猎,个性随意,不善言辞。执意做一名会写代码的DBA,混迹于IT行业