Oracle9i資料庫在內部特性方面有著非常大的增強,其中一個最令Oracle DBA興奮的莫過於可以動態設定全部的Oracle SGA控制參數。與8i不同的是,原來都將初始化參數放到一個文字檔中,並且在資料庫啟動的時候讀取,Oracle9i卻可以通過ALTER DATABASE和ALTER SYSTEM命令複位全部的Oracle參數。
在9i前,如果想對Oracle資料庫的處理模式作一些改變的話,Oracle管理員必須關閉資料庫並且重新設定INIT.ORA檔案中的參數,然後重新啟動資料庫。對於白天使用OLTP模式運作,晚上切換到資料倉儲模式的Oracle資料庫來說,這種重新設定是經常做的。
對於需要停止和重新啟動Oracle資料庫來修改參數來說,Oracle9i在這方面有明顯的加強,它令實現資料庫連續可用的目標變得更加簡單。
這種可以在Oracle SGA中動態增加和縮小不同地區的能力為Oracle資料庫管理員提供了一些令人激動的新特性。SGA每個地區的資料庫活動都可以獨立地被監視,而且也可以在Oracle資料庫中,根據使用的模式分配和取回資源。
我們首先來看以下Oracle9i資料庫和Oracle8i資料庫的一些區別。Oracle9i的一個最重要的加強是對於串連到Oracle資料庫的全部專用連線,都無需要擁有一個獨立的PGA空間。在Oracle8i中,對於專用的Oracle串連,我們都需要在記憶體中分配一個獨立的地區,稱為Program Global Area或者PGA。PGA空間中包含有SORT_AREA_SIZE和額外的RAM控制結構以用來維護串連任務的狀態。在Oracle9i中,PGA空間已經被Oracle SGA中的一個新記憶體空間代替,它是通過PGA_AGGREGATE_TARGET參數來設定的(見圖1)。
*********圖一************
(Oracle8i與Oracle9i在記憶體配置上的區別)
由於全部的記憶體使用量都在Oracle SGA中分配,所以Oracle資料庫管理員可以將分配給Oracle伺服器的記憶體加大,可以分配至直到Orace伺服器全部記憶體的80%。Oracle建議將伺服器其餘的20%記憶體保留給作業系統的任務。
當使用者串連到Oracle9i資料庫時,排序工作所需要的記憶體將會在Oracle9i的PGA_AGGREGATE_TARGET地區中分配。這可以令Oracle9i比Oracle8i跑得更快,這是由於記憶體只在需要的期間才分配,並且在完成後就可以馬上釋放給其它串連的Oracle任務使用。
動態修改SGA地區
由於Oracle管理員現在可以增加和減少SGA的全部地區,因此我們可以快速地查看一下SGA地區是怎樣的,這樣我們就可以知道Oracle DBA如何監視這些地區的使用並且為Oracle資料庫更有效地重新分配記憶體。SGA的地區可以分為以下的部分。
資料緩衝(Data buffers)--Oracle9i擁有多達7個獨立的資料緩衝來儲存磁碟送來的資料區塊。這些包含有傳統的KEEP pool,RECYCLE pool和DEFAULT pool,還有為每個Oracle資料庫支援的塊大小(2K, 4K, 8K, 16K和32K) 而建立的獨立資料緩衝池(見圖2)。
圖2 獨立的Oracle9i資料緩衝
我們可以監視這7個資料緩衝區域的命中率,如果緩衝的命中率保持在百分之九十以上,我們可以減少分配給這些資料緩衝的記憶體,並且將它們重新分配給其它Oracle執行個體中需要額外記憶體的地方。
當資料緩衝的命中率(DBHR)下降時,我們可以將記憶體由一個資料緩衝中分離出來,並且將它重新分配給其它的資料緩衝(3所示)。
圖3 在Oracle9i的資料緩衝之間重新分配記憶體
共用池(Shared pool)--Oracle9i的共用池有一個很重要的作用是分析和執行Oracle SQL語句。低的library cache命中率表示分配給library cache的記憶體不足,當shared pool需要對SQL語句進行大量的分析和執行時,Oracle9i的資料庫管理員可以使用ALTER SYSTEM來為shared pool加入額外的記憶體。
PGA地區--分配給PGA_AGGREGATE_TARGET的記憶體是用來讓Oracle串連維護與串連相關的資訊(例如遊標的狀態),並且對SQL的結果集進行排序。
Log buffer--對於Oracle redo log緩衝是否有大量活動,我們可以在log switch(日誌轉換)的頻率上看出來。Oracle管理員可以監視redo log地區的活動,並且在Oracle資料庫需要額外的記憶體為原始的緩衝區網域服務時,動態地增加記憶體。
現在就讓我們來仔細看以下這些記憶體地區之間是如何作用的。
改變PGA的記憶體配置
當以下的其中一個條件是真時,我們將需要動態地修改PGA_AGGREGATE_TARGET參數。
。當V$SYSSTAT中對"estimated PGA memory for one-pass" 的統計值超出PGA_AGGREGATE_TARGET時,我們就需要增加PGA_AGGREGATE_TARGET的值。
。當V$SYSSTAT中對"workarea executions - multipass" 的統計值超過百分之一時,資料庫將會由更多的記憶體中得到好處
。你可能過高地估計了PGA記憶體的空間,當V$SYSSTAT中"workarea executions - optimal"的值一直是100%時,可以考慮減少PGA_AGGREGATE_TARGET的值。
我們可以通過一個簡單的指令碼來查看shared pool是否需要更多的記憶體。
量度Library Cache的丟失率
set lines 80; set pages 999;column mydate heading 'Yr. Mo Dy Hr.' format a16 column c1 heading "execs" format 9,999,999 column c2 heading "Cache Misses|While Executing" format 9,999,999 column c3 heading "Library Cache|Miss Ratio" format 999.99999 break on mydate skip 2; select to_char(snap_time,'yyyy-mm-dd HH24') mydate, sum(new.pins-old.pins) c1, sum(new.reloads-old.reloads) c2, sum(new.reloads-old.reloads)/ sum(new.pins-old.pins) library_cache_miss_ratio from stats$librarycache old, stats$librarycache new, stats$snapshot sn where new.snap_id = sn.snap_id and old.snap_id = new.snap_id-1 and old.namespace = new.namespace group by to_char(snap_time,'yyyy-mm-dd HH24') ; Cache Misses Yr. Mo Dy Hr. execs While Executing LIBRARY_CACHE_MISS_RATIO ---------------- ---------- --------------- ------------------------ 2001-12-11 10 10,338 3 .00029 2001-12-12 10 182,477 134 .00073 2001-12-14 10 190,707 202 .00106 2001-12-16 10 2,803 11 .00392 |
由上面的例子看到,在每天的9:00AM到10:AM之間,shared pool明顯缺少記憶體。我們就可以在這段期間動態地重新設定shared_pool參數以由db_cache_size中分配額外的記憶體。
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<connect system/manager as sysdba; 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 管理員根據系統的變化來靈活地重新設定他們的系統。