SSJ Tech Lab - Oracle Database テクニカルラボ

X$表を利用して、設定していない隠しパラメータを参照する(V$PARAMETER)

2016-06-24記事公開

隠しパラメータの一覧出力は、マニュアルなどで一般に案内されている内容ではない為、こちらに記載された内容についての質問や、動作の異常についてはお答えできないことがございます。
利用する場合には自己責任にて実施をお願いいたします。

隠しパラメータの確認について

隠しパラメータ取得用SQLの実行

以下の文を実行することで、隠しパラメータ参照することが出来ます。

SQL> set line 180 trim on pages 1000
SQL> col NAME format a25
SQL> col DEFAULT_VALUE format a30
SQL> col DESCRIPTION format a80
SQL> select x.inst_id as INST_ID
  2       , ksppinm as NAME
  3       , ksppstdfl as DEFAULT_VALUE
  4       , ksppstdf as IS_DEFAULT
  5       , ksppdesc as DESCRIPTION
  6    from x$ksppi x
  7       , x$ksppcv y
  8   where (x.indx = y.indx)
  9     and bitand(ksppiflg,268435456) = 0
 10     and (translate(ksppinm,'_','#') not like '##%')
 11     and x.inst_id = USERENV('Instance');

   INST_ID NAME                      DEFAULT_VALUE                  IS_DEFAUL DESCRIPTION
---------- ------------------------- ------------------------------ --------- --------------------------------------------------------------
         1 _appqos_qt                0                              TRUE      System Queue time retrieval interval
         1 _appqos_po_multiplier     10                             TRUE      Multiplier for PC performance objective value
...
         1 _gwm_spare2               0                              TRUE      gsm spare 2
         1 _gwm_spare3               0                              TRUE      gsm spare 3
         1 _rq_shm_max_size          0                              TRUE      maximum size of an RQuery shared memory segement (in KB)

3966 rows selected.

隠しパラメータ取得用SQLをどのように作成したか

一般にX$表と呼ばれる表については公開されておりません。実行においても基本的にORACLEのサポートに許可を取ったうえで実施します。
いくつかのX$表についてはV$FIXED_VIEW_DEFINITIONを参照することで、内容の予測をすることが出来ます。X$表については基本サポートに従ったうえで実施をしてください。

以下は今回のSQLを取得する際に実施した内容です。

SQL> select VIEW_NAME
  2       , VIEW_DEFINITION
  3  from V$FIXED_VIEW_DEFINITION
  4  where VIEW_NAME = 'GV$PARAMETER';

-- 以下結果を整形しています。
select x.inst_id
     , x.indx+1
     , ksppinm
     , ksppity
     , ksppstvl
     , ksppstdvl
     , ksppstdfl
     , ksppstdf
     , decode(
           bitand(ksppiflg/256,1)
         , 1, 'TRUE'
         , 'FALSE')
     , decode(
           bitand(ksppiflg/65536,3)
         , 1 , 'IMMEDIATE'
         , 2 , 'DEFERRED'
         , 3 , 'IMMEDIATE'
         , 'FALSE')
     , decode(
           bitand(ksppiflg/524288,1)
         , 1 , 'TRUE'
         , '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
     , x.con_id
  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)
   )

SQL> -- 以下の GV$PARAMETER の定義を確認すると 3 番目が NAME であり、 ksppinm が該当することが分かります。
SQL> desc GV$PARAMETER
 Name                               Null?    Type
 ---------------------------------- -------- ----------------------
 INST_ID                                     NUMBER
 NUM                                         NUMBER
 NAME                                        VARCHAR2(80)
 TYPE                                        NUMBER
 VALUE                                       VARCHAR2(4000)
 DISPLAY_VALUE                               VARCHAR2(4000)
 DEFAULT_VALUE                               VARCHAR2(255)
 ISDEFAULT                                   VARCHAR2(9)
 ISSES_MODIFIABLE                            VARCHAR2(5)
 ISSYS_MODIFIABLE                            VARCHAR2(9)
 ISPDB_MODIFIABLE                            VARCHAR2(5)
 ISINSTANCE_MODIFIABLE                       VARCHAR2(5)
 ISMODIFIED                                  VARCHAR2(10)
 ISADJUSTED                                  VARCHAR2(5)
 ISDEPRECATED                                VARCHAR2(5)
 ISBASIC                                     VARCHAR2(5)
 DESCRIPTION                                 VARCHAR2(255)
 UPDATE_COMMENT                              VARCHAR2(255)
 HASH                                        NUMBER
 CON_ID                                      NUMBER

GV$PARAMETERのNAME列がksppinmであることが確認できました。
これを使用して隠しパラメータを出力します。

先ほど出力したSQLを見ると、最後のところにアンダースコア(_)がつく対象を除外している記載が見つかります。
これをどうにかすれば隠しパラメータを参照できそうです。

   and (
     (translate(ksppinm,'_','#') not like '#%')
      or (ksppstdf = 'FALSE')
      or (bitand(ksppstvf,5) > 0)
   )

ksppstdfはISDEFAULTでksppstvfはISMODIFIED(変更されたか)とISADJUSTED(ORACLEが内部的に調整したか)などのフラグを持っているので、変更管理に関する内容ということが想定できます。
また、隠しパラメータがV$PARAMETERに出力される条件が、既に設定されていることなので、単純に_のものを出力すれば確認が出来そうということが分かります。

関連記事

関連記事が存在しません