天天看點

Oracle初始化參數

Oracle初始化參數可以分為3類:推導參數、作業系統依賴參數和可變參數。

原文:http://docs.oracle.com/cd/E11882_01/server.112/e40402/initparams001.htm#i1124342

推導參數(Derived Parameters)

推導參數意思是,這些參數的值來自于其他參數計算的結果,是以這類參數不需要修改,但當使用者強行修改該參數時,會覆寫之前運算得出的值。

比如SESSIONS這個參數,預設情況下由PROCESS運算而來,《DBA入門、進階與診斷案例》中提到的公式是SESSIONS=(1.1*PROCESSES)+5,不過發現11G以有所改動,實際為SESSIONS=(1.6*PROCESSES)+8。

SQL> show parameter session;
NAME                    TYPE          VALUE
----------------------- -----------   ---------
sessions                integer       248
SQL> show parameter process;
NAME                    TYPE          VALUE
----------------------- -----------   -------
processes               integer       150
$vi initorcl.ora
*.processes=200
SQL> show parameter processes;
NAME                    TYPE          VALUE
----------------------- -----------   ---------
processes               integer       200
SQL> show parameter session;
NAME                    TYPE          VALUE
----------------------- -----------   ---------
sessions                integer       328      

作業系統依賴參數(Operating System-Dependent Parameters)

這類參數的有效值或者取值範圍受限于作業系統。比如:DB_BLOCK_BUFFERS表明主存中的buffers的數量,其最大值受系統參數的影響,而DB_BLOCK_SIZE則依賴于系統塊的預設值。

可變參數(Variable Parameters)

可變參數通常是看調整的,有些設定是限制條件,如OPEN_CURSORS,假如該參數值為10,當使用者嘗試在自己的會話中打開第11個遊标時,傳回錯誤。但有些限制性的參數如DB_BLOCK_BUFFERS,雖然可能因超出限制而使得資料庫工作緩慢,但不會阻止工作進行。

初始化參數的其它分類方式

按照修改方式的劃分,初始化參數又可以分為靜态參數和動态參數。

靜态參數僅在參數檔案(pfile)中修改,重新開機後設定生效。

動态參數可以随時調整,調整後看即時生效。

按照擷取方式不同,初始化參數又可以分為顯示參數和隐藏參數。

顯示參數可以通過V$PARAMETER查詢擷取,而隐藏參數通常以'_'開頭,查詢需通過資料庫基表擷取。

初始化參數的擷取

上面已經提到一般初始化參數的擷取方式,包括V$PARAMETER視圖,以及通過SHOW PARAMETER 'pararmeters_name' (這裡的parameters_name支援模糊比對)指令檢視。通過SQL_TRACE跟蹤可以發現SHOW PARAMETER語句實際是通過以下語句實作:

SELECT NAME NAME_COL_PLUS_SHOW_PARAM,DECODE(TYPE,1,'boolean',2,'string',3,
  'integer',4,'file',5,'number',        6,'big integer', 'unknown') TYPE,
  DISPLAY_VALUE VALUE_COL_PLUS_SHOW_PARAM 
FROM
 V$PARAMETER WHERE UPPER(NAME) LIKE UPPER(:NMBIND_SHOW_OBJ) ORDER BY 
  NAME_COL_PLUS_SHOW_PARAM,ROWNUM      

:NMBIND_SHOW_OBJ 注意這裡用的綁定變量,如果我替換成'%SGA%' 就與SHOW PARAMETER等效。

而通過對以上語句的進一步查詢解釋,可以看到V$PARAMETER是通過對以下基表的查詢擷取的:

select x.inst_id,
       x.indx + 1,
       ksppinm,
       ksppity,
       ksppstvl,
       ksppstdvl,
       ksppstdf,
       decode(bitand(ksppiflg / 256, 1), 1, 'TRUE', 'FALSE'),
       decode(bitand(ksppiflg / 65536, 3),
              1,
              'IMMEDIATE',
              2,
              'DEFERRED',
              3,
              'IMMEDIATE',
              '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
  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)));      

而這些基表查詢中是過濾了'_'開頭的參數(translate(ksppinm, '_', '#') not like '##%'),也就是說不顯示隐藏參數。

set line 300
col nam for a30
col value for a25
select ksppinm name,
       ksppstvl value,
       ksppstdf isdefault,
       decode(bitand(ksppstvf, 7), 1, 'MODIFIED', 4, 'SYSTEM_MOD', 'FALSE') ismod,
       decode(bitand(ksppstvf, 2), 2, 'TRUE', 'FALSE') isadj
  from x$ksppi x, x$ksppcv y
 where x.indx = y.indx
   and x.indx = userenv('Instance')
   and y.indx = userenv('Instance')
   and x.indx = y.indx
   and ((translate(ksppinm, '__', '#') like '##%') or
       (translate(x.ksppinm, '_', '#') like '#%'))
 order by translate(x.ksppinm, '_', '');