Oracle初始化参数可以分为3类:推导参数、操作系统依赖参数和可变参数。
原文:http://docs.oracle.com/cd/E11882_01/server.112/e40402/initparams001.htm#i1124342
推导参数(Derived Parameters)
推导参数意思是,这些参数的值来自于其他参数计算的结果,所以这类参数不需要修改,但当用户强行修改该参数时,会覆盖之前运算得出的值。
比如SESSIONS这个参数,缺省情况下由PROCESS运算而来,《DBA入门、进阶与诊断案例》中提到的公式是SESSIONS=(1.1*PROCESSES)+5,不过发现11G以有所改动,实际为SESSIONS=(1.6*PROCESSES)+8。
SQL> show parameter session;
NAME TYPE VALUE
----------------------- ----------- ---------
sessions integer 248
SQL> show parameter process;
NAME TYPE VALUE
----------------------- ----------- -------
processes integer 150
$vi initorcl.ora
*.processes=200
SQL> show parameter processes;
NAME TYPE VALUE
----------------------- ----------- ---------
processes integer 200
SQL> show parameter session;
NAME TYPE VALUE
----------------------- ----------- ---------
sessions integer 328
操作系统依赖参数(Operating System-Dependent Parameters)
这类参数的有效值或者取值范围受限于操作系统。比如:DB_BLOCK_BUFFERS表明主存中的buffers的数量,其最大值受系统参数的影响,而DB_BLOCK_SIZE则依赖于系统块的默认值。
可变参数(Variable Parameters)
可变参数通常是看调整的,有些设置是限制条件,如OPEN_CURSORS,假如该参数值为10,当用户尝试在自己的会话中打开第11个游标时,返回错误。但有些限制性的参数如DB_BLOCK_BUFFERS,虽然可能因超出限制而使得数据库工作缓慢,但不会阻止工作进行。
初始化参数的其它分类方式
按照修改方式的划分,初始化参数又可以分为静态参数和动态参数。
静态参数仅在参数文件(pfile)中修改,重启后设置生效。
动态参数可以随时调整,调整后看即时生效。
按照获取方式不同,初始化参数又可以分为显示参数和隐藏参数。
显示参数可以通过V$PARAMETER查询获取,而隐藏参数通常以'_'开头,查询需通过数据库基表获取。
初始化参数的获取
上面已经提到一般初始化参数的获取方式,包括V$PARAMETER视图,以及通过SHOW PARAMETER 'pararmeters_name' (这里的parameters_name支持模糊匹配)命令查看。通过SQL_TRACE跟踪可以发现SHOW PARAMETER语句实际是通过以下语句实现:
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(:NMBIND_SHOW_OBJ) ORDER BY
NAME_COL_PLUS_SHOW_PARAM,ROWNUM
:NMBIND_SHOW_OBJ 注意这里用的绑定变量,如果我替换成'%SGA%' 就与SHOW PARAMETER等效。
而通过对以上语句的进一步查询解释,可以看到V$PARAMETER是通过对以下基表的查询获取的:
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)));
而这些基表查询中是过滤了'_'开头的参数(translate(ksppinm, '_', '#') not like '##%'),也就是说不显示隐藏参数。
set line 300
col nam for a30
col value for a25
select ksppinm name,
ksppstvl value,
ksppstdf isdefault,
decode(bitand(ksppstvf, 7), 1, 'MODIFIED', 4, 'SYSTEM_MOD', 'FALSE') ismod,
decode(bitand(ksppstvf, 2), 2, 'TRUE', 'FALSE') isadj
from x$ksppi x, x$ksppcv y
where x.indx = y.indx
and x.indx = userenv('Instance')
and y.indx = userenv('Instance')
and x.indx = y.indx
and ((translate(ksppinm, '__', '#') like '##%') or
(translate(x.ksppinm, '_', '#') like '#%'))
order by translate(x.ksppinm, '_', '');