Oracle9i的動態SGA特性(2)

jss001發表於2009-02-17
  SGA的閥值摘要

  由下面的表一可以看到,在監視SGA的記憶體使用時,有幾個明顯的閥值可以利用。我們可以寫一些指令碼並在其中整合一些智慧,這樣就可以在處理的需求變化時重新設定SGA。

  RAM Area Too-small Condition Too-Large Condition

  Shared pool Library cache misses No misses

  Data buffer cache Hit ratio < 90% Hit ratio > 95%

  PGA aggregate high multi-pass executions 100% optimal executions 

  表1:SGA中的異常條件指示

  檢視SGA記憶體區域的負載

  Oracle9i使用了一些新的內部檢視或者在現有的檢視中加入新的列來幫助檢視Oracle9i中的內部記憶體分配情況。以下的新V$檢視可以幫助監視Oracle9i連線的記憶體使用。

  V$PROCESS -在Oracle9i中加入了三個新的列以監視PGA記憶體的使用,新列的名字是pga_used_mem, pga_alloc_mem 和pga_max_mem。

  V$SYSSTAT -加入了很多新的統計行,包括有area statistics for optimal, one-pass和multi-pass。

  V$PGASTAT -該新檢視展示了全部後臺程式和專用連線的PGA記憶體使用

  V$SQL_PLAN--這個新檢視包含了全部當前執行的SQL的執行計劃資訊。對於需要最最佳化的SQL語句的效能調整專家來說這是非常吸引人的。

  V$WORKAREA -這個新檢視提供了Oracle9i連線的累積記憶體統計的詳細資訊。

  V$WORKAREA_ACTIVE - 這個新的檢視提供了當前全部正在執行的SQL語句的內部記憶體使用資訊。

  它們的目的是透過這些V$檢視來監視SGA中的記憶體使用,然後根據Oracle例項的處理要求,透過ALTER SYSTEM命令重新分配記憶體。我們以下來看一些這些新的Oracle9i特性和指令碼,它可以幫助我們檢視詳細的記憶體使用。

  當然我們不可能在這裡詳述所有的技術,以下就讓我們看一個簡單的例子,它透過使用V$SYSSTAT檢視來決定何時重新設定PGA_AGGREGATE_TARGET引數。

  以下的查詢可以得到自資料庫例項啟動後work areas被執行的全部數目和百分比。

  work_area.sql

  

  select

  name profile,

  cnt,

  decode(total, 0, 0, round(cnt*100/total)) percentage

  from

  (

  select

  name,

  value cnt,

  (sum(value) over ()) total

  from

  v$sysstat

  where

  name like 'workarea exec%'

  );

  這個查詢的輸出可能如下:

  PROFILE CNT PERCENTAGE

  ----------------------------------- ---------- ----------

  workarea executions - optimal 5395 95

  workarea executions - onepass 284 5

  workarea executions - multipass 0 0

   這個查詢的輸出是用來告訴DBA何時動態調整PGA_AGGREGATE_TARGET引數。在通常的情況下,如果multi-pass的執行大於0, 就需要增加PGA_AGGREGATE_TARGET的值,並且在optimal executions是100%時減少它的值。

  我們還可以使用V$PGASTAT檢視來決定我們的Oracle例項的記憶體使用。V$PGASTAT檢視提供了PGA使用和自動記憶體管理的例項級摘要統計資訊。以下的指令碼提供了全部Oracle9i連線的整體記憶體使用的統計資訊。

  以下是一個用來檢測Oracle9i中PGA記憶體使用的簡單指令碼。

  check_pga.sql

  column name format a30

  column value format 999,999,999

  select

  name,

  value

  from

  v$pgastat

  ;

  The output of this query might look like the following:

  NAME VALUE

  ------------------------------------------------------ ----------

  aggregate PGA auto target 736,052,224

  global memory bound 21,200

  total expected memory 141,144

  total PGA inuse 22,234,736

  total PGA allocated 55,327,872

  maximum PGA allocated 23,970,624

  total PGA used for auto workareas 262,144

  maximum PGA used for auto workareas 7,333,032

  total PGA used for manual workareas 0

  maximum PGA used for manual workareas 0

  estimated PGA memory for optimal 141,395

  maximum PGA memory for optimal 500,123,520

  estimated PGA memory for one-pass 534,144

  maximum PGA memory for one-pass 

  在上面的v$pgastat顯示中我們可以看到以下的統計。

  Aggregate PGA auto target -該列給出了可用於Oracle9i連線的全部記憶體。我們已經提過,這個值是由PGA_AGGREGATE_TARGET設定的。

  Global memory bound -該統計表示work area的最大值,Oracle建議在該統計值下降到1M時,你應該增加PGA_AGGREGATE_TARGET的值。

  Total PGA allocated - 這個統計顯示了資料庫中全部PGA記憶體使用的高水位線。當使用增加時,你應該看到這個值接近PGA_AGGREGATE_TARGET的值。

   Total PGA used for auto workareas - 這個統計監視記憶體的使用或者全部執行在自動記憶體模式中的全部連線。要記住的是,並不是全部的內部程式使用自動記憶體特性。例如,Java和PL/SQL 將分配記憶體,但是這部分將不會統計到這個值中。因此我們可使用整體PGA的值來減去該值,以得到連線和Java and PL/SQL使用的記憶體。

   Estimated PGA memory for optimal/one-pass - 該統計估計optimal模式下執行全部的連線任務所需要的記憶體。要記住的是,如果Oracle9i遇到記憶體不足時,它就會呼叫multi-pass操 作。這個統計對於監視Oracle9i中的記憶體使用是非常重要的,大多數的Oracle DBA將會增加PGA_AGGREGATE_TARGET到這個值。

  現在我們已經瞭解了這個概念,以下就讓我們來看一下自動重新配置SGA有哪些方法。

  總述

  在一個UNIX環境中,在處理需求改變時透過定時任務來修改記憶體配置是非常簡單的。例如,許多Oracle資料庫在一般的工作時間以OLTP模式運作,在晚上的時候則執行對記憶體需求很大的批次報告。

  我們知道在一個OLTP資料庫中應該將DB_CACHE_SIZE設定為一個較大的值,而在需求記憶體很大的批次任務中則需要給PGA_AGGREGATE_TARGET分配額外的記憶體。

   以下的UNIX指令碼可以用來重新設定OLTP和DSS的SGA值而無需將例項停下來。在這個例子中,我們假定有一個孤立的帶有8GB記憶體的的 Oracle伺服器。我們還假定保留20%的記憶體供UNIX使用,而剩下的6GB記憶體則用作Oracle和Oracle連線。這些指令碼是在HP/UX或者 Solaris中使用的,並且接受$ORACLE_SID作為一個引數。

  DSS_CONFIG.KSH指令碼將在每晚的6:00 p.m執行,以重新設定Oracle在晚上執行對記憶體需求很大的批次任務。

  dss_config.ksh

  #!/bin/ksh

  # First, we must set the environment . . . .

  ORACLE_SID=$1

  export ORACLE_SID

  ORACLE_HOME=`cat /etc/oratab|grep ^$ORACLE_SID:|cut -f2 -d':'`

  #ORACLE_HOME=`cat /var/opt/oracle/oratab|grep ^$ORACLE_SID:|cut -f2 -d':'`

  export ORACLE_HOME

  PATH=$ORACLE_HOME/bin:$PATH

  export PATH

  $ORACLE_HOME/bin/sqlplus -s /nologin
  ALTER SYSTEM set db_cache_size=1500m;

  ALTER SYSTEM set shared_pool_size=500m;

  ALTER SYSTEM set pga_aggregate_target=400m;

  exit

  !

  現在我們已經知道了一個常見的方式來修改Oracle的配置,我們也很容易地看到可以很簡單地開發一個技術來連續地監控Oracle的處理需求,並且根據現有的資料庫需求來使用ALTER SYSTEM作修改。

  結論

   雖然Oracle9i中的記憶體管理仍然需要很多的手工操作,不過大部分的Oracle管理員可以使用工具來連續地監控Oracle SGA中的記憶體使用,並且可以根據Oracle instance中現在的使用情況來自動地重新分配記憶體。這樣就可以令Oracle 管理員根據系統的變化來靈活地重新設定他們的系統。
[@more@]

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

相關文章