10、pfile和spfile文件详解
10.1、介绍:
1、Oracle中的参数文件是一个包含一系列参数以及参数对应值的操作系统文件。它们是在数据库实例启动时候加载的,
决定了数据库的物理结构、内存、数据库的限制及系统大量的默认值、数据库的各种物理属性、指定数据库控制文件名
和路径等信息,是进行数据库设计和性能调优的重要文件。可以分为两种类型:
(1)pfile:
初始化参数文件,Oracle9i之前,ORACLE一直采用pfile方式存储初始化参数,pfile默认的名称为"init+例程名.ora"
文件路径为"/application/oracle/product/11.2.0/db_1/dbs",这是一个文本文件,可以用任何文本编辑工具打开;
(2)spfile:
服务器参数文件,从Oracle9i开始,Oracle引入了Spfile文件,spfile默认的名称为"spfile+例程名.ora",文件路径
为"/application/oracle/product/11.2.0/db_1/dbs",以二进制文本形式存在,不能用vi编辑器对其中参数进行修改,
只能通过SQL命令在线修改;
[ ~]$ ls /application/oracle/product/11.2.0/db_1/dbs/
hc_orcl.dat init.ora initorcl.ora lkORCL orapworcl spfileorcl.ora
2、使用spfile的好处:
spfile改正了pfile管理混乱的问题,在多结点的环境里,pfile会有多个image,启动时候需要跟踪最新的image。这
是个烦琐的过程。用spfile以后,所有参数改变都写到spfile里面(只要定义scope=spfile或both),参数配置有个权威
的来源;9i以前一般都是要备份pfile后再来做参数的修改,而且pfile的修改必须重启实例才能生效。非常的不方便;在9i
以后的spfile就可以同通过命令修改指定的参数了,而且有很多参数都不用重启数据库,能够在线生效,这个在线生效的
参数会随着数据库的版本增高而增加。如果参数修改有问题数据库起不来了可以在 nomount状态下创建成pfile再修改回
来即可;
3、启动优先级:
startup 启动次序 spfile优先于pfile。查找文件的顺序是 spfileSID.ora-〉spfile.ora-〉initSID.ora-〉init.ora(spfile优先于pfile)。
如果在数据库的$ORACLE_HOME/dbs/目录下既有spfile又有pfile,使用spfile启动数据库,不需要指定参数文件路径(因为数据库会优先选择spfile启动),
如果参数文件不在$ORACLE_HOME/dbs/目录下,无论是通过spfile或pfile启动均需要指定完整路径;
4、spfile参数的三种scope:
(1)scope=spfile: 对参数的修改记录在服务器初始化参数文件中,修改后的参数在下次启动DB时生效,适用于动态和静态初始化参数;
(2)scope=memory: 对参数的修改记录在內存中,对于动态初始化参数的修改立即生效,在重启DB后会丟失,会复原为修改前的参数值;
(3)scope=both: 对参数的修改会同时记录在服务器参数文件和內存中,对于动态参数立即生效,对静态参数不能用这个选项,如果使用
了服务器参数文件,则在执行alter system语句时,scope=both是default的选项;
(4)如果沒有使用服务器参数文件,而在执行alter system语句时指定scope=spfile|both都会出错;
(5)小结:
参数类型 | spfile | memory | both |
静态参数 | 可以,重启生效 | 不可以 | 不可以 |
动态参数 | 可以,重启生效 | 可以,立即生效,重启后失效 | 可以立即生效,重启后失效 |
5、如何判断oracle实例使用的是pfile文件还是spfile文件:
show parameter spfile;
show parameter pfile;
#使用上面两个sql语句,如果oracle实例使用的是pfile文件则查询不到任何的结果,如果使用的是spfile文件,则显示的都是spfile文件的路径;
6、pfile和spfile可以互相创建:
create spfile from pfile
create pfile from spfile
#当然在spfile和pfile的后面可以跟具体的路径;
10.2、登录到oracle实例:
[ ~]$ echo $ORACLE_SID
orcl
[ ~]$ sqlplus sys/ as sysdba
SQL>show parameter name;
10.3、修改oracle实例的并发连接数:
1、查询数据库实例的会话连接情况:
SQL> select count(*) from v$session;
#查询数据库实例当前会话连接数;
SQL> select username,count(username) from v$session where username is not null group by username;
#查询数据库实例当前不同用户的会话连接数;
SQL> select count(*) from v$session where status=‘ACTIVE‘;
#查询数据库实例当前会话的并发连接数;
2、查询数据库实例的进程连接数:
SQL> select count(*) from v$process;
#查询数据库实例当前进程的连接数;
3、修改spfile的参数步骤:
SQL> show parameter processes;
#查询当前数据库实例允许的最大连接数;
SQL> show parameter spfile;
#判断当前所用的是spfile还是pfile文件;
SQL> create pfile from spfile;
#将当前的spfile文件备份;
SQL> alter system set processes=3000 scope=spfile;
#修改当前数据库实例的(spfile文件)最大连接数;
SQL> shutdown immediate;
#关闭当前数据库实例;
SQL> startup;
#由于修改数据库允许被连接的最大数太大,导致当前数据库实例无法启动;
SQL> startup pfile=/application/oracle/product/11.2.0/db_1/dbs/initorcl.ora;
#指定以pfile文件启动;
SQL> create spfile from pfile;
#将备份的spfile进行还原;
SQL> shutdown immediate;
#关闭数据库实例;
SQL> startup;
#启动数据库实例;
SQL> alter system set processes=3000 scope=spfile;
#重新指定spfile的processes参数;
SQL> shutdown immediate;
#关闭数据库实例;
SQL> startup
#启动数据库
10.4、查看orcl数据库实例的pfile文件:
1、MEMORY_TARGET参数:
(1)该参数指定Oracle实例可用内存大小;
(2)取值范围:152 MB to MEMORY_MAX_TARGET;
(3)Oracle实例在这个值的范围根据自身负载自动调节SGA和PGA的小;
(4)如果在参数文件中忽略了MEMORY_MAX_TARGET,则该参数的大小为MEMORY_TARGET的大小;
(5)如果忽略了MEMORY_TARGET,而设置了MEMORY_MAX_TARGET大小,则MEMORY_TARGET值为0,
为0表示禁用自动内存管理;
(6)实例启动后可动态设置MEMORY_TARGET的大小,但不可超过MEMORY_MAX_TARGET的大小;
(7)SGA_MAX_SIZE 的默认值依靠于MEMORY_TARGET 和MEMORY_MAX_TARGET的大小;
2、SGA_TARGET:
(1)是用于存储数据库信息的内存区,该信息为数据库进程所共享。它包含Oracle服务器的数据和控制信息,它是在
Oracle服务器所驻留的计算机的实际内存中得以分配,如果实际内存不够再往虚拟内存中写;
(2)SGA指定所有SGA组件的总大小,将该值设为正数则表示启用自动共享内存管理特性,下列内存池会自动调节大小:
Buffer cache (DB_CACHE_SIZE)
Shared pool (SHARED_POOL_SIZE)
Large pool (LARGE_POOL_SIZE)
Java pool (JAVA_POOL_SIZE)
Streams pool (STREAMS_POOL_SIZE)
(3)当启用自动内存管理(MEMORY_TARGET设置成正数),SGA_TARGET为最小的SGA大小;
3、PGA_AGGREGATE_TARGET:
(1)包含单个服务器进程或单个后台进程的数据和控制信息,与几个进程共享的SGA正相反,PGA是只被一个
进程使用的区域,PGA在创建进程时分配,在终止进程时回收,将该参数设成非零值启用自动PGA管理;
(2)将该参数设成非零值启用自动PGA管理,同时 WORKAREA_SIZE_POLICY该参数会设为auto,将该参数
设成零时,WORKAREA_SIZE_POLICY参数会自动设成MANUAL
(3)当启用自动内存管理(MEMORY_TARGET )时该值为最小PGA值;
4、Oracle官方推荐的MEMORY_TARGET、PGA、SGA的大小:
(1)ORACLE实例分配的物理内存的大小:
MEMORY_TARGET=物理内存 x 80%
MEMORY_MAX_SIZE=物理内存 x 80%
(2)对于OLTP系统:
SGA_TARGET=(物理内存 x 80%) x 80%
SGA_MAX_SIZE=(物理内存 x 80%) x 80%
PGA_AGGREGATE_TARGET=(物理内存 x 80%) x 20%
(3)对于DSS系统:
SGA_TARGET=(物理内存 x 80%) x 50%
SGA_MAX_SIZE=(物理内存 x 80%) x 50%
PGA_AGGREGATE_TARGET=(物理内存 x 80%) x 50%
(4)pga和sga的总和是oracle使用计算机内存的实际大小;
SQL> show parameter sga;
SQL> show parameter pga;
5、数据库orcl实例pfile文件(4G):
[ ~]# cat /application/oracle/product/11.2.0/db_1/dbs/initorcl.ora
orcl.__db_cache_size=1107296256
#sga自动管理
orcl.__java_pool_size=16777216
#sga自动管理
orcl.__large_pool_size=16777216
#sga自动管理
orcl.__oracle_base=‘/application/oracle‘#ORACLE_BASE set from environment
#数据库安装目录
orcl.__pga_aggregate_target=1342177280
#pga=(物理内存 x 80%) x 20%,由memory_target自动管理;
orcl.__sga_target=2013265920
#sga=(物理内存 x 80%) x 80%,由memory_target自动管理;
orcl.__shared_io_pool_size=0
orcl.__shared_pool_size=805306368
#sga自动管理
orcl.__streams_pool_size=33554432
#sga自动管理
*.audit_file_dest=‘/application/oracle/admin/orcl/adump‘
#日志审计目录
*.audit_trail=‘db‘
#记录数据库实例的审计记录;
*.compatible=‘11.2.0.0.0‘
#数据库版本号
*.control_files=‘/application/oracle/oradata/orcl/control01.ctl‘,‘/application/oracle/flash_recovery_area/orcl/control02.ctl‘
#数据库实例控制文件位置
*.db_block_size=8192
#定义oracle数据库实例块的大小,8k
*.db_domain=‘‘
#定义一个数据库实例在网络架构中的一个逻辑位置
*.db_name=‘orcl‘
#数据库实例名
*.db_recovery_file_dest=‘/application/oracle/flash_recovery_area‘
#该参数控制的是闪回恢复区域(FRA)的位置
*.db_recovery_file_dest_size=4070572032
#该参数控制的是闪回恢复区域(FRA)的大小
*.diagnostic_dest=‘/application/oracle‘
#数据库实例诊断目录,位于$ORACLE_BASE/diag/rdbms/orcl/
*.dispatchers=‘(PROTOCOL=TCP) (SERVICE=orclXDB)‘
#oracle数据库实例多线程
*.memory_target=3340763136
#Oracle实例可用内存=物理内存 x 80%,同时也开启了oracle实例内存自动管理sga和pga的功能
*.open_cursors=500
#指定一个session同时打开的游标的最大数目,需要设定该参数足够大来保证应用的正常运行,默认300
*.processes=3000
#数据库实例允许被连接的最大数,默认150
*.remote_login_passwordfile=‘EXCLUSIVE‘
#通过sqlnet.ora文件验证用户;
*.undo_tablespace=‘UNDOTBS1‘
#回滚表空间
10.5、oracle数据库优化:
1、修改oracle实例的最大连接数;
本文上面有介绍,在此就不再赘述了;
2、修改oracle实例的session游标数
SQL> alter system set open_cursors=500 scope=spfile;
SQL> shutdown immediate;
SQL> startup;
3、修改oracle实例可用内存大小:
SQL> alter system set memory_target=4340763136 scope=spfile;
#Oracle实例可用内存增大为4G,注意:最大不能超过物理内存的80%;
SQL> shutdown immediate;
SQL> startup;