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に出力される条件が、既に設定されていることなので、単純に_のものを出力すれば確認が出来そうということが分かります。