zoukankan      html  css  js  c++  java
  • 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为数据文件。

    image

    很多人有个很纳闷的疑问,为什么SPFILE是二进制文件,但是可以用more命令查看?如下所示

     View Code

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

    image

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

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

    修改spfile参数的三种模式:


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

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

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

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

         2.1 方法一

    方法1
    1. SELECT NAME, VALUE, DISPLAY_VALUE FROM V$PARAMETER WHERE NAME ='spfile';
    2.  
    3.  

        2.2 方法二

    方法2
    1. SQL> show parameter spfile
    2.  
    3.         NAME                 TYPE            VALUE
    4. ------------------------ ----------- ------------------------------
    5.       spfile                 string      /database/product/dbhome_1/dbs/spfilewgods.ora
    6.  
    7. SQL> show parameter pfile
    8.  
    9.         NAME                   TYPE          VALUE
    10. ------------------------ ----------- ------------------------------
    11.       spfile                   string   /database/product/dbhome_1/dbs/spfilewgods.ora

    注意:如果数据库使用spfile参数文件,那么用show parameter spfile与 show parameter pfile的结果一致,如果数据库使用pfile参数文件,那么上面命令得到的结果都是空,这是为什么呢?

    Code Snippet
    1. SQL> show parameter spfile;
    2.  
    3.      NAME                TYPE     VALUE
    4. -------------------------------- ----------- -----------
    5.      spfile             string
    6. SQL> show parameter pfile;
    7.  
    8.      NAME                TYPE     VALUE
    9. -------------------------------- ----------- -----------
    10.      spfile             string
    11. SQL>

    我们可以通过SQL_TRACE跟踪查看具体原因:

    Code Snippet
    1. SQL> ALTER SESSION SET SQL_TRACE=TRUE;
    2.  
    3. Session altered.
    4.  
    5. SQL> show parameter spfile;
    6.  
    7.      NAME        TYPE                VALUE
    8. ------------ ----------- ------------------------------
    9.      spfile      string  /u01/app/oracle/product/dbhome_1/dbs/spfilegsp.ora
    10.                           
    11.  
    12. SQL> ALTER SESSION SET SQL_TRACE=FALSE;
    13.  
    14. Session altered.
    15.  
    16. SQL> SELECT T.VALUE || '/' || LOWER(RTRIM(I.INSTANCE, CHR(0))) || '_ora_' ||
    17.             P.SPID || '.trc' TRACE_FILE_NAME
    18.       FROM
    19.       ( SELECT P.SPID
    20.         FROM V$MYSTAT M, V$SESSION S, V$PROCESS P
    21.         WHERE M.STATISTIC# =1
    22.           AND S.SID = M.SID
    23.           AND P.ADDR = S.PADDR
    24.       ) P,
    25.       ( SELECT T.INSTANCE
    26.         FROM V$THREAD T, V$PARAMETER V
    27.         WHERE V.NAME ='thread'
    28.         AND(V.VALUE = 0 OR T.THREAD# = TO_NUMBER(V.VALUE))
    29.       ) I,
    30.     (SELECT VALUE FROM V$PARAMETER WHERE NAME='user_dump_dest') T;
    31. TRACE_FILE_NAME
    32. --------------------------------------------------------------------------------
    33. /u01/app/oracle/admin/orcl/udump/gsp_ora_3010.trc
    34.  
    35. SQL>

    此时查看/u01/app/oracle/admin/orcl/udump/gsp_ora_3010.trc可以得知,其实show parameter命令本质是通过转换成下面的SQL语句执行的

    Code Snippet
    1. SELECT NAME NAME_COL_PLUS_SHOW_PARAM,
    2.        DECODE(TYPE,1,'boolean',2,'string',3,'integer',
    3.               4,'file',5,'number',  
    4.               6,'big integer', 'unknown') TYPE,
    5.        DISPLAY_VALUE VALUE_COL_PLUS_SHOW_PARAM
    6. FROM V$PARAMETER WHERE UPPER(NAME) LIKE UPPER('%spfile%')
    7. ORDER BY NAME_COL_PLUS_SHOW_PARAM,ROWNUM

    所以show parameter pfile转化为如下SQL语句

    Code Snippet
    1. SELECT NAME NAME_COL_PLUS_SHOW_PARAM,
    2.        DECODE(TYPE,1,'boolean',2,'string',3,'integer',
    3.               4,'file',5,'number',  
    4.               6,'big integer', 'unknown') TYPE,
    5.        DISPLAY_VALUE VALUE_COL_PLUS_SHOW_PARAM
    6. FROM V$PARAMETER WHERE UPPER(NAME) LIKE UPPER('%pfile%')
    7. 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入门进阶与诊断案例].盖国强

  • 相关阅读:
    函数——返回值不止一个的情况(解一元二次方程)
    排序方法:去掉最高最低分求平均分 函数
    丢羊 递归
    网吧充值 函数+Swich+ArrayList版
    对战游戏自己简单版+大神版
    简单Struct+ArrayList选择买东西:购物车思路
    推箱子 复杂版(多个箱子)
    stuct+ArrayList的for用法
    Struct+ArrayList冒泡排序。例
    c# 穷举
  • 原文地址:https://www.cnblogs.com/zhangyingai/p/7082546.html
Copyright © 2011-2022 走看看