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開頭的還真不少
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZukjMvw1cllGbp12cvw1cldWYtl2LcRXZu5iY1BHdp5yZvxmYvw1LcpDc0RHaiojIsJye.gif)
還有一些明顯是測試用的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/