天天看點

教你在v$parameter中顯示隐藏參數

Oracle 啟動用到了初始化參數,通常我們都可以在sqlplus裡用show parameter 來獲得。而Oracle為了debug 或者解決一些特殊的問題,還提供了一些以“_”開頭的隐含參數。 網絡上有一些script可以讓我們輕松檢查這些隐含參數. 但是,有沒有想過,我們可以直接在sqlplus 用show parameter 來擷取這些隐含參數呢?

答案是

可以

的。

下面,我将示範一下如何用sqlplus 裡的 show parameter來直接檢視Oracle隐含參數.

1。首先,我們先要知道,sqlplus怎樣通過show parameter獲得參數的。通過sql_trace的方式可以發現。

PHP code:         sqlplus serol/luo



alter session set sql_trace=true;


show parameter optimizer



NAME                                 TYPE                             VALUE
------------------------------------ -------------------------------- ------------------------------


optimizer_dynamic_sampling           integer                          1

optimizer_features_enable            string                           9.2.0.1

optimizer_index_caching              integer                          0

optimizer_index_cost_adj             integer                          1

optimizer_max_permutations           integer                          2000

optimizer_mode                       string                           RULE


exit

...
           

到udump底下找到trace檔案,裡面的最主要的語句是:

PHP code:         SELECT NAME name_col_plus_show_param,DECODE(TYPE,1,'boolean',2,'string',3,'integer',4,'file',6,'big

integer','unknown') TYPE,VALUE value_col_plus_show_param 

FROM V$PARAMETER WHERE UPPER(NAME) LIKE UPP

ER('%optimizer%') ORDER BY name_col_plus_show_param,
ROWNUM


...
           

可以看到,sqlplus的show parameter實際上就是查詢V$PARAMETER .

2. 看看 v$parameter的定義。

PHP code:         SELECT * FROM v$fixed_view_definition

WHERE view_name = 'V$PARAMETER';


select  NUM , NAME , TYPE , VALUE , ISDEFAULT , ISSES_MODIFIABLE , ISSYS_MODIFIABLE , ISMODIFIED , 
ISADJUSTED , DESCRIPTION, UPDATE_COMMENT from GV$PARAMETER where inst_id = USERENV('Instance')




SELECT * FROM v$fixed_view_definition

WHERE view_name = 'GV$PARAMETER';



select x.inst_id,x.indx+1,ksppinm,ksppity,ksppstvl,ksppstdf,  

decode(bitand(ksppiflg/256,1),1,'TRUE','FALSE'),  

decode(bitand(ksppiflg/65536,3),1,'IMMEDIATE',2,
'DEFERRED',

3,'IMMEDIATE','FALSE'),  decode(bitand
(ksppstvf,7),1,'MODIFIED',4,'SYSTEM_MOD','FALSE'), 

decode(bitand(ksppstvf,2),2,'TRUE','FALSE'),  ksppdesc, ksppstcmnt  

 from x$ksppi x, x$ksppcv y 

 where (x.indx = y.indx) and  (  (translate(ksppinm,'_','#') not like '#%')

  or (ksppstdf = 'FALSE') )

...
           

看到上面最關鍵的 (translate(ksppinm,'_','#') not like '#%')的條件了嗎?,就是它把開頭為"_" 的隐含參數給過濾掉了。當然,ksppstdf = 'FALSE' 的條件是為了保證如果已經手動改過隐含參數,show parameter還會顯示改隐含參數

3。我們可以僞造一個v$parameter, 去掉過濾"_"的條件,就可以大功告成了。

不過,畢竟是改動系統的内部設定,大家一定要小心為上。

一定要以一個僅用于資料庫管理,不會參加任何程式活動的管理性資料庫使用者來僞造這個v$parameter,以免發生意外。而且,最好是在測試環境中玩,而不要跑到生産環境裡面。下面假設這個使用者名為:rollingpig.

以sys 登陸

PHP code:         connect / as sysdba



create view my_v$parameter_with_hidden  (NUM,NAME , TYPE 
, Value , ISDEFAULT  , ISSES_MODIFIABLE , ISSYS_MODIFIABLE ,ISMODIFIED  , ISADJUSTED, 


DESCRIPTION, UPDATE_COMMENT)



as 



select x.indx+1,ksppinm,ksppity,ksppstvl,ksppstdf,  

decode(bitand(ksppiflg/256,1),1,'TRUE','FALSE'),  

decode(bitand(ksppiflg/65536,3),1,'IMMEDIATE',2,'DEFERRED',

3,'IMMEDIATE','FALSE'),  decode(bitand(ksppstvf,7),1,'MODIFIED',4,'SYSTEM_MOD','FALSE'), 

decode(bitand(ksppstvf,2),2,'TRUE','FALSE'),  
ksppdesc, ksppstcmnt  

 from x$ksppi x, x$ksppcv y 

 where (x.indx = y.indx);


grant select on my_v$parameter_with_hidden  to rollingpig;


以 rollingpig 使用者連接配接,建立同義詞:



create synonym v$parameter for sys.my_v$parameter_with_hidden  ;

...
           

4。大功告成,測試一下吧

以rollingpig 使用者登陸:

PHP code:         show parameter optimizer



SQL> show parameter optimizer



NAME                                 TYPE                             VALUE
------------------------------------ -------------------------------- ------------------------------
_optimizer_adjust_for_nulls          boolean                          TRUE

_optimizer_choose_permutation        integer                          0

_optimizer_cost_model                string                           CHOOSE

_optimizer_degree                    integer                          0

_optimizer_dyn_smp_blks              integer                          32

_optimizer_join_sel_sanity_check     boolean                          FALSE

_optimizer_mode_force                boolean                          TRUE

_optimizer_new_join_card_computation boolean                          TRUE

_optimizer_percent_parallel          integer                          101

_optimizer_search_limit              integer                          5

_optimizer_skip_scan_enabled         boolean                          TRUE

_optimizer_sortmerge_join_enabled    boolean                          TRUE

_optimizer_system_stats_usage        integer                          0

_optimizer_undo_changes              boolean                          FALSE

_optimizer_undo_cost_change          string                           9.2.0.1

optimizer_dynamic_sampling           integer                          1

optimizer_features_enable            string                           9.2.0.1

optimizer_index_caching              integer                          0

optimizer_index_cost_adj             integer                          1

optimizer_max_permutations           integer                          2000

optimizer_mode                       string                           RULE


...
           

以"_"開頭的隐含參數一個給跑出來了,optimizer開頭的還真不少

教你在v$parameter中顯示隐藏參數

還有一些明顯是測試用的hidden parameter

PHP code:         SQL> show parameter test



NAME                                 TYPE                             VALUE
------------------------------------ -------------------------------- ------------------------------
_ipc_test_failover                   integer                          0

_ipc_test_mult_nets                  integer                          0

_test_ksusigskip                     integer                          5

_test_param_1                        integer                          25

_test_param_2                        string

_test_param_3                        string

_test_param_4                        string

_test_param_5                        integer                          25

_test_param_6                        big integer                      0
...
           

最後重申一點:

是在測試環境中玩,不要跑到生産環境裡面中玩哦……

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/20813025/viewspace-1037117/,如需轉載,請注明出處,否則将追究法律責任。

轉載于:http://blog.itpub.net/20813025/viewspace-1037117/