2020年8月25日 星期二

4.6 Oracle 參數

Oracle 的參數可以分為動態參數與靜態參數兩種。動態參數表示參數可以在線上(也就是資料庫開啟的時候)進行修改並且立即生效,而靜態參數則是修改完必須重啟資料庫才會生效。


不論資料庫是用pfile或是spfile啟動,都可以線上進行動態參數的修改,差別在於如果資料庫啟動時使用的是pfile,那麼動態參數修改的內容不會更新到pfile上面,除非自行再去pfile裡面修改,不然下次再使用pfile重新啟動時這個參數的異動會消失;而使用spfile開啟資料庫的話,動態參數的修改會更新回spfile,下次啟動時參數的異動仍然會保留。


更改動態參數直接使用 alter system set 命令直接修改,例如修改undo_retention參數:

SQL> alter system set undo_retention=1500;


修改動態參數會立即生效:

undo_retention從900修改為1500立即生效。


靜態參數的修改必須重新啟動資料庫後才會生效,因此必須先將參數於pfile或是spfile裡面先修改,然後再重新啟動,若是線上直接修改靜態參數則是會直接報錯:


這個時候必須將參數先修改至spfile裡面,然後再重啟讓參數生效,修改的方法於alter system set 命令再加上scope= 設定:

SQL> alter system set processes=300 scope=spfile;


scope 可以設定的範圍如下:


scope=spfile

 表示將參數異動至spfile裡面但是不生效,必須重啟資料庫後重新讀取spfile才會生效,靜態與動態參數皆可以使用。


scope=memory

 表示參數異動立即生效,但是異動不寫入spfile,重啟之後參數異動會消失,只有動態參數可以使用,


scope=both 

 預設選項,沒有使用 scope 關鍵字時預設就是scope=both,參數異動立即生效並且寫入spfile內,只有動態參數可以使用。


那麼要如何判斷參數是靜態或是動態參數 ? 我們可以從 v$parameter 裡面的 issys_modifiable 欄位來判斷,例如要查詢 sga 相關參數是否為動態參數:


SQL> select name,value,issys_modifiable from v$parameter

        where name like ‘sga%’;

issys_modifiable 顯示為false表示為靜態參數,immediate表示為動態參數,以這個例子來說,sga_max_size為靜態參數、sga_target為動態參數。


不論是靜態參數或動態參數都可以透過pfile直接進行修改,透過文字編輯器開啟一份pfile便可以看到目前所使用的參數:

pfile所使用的格式為 <instance_name>.<parameter> 。 * 號表示此參數在所有instance的設定都一樣,RAC 架構下有可能每個 instance 的參數設定會不一樣,例如undo_tablespace:



設定表示instance ORA111 的 undo_tablespace 為 UNDOTBS1,ORA112的undo_tablespace為UNDOTBS2。


如果要查詢目前參數的設定,除了可以直接從參數檔查詢外,也可以直接在sqlplus裡面使用 ”show parameter + 關鍵字” 這個命令來查閱參數:


SQL> show parameter;

     (列出 DB 所有參數)

SQL> show parameter sga_target;

     (列出 sga_target 這個參數)

SQL> show parameter log_archive;

     (列出所有含 log_archive 關鍵字的參數)


另外有一種特殊的參數是以底線 “_” 開頭的,這些都是資料庫的隱藏參數,一般 show parameter 是不會顯示出這些參數,只有被修改過的隱藏參數才可以用 show parameter 顯示出來,必須透過下列指令查詢所有隱藏參數:

select

x.ksppinm name,

y.ksppstvl value,

y.ksppstdf isdefault,

decode(bitand(y.ksppstvf,7),1,'MODIFIED',4,'SYSTEM_MOD','FALSE') ismod

from sys.x$ksppi x, sys.x$ksppcv y

where x.indx=y.indx 

order by translate(x.ksppinm,'_','');


同樣的ismod欄位表示隱藏參數是否可以修改後立即生效,或是必須修改完重啟資料庫後生效。ksppinm表示隱藏參數的名稱,例如要查詢 “_gc_read_mostly_locking” 這個隱藏參數則多加入 ksppinm這個條件:


select

x.ksppinm name,

y.ksppstvl value,

y.ksppstdf isdefault,

decode(bitand(y.ksppstvf,7),1,'MODIFIED',4,'SYSTEM_MOD','FALSE') ismod

from sys.x$ksppi x, sys.x$ksppcv y

where x.indx=y.indx 

  AND x.ksppinm = '_gc_read_mostly_locking'

order by translate(x.ksppinm,'_','');


 

修改隱藏參數的方法與一般參數無異,可以直接寫入pfile或是使用alter system set 命令來設定,差別在於隱藏參數必須使用雙引號 “ 框起來,否則系統無法辨識參數名稱。


一般來說不會特別去修改隱藏參數,大多時候是因為系統出了問題 (例如bug),或是為了禁用資料庫的某些功能才會特別去設定隱藏參數。





沒有留言:

張貼留言