oracle参数与参数文件小结

本文探讨了数据库参数的作用、分类及其在不同层级的应用,并介绍了参数文件的类型、搜索顺序及备份方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文讨论单实例下的参数和参数文件相关基础内容

参数:


1.参数作用于什么对象?

Initialization parameters fall into various functional groups. For example, parameters 
perform the following functions:
■ Set limits for the entire database
■ Set user or process limits
■ Set limits on database resources
■ Affect performance (these are called variable parameters)
Variable parameters are of particular interest to database administrators, because 
these parameters are used primarily to improve database performance.

2. 使用参数的目的是什么?
Database administrators can use initialization parameters to:
■ Optimize performance by adjusting memory structures, such as the number of 
database buffers in memory
■ Set database-wide defaults, such as the amount of space initially allocated for a 
context area when it is created
■ Set database limits, such as the maximum number of database users
■ Specify names of files or directories required by the database

上面文字要表达的意思大致如下:
参数可以用来进行系统和数据库资源限制(包括目录,用户进程,内存等方面限制),设置进程运行相关的变量值(如检查点相关时间间隔,是否开启自动检查点等)。在适当的环境下设置适当的值 ,可以改善系统性能。

3.参数的分类

按照参数来源方式,可以进行如下划分:

(1)推导参数(Derived Parameters):
有些参数是由其他参数推导出来的,也就是说,他依赖别的参数的值,这种参数就叫做推导参数。
例如,session和transactions是由process参数推导出的:
process:限制了能够连接到oacle实例的的操作系统进程数,或者是Windows系统中的线程数。
在linux中,可以使用下面命令查看相关操作系统进程:
SYS > ho ps aux | grep oracle | grep -v "ps aux" | grep -v "grep" | grep -v  "su - oracle"(实际可能有所差异)
再对比视图v$process的值,应该是一致的
SYS >select PNAME,USERNAME,spid,PROGRAM from v$process;
 

一般数据库启动后,就会预先为每个process分配内存空间(以前貌似是4bytes,11gR2是每个进程8bytes):
SYS >select name,value from v$parameter where name=('processes');     
NAME
---------
VALUE
-----------
processes
300
SYS >select * from v$sgastat where name=('processes');
POOL                    |NAME                                                |     BYTES
------------------------|----------------------------------------------------|----------
shared pool             |processes                                           |      2400
sessions限制了系统可以创建的最大回话,因为每一个登录都需要一个sessions,在指定这个值的时候,就要考虑有多少用户要连接上来。
以oracle 11gR2为例,专有模式下,session与process之间的换算方式是:
Default value Derived: (1.5 * PROCESSES) + 22
在共享模式下,由于process的值可以设置得比较小,因此sessions可以设置成最大连接数(预计)的1.1倍。
SYS >sessions
NAME
--------------------
VALUE
--------------------
processes
150
sessions
247
如果修改参数processes参数,可以观察sessions的变化:
alter system set processes=300 scope=spfile;   
SYS >select name,value from v$parameter where name in ('processes','sessions'); 
NAME
----------
----------
300
sessions
472
如果修改了sessions参数(比472小):
SYS >alter system set sessions=400  scope=spfile;
重启发现,它仍旧是472:
SYS >select name,value from v$parameter where name in ('processes','sessions'); 
NAME
--------------------
VALUE
--------------------
processes
300
sessions
472
如果修改sessions的值比472大,那么以修改后的值为准:
SYS >alter system set sessions=800 scope=spfile;  
SYS >select name,value from v$parameter where name in ('processes','sessions'); 
NAME
----------
VALUE
----------
300
sessions
800

(2)依赖于操作系统的参数(Operating System-Dependent Parameters)
For example, the parameter DB_BLOCK_BUFFERS indicates the 
number of data buffers in main memory, and its maximum value depends on the 
operating system. The size of those buffers, set by DB_BLOCK_SIZE, has an operating 
system-dependent default value.
依赖参数就是哪些有效值和范围依赖操作系统的参数,例如db_block_size可以为2k,4k,8k,16k,32k

(3)可变参数(Variable Parameters)

这种参数不是谁导出的,也和操作系统无关,可以根据需求进行更改。但是,修改的时候有效值和范围需要遵循oracle相关规范(e25513.pdf中的定义)。这些参数往往是数据库优化的关键因素。
例如:open_cursors控制一个session可以打开的最大游标数目(限制条件)。
SYS >alter system set open_cursors=2 scope=memory; 
执行pl/sql:
set serveroutput on
declare
 v_sname varchar2(100);
 v_sno   number(20);
 cursor get_data is   
 select sname from student;
 cursor get_data2 is
  select sno from student;
begin
 open get_data;
 open get_data2;
 fetch get_data into v_sname;
 fetch get_data2 into v_sno;
 dbms_output.put_line(v_sname);
 dbms_output.put_line(v_sno);
close get_data;
close get_data2; 
end;
/
SYS >/
declare
*
ERROR at line 1:
ORA-01000: 超出打开游标的最大数
ORA-06512: 在 line 7
ORA-06512: 在 line 10

有些参数,比如之前那个process值增大以后,预分配的空间(shared pool)就会增大;SGA大一点自然是好的,但是,当SGA被换入换出时候,就值得关注了(考虑限制容量)。
Increasing the values of variable parameters may improve your system's performance, 
but increasing most parameters also increases the system global area (SGA) size. A 
larger SGA can improve database performance up to a point. In virtual memory 
operating systems, an SGA that is too large can degrade performance if it is swapped 
in and out of memory. Operating system parameters that control virtual memory 
working areas should be set with the SGA size in mind. The operating system 
configuration can also limit the maximum size of the SGA

按照修改特征,可以把参数分为动态参数和静态参数。

例如,前面的process由于要启动才能分配sga,那么它就是一个静态参数,运行期间不能在内存修改。有些参数,比如和检查点相关的就可以在内存修改:
HUANGXING >show parameter checkpoint;
NAME                                |TYPE       |VALUE
------------------------------------|-----------|------------------------------
log_checkpoint_interval             |integer    |0
log_checkpoint_timeout              |integer    |1800
log_checkpoints_to_alert            |boolean    |TRUE

按照参数显示特性,可以分为常规参数和隐含参数: 

查看视图V$PARAMETER来源:
 SYS >select view_definition from v$fixed_view_definition a where a.VIEW_NAME='V$PARAMETER'; 
VIEW_DEFINITION
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
select  NUM , NAME , TYPE , VALUE , DISPLAY_VALUE, ISDEFAULT , ISSES_MODIFIABLE , ISSYS_MODIFIABLE , ISINSTANCE_MODIFIABLE, ISMODIFIED , ISADJUSTED , ISDEPRECATED, ISBASIC, DESCRIPTION, UPDATE_COMMENT, HASH   from GV$PARAMETER where inst_id = USERENV('Instance')

查看GV$PARAMETER 视图:

SYS >select view_definition from v$fixed_view_definition a where a.VIEW_NAME='GV$PARAMETER';  

VIEW_DEFINITION
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
select x.inst_id,x.indx+1,ksppinm,ksppity,ksppstvl, ksppstdvl, ksppstdf,  decode(bitand(ksppiflg/256,1),1,'TRUE','FALSE'),  decode(bitand(ksppiflg/65536,3),1,'IMMEDIATE',2,'DEFERRED',                           3,'IMMEDIATE','FALSE'),  decode(bitand(ksppiflg,4),4,'FALSE',                                      decode(bitand(ksppiflg/65536,3), 0, 'FALSE', 'TRUE')),     decode(bitand(ksppstvf,7),
1,'MODIFIED',4,'SYSTEM_MOD','FALSE'),  decode(bitand(ksppstvf,2),2,'TRUE','FALSE'),  decode(bitand(ksppilrmflg/64, 1), 1, 'TRUE', 'FALSE'),  decode(bitand(ksppilrmflg/268435456, 1), 1, 'TRUE', 'FALSE'),  ksppdesc, ksppstcmnt, ksppihash  from x$ksppi x, x$ksppcv y where (x.indx = y.indx) and  bitand(ksppiflg,268435456) = 0 and  ((translate(ksppinm,'_','#') not like '##%') and    ((translate(ksppinm
,'_','#') not like '#%')      or (ksppstdf = 'FALSE') or      (bitand(ksppstvf,5) > 0)))

从上面可以看出,v$parameter展现的是不包含"_"开头的参数

剩下的的就是隐含参数了:

col ksppinm for a30
col ksppdesc for a60
col ksppstvl for a10
select  ksppinm ,ksppdesc,ksppstvl  
from sys.x$ksppi x,sys.x$ksppcv y 
where   x.inst_id = userenv('Instance') and  y.inst_id = userenv('Instance') and  x.indx = y.indx
and 
substr(ksppinm,1,1) = '_';


4. 会话与实例级别的参数相关视图:

v$parameter视图记录的是会话级别的参数,而v$system_parameter记载的是实例级别的参数,用户登录后需要首先从视图v$system_parameter继承参数,如果在会话设置了不同的值,就可以从v$parameter读取新设置的值。例如:
SYS >select count(*) from v$parameter;
  COUNT(*)
----------
       347
SYS >select count(*) from v$system_parameter;
  COUNT(*)
----------
       347
SYS >show parameter sql_trace;(show parameter实际是从v$parameter视图读取参数)
SYS >alter session set sql_trace=true;
Session altered.
SYS >show parameter sql_trace;        
NAME                                |TYPE       |VALUE
------------------------------------|-----------|------------------------------
sql_trace                           |boolean    |TRUE
SYS >select value from v$system_parameter where name='sql_trace';
VALUE
------------------------------------------------------------
FALSE

参数文件

参数文件:包含一系列参数和值的对应关系的文件。

1. 分类:

参数文件一般分为两类:
(1)初始化文件(Initialization Parameter Files):
初始化参数文件是一个包含了一些参数和参数值对应关系的文本文件.初始化参数文件一般有两点好处:
a. 可以手动打开修改,有时候服务器参数被破坏了,导致无法启动数据库,就可以通过建立初始化参数文件启动数据库,然后再重新建立服务器参数文件
b. 初始化参数可以从客户端启用数据库

例如:
在客户端启动数据库:
C:\Users\HuangXing>sqlplus sys/talent@191.255.255.253:1523/hx1 as sysdba
已连接到空闲例程。
SYS AS SYSDBA>>startup nomount pfile='F:\baiduyundownload\ORACLE\\inithexel.ora';
ORACLE 例程已经启动。

(2)服务器参数文件:(Server Parameter Files)
服务器参数就是必须放在数据库服务器上的参数文件,特点如下:
a. 可以在数据库启动以后修改(alter system)
b. 不可以手动打开修改
c. 不可以用在客户端远程启动数据库
d. 可以使用rman进行备份

oracle9i以后引入了spfile参数文件,视图v$spparameter记录了spfile参数文件的情况:
SYS >select sid,name,type,value,update_comment from v$spparameter where value is not null;
SID  |NAME                          |TYPE       |VALUE                                                       |UPDATE_COM
-----|------------------------------|-----------|------------------------------------------------------------|----------
*    |processes                     |integer    |300                                                         |
*    |sessions                      |integer    |800                                                         |
*    |sga_max_size                  |big integer|217386880                                                   |
*    |sga_target                    |big integer|214241152                                                   |
*    |memory_target                 |big integer|230686720                                                   |
*    |control_files                 |string     |/u01/oradata2/hx/control01.ctl                              |
*    |db_block_size                 |integer    |8192                                                        |
*    |db_2k_cache_size              |big integer|2097152                                                     |
*    |db_16k_cache_size             |big integer|16777216                                                    |
*    |compatible                    |string     |11.2.0                                                      |
*    |db_recovery_file_dest         |string     |/u01/fast_recovery_area/hexel                               |
*    |db_recovery_file_dest_size    |big integer|1073741824                                                  |
*    |fast_start_mttr_target        |integer    |0                                                           |
*    |log_checkpoints_to_alert      |boolean    |TRUE                                                        |
*    |undo_tablespace               |string     |UNDOTBS1                                                    |
………………………………………………………………………………………………………………………………………………………………………………………………
29 rows selected.
还可以使用show命令查看,得出的结果是一样的(11g具备的特性),
SYS >show spparameter;

2. 数据库实例启动时参数文件搜索顺序

数据库实例启动后时,如果不指定从哪个初始参数文件启动,它搜寻的顺序是spfile<ORACLE_SID>.ora,spfile.ora,init<ORACLE_SID>.ora.
可以指定从一个初始化参数启动数据库,文章开头就是这种情况:
SYS AS SYSDBA>>startup nomount pfile='F:\baiduyundownload\ORACLE\\inithexel.ora';
如果修改了spfile文件,没有init文件和spfile文件备份,引起数据库无法启动,可以使用下面两种办法解决:
SYS >alter system set audit_file_dest='/uu' scope=spfile;
SYS >shutdown immediate;
SYS >startup nomount;
ORA-09925: Unable to create audit trail file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 9925

第一种:
oracle[~/oracle/dbs]$touch init_test.ora
oracle[~/oracle/dbs]$echo "spfile='/u01/oracle/dbs/spfilehexel.ora'" >> init_test.ora
oracle[~/oracle/dbs]$echo "audit_file_dest='/u01/oracle'" >> init_test.ora
oracle[~/oracle/dbs]$cat init_test.ora 
spfile='/u01/oracle/dbs/spfilehexel.ora'
audit_file_dest='/u01/oracle'

SYS >startup pfile='/u01/oracle/dbs/init_test.ora';
SYS >show parameter pfile;
NAME                                |TYPE       |VALUE
------------------------------------|-----------|------------------------------
spfile                              |string     |/u01/oracle/dbs/spfilehexel.ora
SYS >show parameter spfile;
NAME                                |TYPE       |VALUE
------------------------------------|-----------|------------------------------
spfile                              |string     |/u01/oracle/dbs/spfilehexel.ora
SYS >alter system set audit_file_dest='/u01' scope=spfile; 
SYS >show spparameter audit_file_dest;
SID     |NAME                         |TYPE       |VALUE
--------|-----------------------------|-----------|----------------------------
*       |audit_file_dest              |string     |/u01
SYS >shutdown immediate;
SYS >startup;

第二种
oracle[~/oracle/dbs]$sqlplus / as sysdba
Connected to an idle instance.
SYS >create pfile from spfile;
File created.
接下来,修改pfile中的文件,使用pfile文件启动,再重建spfile文件即可。

3. 修改参数

修改参数用alter system关键字,如果没有指定scope,那默认scope就等于both,即同时修改参数文件和内存。
有时候,显式地修改了某个参数后,启动可能会报ORA-32004(这些参数往往是新版本不再需要手动设置的参数)。在这种情况下,如果创建pfile,修改后再创建spfile显得有点麻烦
可以使用reset关键字去除spfile文件中的相关参数:
例如:
SYS >alter system set user_dump_dest='/u01/diag/rdbms/hx/hexel/trace' scope=spfile;
SYS >startup force;
ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance
ORACLE instance started.
SYS >show spparameter user_dump_dest;
SID     |NAME                         |TYPE       |VALUE
--------|-----------------------------|-----------|----------------------------
*       |user_dump_dest               |string     |/u01/diag/rdbms/hx/hexel/trace
SYS >alter system reset user_dump_dest scope=spfile;
SYS >show spparameter user_dump_dest;               
SID     |NAME                         |TYPE       |VALUE
--------|-----------------------------|-----------|----------------------------
*       |user_dump_dest               |string     |
SYS >startup force;
ORACLE instance started.

4. 参数文件备份:

备份终于泰山!参数文件备份有很多方法:
1.直接拷贝文件;
2.使用create pfile='xxx' from spfile备份,以防spfile文件损坏;
3.11g新特性:使用create pfile/spfile='xxxxx' from memory,这种方式可以从当前运行的实例备份,还可以看到很多的隐含参数;
4.rman备份(自动备份,适用于spfile文件备份);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值