Oracle 数据库启动时用到的数据库初始化参数,我们通常是在 sqlplus 中使用 show parameter 命令来获

Oracle 数据库启动时用到的数据库初始化参数,我们通常是在 sqlplus 中使用 show parameter 命令来获取。但这里看到只会是一些公开的参数,和已经修改的隐含参数。 Oracle 还有一批隐含参数,在 debug 或者实现某些功能时非常有用。

在网上,你可以很方便的查到如何查询这些隐含参数。但是,如果我还想继续使用 show parameter 方法显示隐含参数呢?这该如何实现?

我在这里介绍一个方法,,来实现这个目标。介绍这个方法的目的不仅仅是为了实现 show parameter 可以显示隐含参数,还包括如何分析 show parameter 的实现过程。在遇到数据库问题诊断需求时,这个方法,您也可以参考一下。

首先,我们分析 show parameter 这个命令是如何实现显示初始化参数值的。

登录 sqlplus / as sysdba

使用 alter session set sql_trace=true; 追踪 show parameter 的执行过程。

SQL> alter session set sql_trace=true;

Session altered.

SQL> show parameter "_pga_max_size"

SQL> host;

bash-3.2$ more /u01/oracle/app/oracle/admin/htzq/udump/htzq2_ora_19678.trc

/u01/oracle/app/oracle/admin/htzq/udump/htzq2_ora_19678.trc

Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production

With the Partitioning, Real Application Clusters, OLAP, Data Mining

and Real Application Testing options

ORACLE_HOME = /u01/oracle/app/oracle/product/10.2.0/db

System name: Linux

Node name: webdg2

Release: 2.6.18-92.el5

Version: #1 SMP Tue Apr 29 13:16:15 EDT 2008

Machine: x86_64

Instance name: htzq2

Redo thread mounted by this instance: 2

Oracle process number: 30

Unix process pid: 19678, image: oracle@webdg2 (TNS V1-V3)

=====================

=====================

PARSING IN CURSOR #2 len=290 dep=0 uid=0 oct=3 lid=0 tim=1307409201601477 hv=1905048613 ad='c9e347d8'

SELECT NAME NAME_COL_PLUS_SHOW_PARAM,DECODE(TYPE,1,'boolean',2,'string',3,'integer',4,'file',5,'number', 6,'big integer', 'un

known') TYPE,DISPLAY_VALUE VALUE_COL_PLUS_SHOW_PARAM FROM V$PARAMETER WHERE UPPER(NAME) LIKE UPPER('%_pga_max_size%') ORDER BY NAME_

COL_PLUS_SHOW_PARAM,ROWNUM

END OF STMT

PARSE #2:c=4999,e=4042,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,tim=1307409201601471

EXEC #2:c=0,e=63,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=1307409201601611

FETCH #2:c=4999,e=5583,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=1307409201607254

bash-3.2$ exit

exit

结果显示 ,show parameter 就是查询一下 V$PARAMETER 视图。

接着,我们就分析 V$PARAMETER 视图的定义

SQL> SELECT * FROM v$fixed_view_definition WHERE view_name = 'V$PARAMETER';

VIEW_NAME
------------------------------
VIEW_DEFINITION
--------------------------------------------------------------------------------
V$PARAMETER
select NUM , NAME , TYPE , VALUE , DISPLAY_VALUE, ISDEFAULT , ISSES_MODIFIABLE
, ISSYS_MODIFIABLE , ISINSTANCE_MODIFIABLE, ISMODIFIED , ISADJUSTED , ISDEPRECAT
ED, DESCRIPTION, UPDATE_COMMENT, HASH from GV$PARAMETER where inst_id = USERENV
('Instance')

SQL> r

1* SELECT * FROM v$fixed_view_definition WHERE view_name = 'GV$PARAMETER'

VIEW_NAME

------------------------------

VIEW_DEFINITION

--------------------------------------------------------------------------------

GV$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,'I

MMEDIATE',2,'DEFERRED', 3,'IMMEDIATE','FALSE'),

decode(bitand(ksppiflg,4),4,'FALSE', decod

e(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'), ksppdesc, ksppstcmn

t, ksppihash from x$ksppi x, x$ksppcv y where (x.indx = y.indx) and ((translat

e(ksppinm,'_','#') not like '##%') and ((translate(ksppinm,'_','#') not like

'#%') or (ksppstdf = 'FALSE') or (bitand(ksppstvf,5) > 0)))

V$PARAMETER 的定义主要来源于 GV$PARAMETER , 两个都是同义词,来源于v_$parameter和gv_$parameter。

这个定义语句中最关键部分 (translate(ksppinm,'_','#') not like '#%') 的条件。就是它把开头为 "_" 的隐含参数给过滤掉了。因为加了 ksppstdf = 'FALSE' 的条件,这保证如果已经手动改过隐含参数, show parameter 时会显示已经修改的隐含参数。

最后,重建 gv$parameter视图

create or replace view gv_$parameter(INST_ID, NUM, NAME , TYPE , VALUE, DISPLAY_VALUE, ISDEFAULT, ISSES_MODIFIABLE , ISSYS_MODIFIABLE , ISINSTANCE_MODIFIABLE, ISMODIFIED , ISADJUSTED , ISDEPRECATED , DESCRIPTION, UPDATE_COMMENT , HASH ) as
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'),
ksppdesc,
ksppstcmnt,
ksppihash
from sys.x$ksppi x, sys.x$ksppcv y
where (x.indx = y.indx) and (translate(ksppinm, '_', '#') not like '##%');

有一个疑问:

show parameter 时查的是同义词gv$parameter。该同义词无法删除重建。

SQL> create synonym GV$PARAMETER for GV_$PARAMETER;
create synonym GV$PARAMETER for GV_$PARAMETER
*
ERROR at line 1:
ORA-00955: name is already used by an existing object


SQL> drop synonym GV$PARAMETER;
drop synonym GV$PARAMETER
*
ERROR at line 1:

ORA-02030: can only select from fixed tables/views

更多Oracle相关信息见Oracle 专题页面 ?tid=12

用show parameter也能显示隐含参数-LMLPHP

09-16 20:53