Welcome 微信登录

首页 / 数据库 / MySQL / 用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) =====================
www.linuxidc.com
===================== 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 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12数据库同步过程中一致性和完整性的保证exp/expdp传输表空间和rman convert实现大数据量快速迁移相关资讯      Oracle数据库学习 
  • Oracle数据库学习总结  (12/30/2013 18:30:01)
  • Oracle用户访问权限与PUBLIC角色的  (06/05/2012 09:57:17)
  • 如何不备份已备过的Oracle归档日志  (06/05/2012 09:55:16)
  • 如何实现Oracle中用户B只能访问用  (06/05/2012 09:59:31)
  • Oracle数据库数据访问安全与审计方  (06/05/2012 09:55:58)
  • Oracle 10g expdp/impdp在项目中实  (06/05/2012 09:53:10)
本文评论 查看全部评论 (0)
表情: 姓名: 字数