Oracle中的参数文件是一个包含一系列参数以及参数对应值的操作系统文件。它们是在数据库实例启动时候加载的,决定了数据库的物理 结构、内存、数据库的限制及系统大量的默认值、数据库的各种物理属性、指定数据库控制文件名和路径等信息,是进行数据库设计和性能调优的重要文件。可以分为两种类型:
pfile: 初始化参数文件(Initialization Parameters Files),Oracle 9i之前,ORACLE一直采用pfile方式存储初始化参数,pfile 默认的名称为“init+例程名.ora”文件路径:/data/app/oracle/product/12.1.0/dbhome_1/dbs,这是一个文本文件,可以用任何文本编辑工具打开。
spfile:服务器参数文件(Server Parameter Files),从Oracle 9i开始,Oracle引入了Spfile文件,spfile 默认的名称为“spfile+例程名.ora”文件路径:/data/app/oracle/product/12.1.0/dbhome_1/dbs 以二进制文本形式存在,不能用vi编辑器对其中参数进行修改,只能通过SQL命令在线修改。
从操作系统上可以看到这两者的区别,初始化参数文件为ASCII文本文件,Spfile为数据文件。
[oracle@xqzt ~]$ cd /data/app/oracle/product/12.1.0/dbhome_1/dbs/
[oracle@xqzt dbs]$ ls
hc_orcl.dat init.ora lkORCL orapworcl spfileorcl.ora
[oracle@xqzt dbs]$ file init.ora
init.ora: ASCII English text
[oracle@xqzt dbs]$ file spfileorcl.ora
spfileorcl.ora: data
[oracle@xqzt dbs]$
2、使用spfile的好处
1、spfile改正了pfile管理混乱的问题,在多结点的环境里,pfile会有多个image,启动时候需要跟踪最新的image。这是个烦琐的过程。用spfile以后,所有参数改变都写到spfile里面(只要定义scope=spfile或both),参数配置有个权威的来源。
2、9i以前一般都是要备份pfile后再来做参数的修改,而且pfile的修改必须重启实例才能生效。非常的不方便;在9i以后的spfile就可以同通过命令修改指定的参数了,而且有很多参数都不用重启数据库,能够在线生效,这个在线生效的参数会随着数据库的版本增高而增加。如果参数修改有问题数据库起不来了可以在 nomount状态下创建成pfile再修改回来即可。)
3、如何查看Spfile与pfile的目录位置?
方法一:
SQL> SELECT NAME, VALUE, DISPLAY_VALUE FROM V$PARAMETER WHERE NAME ='spfile';
NAME
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
DISPLAY_VALUE
--------------------------------------------------------------------------------
spfile
/data/app/oracle/product/12.1.0/dbhome_1/dbs/spfileorcl.ora
/data/app/oracle/product/12.1.0/dbhome_1/dbs/spfileorcl.ora
方法二: Show parameter spfile
4、判断Oracle启动时使用spfile还是pfile?
1、 通过v$spparameter视图
使用spfile启动数据库,我们可以看到查询出来的结果是spfile
SQL> select decode(count(*),1,'spfile','pfile') from v$spparameter where rownum=1 and isspecified ='TRUE';
DECODE
------
spfile
2、 通过查看spfile、pfile参数
系统当前为从spfile启动,在查看show parameter pfile和show parameter spfile 都能看到spfile参数文件的路径。
关闭数据库,从pfile启动,startup pfile='/data/app/oracle/product/12.1.0/dbhome_1/dbs/initorcl.ora'; 再次执行上述的两个语句
我们在这里可以很明显的发现,使用pfile启动的数据库,我们无论是查看show parameter pfile还是show parameter spfile 都无法看到pfile参数文件的路径。
5、pfile和spfile的互相创建
create spfile[='xxxxx'] from pfile[='xxxx'];
create pfile[='xxxxx'] from spfile[='xxxx'];
SQL> create pfile from spfile ;
File created.
SQL>
通过spfile创建pfile文件(此时会在$ORACLE_HOME/dbs目录下生成pfile:initorcl.ora),当然你也可以指定参数文件的位置。
[oracle@xqzt dbs]$ pwd
/data/app/oracle/product/12.1.0/dbhome_1/dbs
[oracle@xqzt dbs]$ ls
hc_orcl.dat lkORCL spfileorcl.ora
init.ora initorcl.ora orapworcl
6、使用pfile/spfile 启动数据库
1、startup 启动次序 spfile优先于pfile。查找文件的顺序是 spfileSID.ora-〉spfile.ora-〉initSID.ora-〉init.ora(spfile优先于pfile)。
2、startup pfile='文件目录' 使用pfile启动,则需指定完整路径,或删除spfile.
SQL> startup pfile='/data/app/oracle/product/12.1.0/dbhome_1/dbs/initorcl.ora';
ORACLE instance started.
Total System Global Area 2466250752 bytes
Fixed Size 2927384 bytes
Variable Size 1426064616 bytes
Database Buffers 1023410176 bytes
Redo Buffers 13848576 bytes
Database mounted.
Database opened.
SQL>
3、 如果在数据库的$ORACLE_HOME/dbs/目录下既有spfile又有pfile,使用spfile启动数据库,不需要指定参数文件路径(因为数据库会优先选择spfile启动),
4、 如果参数文件不在$ORACLE_HOME/dbs/目录下,无论是通过spfile或pfile启动均需要指定完整路径。
7、spfile参数的三种scope:
1. scope=spfile: 对参数的修改记录在服务器初始化参数文件中,修改后的参数在下次启动DB时生效。适用于动态和静态初始化参数。
2. scope=memory: 对参数的修改记录在內存中,对于动态初始化参数的修改立即生效。在重启DB后会丟失,会复原为修改前的参数值。
3. scope=both: 对参数的修改会同时记录在服务器参数文件和內存中,对于动态参数立即生效,对静态参数不能用这个选项
参数类型
spfile
memory
both
静态参数
可以,重启服务器生效
不可以
不可以
动态参数
可以,重启服务器生效
可以,立即生效,重启服务失效
可以,立即生效,重启服务器仍然有效果
如果使用了服务器参数文件,则在执行alter system语句时,scope=both是default的选项。
如果沒有使用服务器参数文件,而在执行alter system语句时指定scope=spfile|both都会出错。
8、修改参数例子
scope=both: 对于动态参数立即生效
SQL> show parameter pga;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_limit big integer 2G
pga_aggregate_target big integer 500M
SQL> alter system set pga_aggregate_target = 600m scope=both;
System altered.
SQL> show parameter pga;