文章詳情頁(yè)
Oracle9i的動(dòng)態(tài)SGA特性探索
瀏覽:2日期:2023-11-17 11:36:50
Oracle9i數(shù)據(jù)庫(kù)在內(nèi)部特性方面有著非常大的增強(qiáng),其中一個(gè)最令Oracle DBA興奮的莫過于可以動(dòng)態(tài)設(shè)置全部的Oracle SGA控制參數(shù)。 與8i不同的是,原來(lái)都將初始化參數(shù)放到一個(gè)文本文件中,并且在數(shù)據(jù)庫(kù)啟動(dòng)的時(shí)候讀取,Oracle9i卻可以通過ALTER DATABASE和ALTER SYSTEM命令復(fù)位全部的Oracle參數(shù)。在9i前,假如想對(duì)Oracle數(shù)據(jù)庫(kù)的處理模式作一些改變的話,Oracle治理員必須關(guān)閉數(shù)據(jù)庫(kù)并且重新設(shè)置INIT.ORA文件中的參數(shù),然后重新啟動(dòng)數(shù)據(jù)庫(kù)。對(duì)于白天使用OLTP模式運(yùn)作,晚上切換到數(shù)據(jù)倉(cāng)庫(kù)模式的Oracle數(shù)據(jù)庫(kù)來(lái)說(shuō),這種重新設(shè)置是經(jīng)常做的。對(duì)于需要停止和重新啟動(dòng)Oracle數(shù)據(jù)庫(kù)來(lái)修改參數(shù)來(lái)說(shuō),Oracle9i在這方面有明顯的加強(qiáng),它令實(shí)現(xiàn)數(shù)據(jù)庫(kù)連續(xù)可用的目標(biāo)變得更加簡(jiǎn)單。這種可以在Oracle SGA中動(dòng)態(tài)增加和縮小不同區(qū)域的能力為Oracle數(shù)據(jù)庫(kù)治理員提供了一些令人激動(dòng)的新特性。SGA每個(gè)區(qū)域的數(shù)據(jù)庫(kù)活動(dòng)都可以獨(dú)立地被監(jiān)視,而且也可以在Oracle數(shù)據(jù)庫(kù)中,根據(jù)使用的模式分配和取回資源。我們首先來(lái)看以下Oracle9i數(shù)據(jù)庫(kù)和Oracle8i數(shù)據(jù)庫(kù)的一些區(qū)別。Oracle9i的一個(gè)最重要的加強(qiáng)是對(duì)于連接到Oracle數(shù)據(jù)庫(kù)的全部專用連接,都無(wú)需要擁有一個(gè)獨(dú)立的PGA空間。在Oracle8i中,對(duì)于專用的Oracle連接,我們都需要在內(nèi)存中分配一個(gè)獨(dú)立的區(qū)域,稱為Program Global Area或者PGA。PGA空間中包含有SORT_AREA_SIZE和額外的RAM控制結(jié)構(gòu)以用來(lái)維護(hù)連接任務(wù)的狀態(tài)。在Oracle9i中,PGA空間已經(jīng)被Oracle SGA中的一個(gè)新內(nèi)存空間代替,它是通過PGA_AGGREGATE_TARGET參數(shù)來(lái)設(shè)置的(見圖1)。*********圖一************ (Oracle8i與Oracle9i在內(nèi)存分配上的區(qū)別)由于全部的內(nèi)存使用都在Oracle SGA中分配,所以O(shè)racle數(shù)據(jù)庫(kù)治理員可以將分配給Oracle服務(wù)器的內(nèi)存加大,可以分配至直到Orace服務(wù)器全部?jī)?nèi)存的80%。Oracle建議將服務(wù)器其余的20%內(nèi)存保留給操作系統(tǒng)的任務(wù)。當(dāng)用戶連接到Oracle9i數(shù)據(jù)庫(kù)時(shí),排序工作所需要的內(nèi)存將會(huì)在Oracle9i的PGA_AGGREGATE_TARGET區(qū)域中分配。這可以令Oracle9i比Oracle8i跑得更快,這是由于內(nèi)存只在需要的期間才分配,并且在完成后就可以馬上釋放給其它連接的Oracle任務(wù)使用。動(dòng)態(tài)修改SGA區(qū)域由于Oracle治理員現(xiàn)在可以增加和減少SGA的全部區(qū)域,因此我們可以快速地查看一下SGA區(qū)域是怎樣的,這樣我們就可以知道Oracle DBA如何監(jiān)視這些區(qū)域的使用并且為Oracle數(shù)據(jù)庫(kù)更有效地重新分配內(nèi)存。SGA的區(qū)域可以分為以下的部分。數(shù)據(jù)緩沖(Data buffers)--Oracle9i擁有多達(dá)7個(gè)獨(dú)立的數(shù)據(jù)緩沖來(lái)保存磁盤送來(lái)的數(shù)據(jù)塊。這些包含有傳統(tǒng)的KEEP pool,RECYCLE pool和DEFAULT pool,還有為每個(gè)Oracle數(shù)據(jù)庫(kù)支持的塊大小(2K, 4K, 8K, 16K和32K) 而建立的獨(dú)立數(shù)據(jù)緩沖池(見圖2)。 圖2 獨(dú)立的Oracle9i數(shù)據(jù)緩沖我們可以監(jiān)視這7個(gè)數(shù)據(jù)緩沖區(qū)域的命中率,假如緩沖的命中率保持在百分之九十以上,我們可以減少分配給這些數(shù)據(jù)緩沖的內(nèi)存,并且將它們重新分配給其它Oracle實(shí)例中需要額外內(nèi)存的地方。當(dāng)數(shù)據(jù)緩沖的命中率(DBHR)下降時(shí),我們可以將內(nèi)存由一個(gè)數(shù)據(jù)緩沖中分離出來(lái),并且將它重新分配給其它的數(shù)據(jù)緩沖(如圖3所示)。圖3 在Oracle9i的數(shù)據(jù)緩沖之間重新分配內(nèi)存共享池(Shared pool)--Oracle9i的共享池有一個(gè)很重要的作用是分析和執(zhí)行Oracle SQL語(yǔ)句。低的library cache命中率表示分配給library cache的內(nèi)存不足,當(dāng)shared pool需要對(duì)SQL語(yǔ)句進(jìn)行大量的分析和執(zhí)行時(shí),Oracle9i的數(shù)據(jù)庫(kù)治理員可以使用ALTER SYSTEM來(lái)為shared pool加入額外的內(nèi)存。PGA區(qū)域--分配給PGA_AGGREGATE_TARGET的內(nèi)存是用來(lái)讓Oracle連接維護(hù)與連接相關(guān)的信息(例如游標(biāo)的狀態(tài)),并且對(duì)SQL的結(jié)果集進(jìn)行排序。Log buffer--對(duì)于Oracle redo log緩沖是否有大量活動(dòng),我們可以在log switch(日志轉(zhuǎn)換)的頻率上看出來(lái)。Oracle治理員可以監(jiān)視r(shí)edo log區(qū)域的活動(dòng),并且在Oracle數(shù)據(jù)庫(kù)需要額外的內(nèi)存為原始的緩沖區(qū)域服務(wù)時(shí),動(dòng)態(tài)地增加內(nèi)存。現(xiàn)在就讓我們來(lái)仔細(xì)看以下這些內(nèi)存區(qū)域之間是如何作用的。改變PGA的內(nèi)存分配當(dāng)以下的其中一個(gè)條件是真時(shí),我們將需要?jiǎng)討B(tài)地修改PGA_AGGREGATE_TARGET參數(shù)。。當(dāng)V$SYSSTAT中對(duì)'estimated PGA memory for one-pass' 的統(tǒng)計(jì)值超出PGA_AGGREGATE_TARGET時(shí),我們就需要增加PGA_AGGREGATE_TARGET的值。。當(dāng)V$SYSSTAT中對(duì)'workarea executions - multipass' 的統(tǒng)計(jì)值超過百分之一時(shí),數(shù)據(jù)庫(kù)將會(huì)由更多的內(nèi)存中得到好處。 你可能過高地估計(jì)了PGA內(nèi)存的空間,當(dāng)V$SYSSTAT中'workarea executions - optimal'的值一直是100%時(shí),可以考慮減少PGA_AGGREGATE_TARGET的值。我們可以通過一個(gè)簡(jiǎn)單的腳本來(lái)查看shared pool是否需要更多的內(nèi)存。量度Library Cache的丟失率set lines 80;set pages 999;column mydate heading 'Yr. Mo Dy Hr.' format a16column c1 heading 'execs' format 9,999,999column c2 heading 'Cache MissesWhile Executing' format 9,999,999column c3 heading 'Library CacheMiss Ratio' format 999.99999break 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_ratiofrom stats$librarycache old,stats$librarycache new,stats$snapshot snwherenew.snap_id = sn.snap_idandold.snap_id = new.snap_id-1andold.namespace = new.namespacegroup byto_char(snap_time,'yyyy-mm-dd HH24')Cache MissesYr. Mo Dy Hr. execs While Executing LIBRARY_CACHE_MISS_RATIO---------------- ---------- --------------- ------------------------2001-12-11 10 10,338 3 .000292001-12-12 10 182,477 134 .000732001-12-14 10 190,707 202 .001062001-12-16 10 2,803 11 .00392由上面的例子看到,在天天的9:00AM到10:AM之間,shared pool明顯缺少內(nèi)存。我們就可以在這段期間動(dòng)態(tài)地重新設(shè)置shared_pool參數(shù)以由db_cache_size中分配額外的內(nèi)存。SGA的閥值摘要由下面的表一可以看到,在監(jiān)視SGA的內(nèi)存使用時(shí),有幾個(gè)明顯的閥值可以利用。我們可以寫一些腳本并在其中集成一些智能,這樣就可以在處理的需求變化時(shí)重新設(shè)置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內(nèi)存區(qū)域的負(fù)載Oracle9i使用了一些新的內(nèi)部視圖或者在現(xiàn)有的視圖中加入新的列來(lái)幫助查看Oracle9i中的內(nèi)部?jī)?nèi)存分配情況。以下的新V$視圖可以幫助監(jiān)視Oracle9i連接的內(nèi)存使用。V$PROCESS -在Oracle9i中加入了三個(gè)新的列以監(jiān)視PGA內(nèi)存的使用,新列的名字是pga_used_mem, pga_alloc_mem 和pga_max_mem。V$SYSSTAT -加入了很多新的統(tǒng)計(jì)行,包括有area statistics for optimal, one-pass和multi-pass。V$PGASTAT -該新視圖展示了全部后臺(tái)進(jìn)程和專用連接的PGA內(nèi)存使用V$SQL_PLAN--這個(gè)新視圖包含了全部當(dāng)前執(zhí)行的SQL的執(zhí)行計(jì)劃信息。對(duì)于需要最優(yōu)化的SQL語(yǔ)句的性能調(diào)整專家來(lái)說(shuō)這是非常吸引人的。V$WORKAREA -這個(gè)新視圖提供了Oracle9i連接的累積內(nèi)存統(tǒng)計(jì)的具體信息。V$WORKAREA_ACTIVE - 這個(gè)新的視圖提供了當(dāng)前全部正在執(zhí)行的SQL語(yǔ)句的內(nèi)部?jī)?nèi)存使用信息。它們的目的是通過這些V$視圖來(lái)監(jiān)視SGA中的內(nèi)存使用,然后根據(jù)Oracle實(shí)例的處理要求,通過ALTER SYSTEM命令重新分配內(nèi)存。我們以下來(lái)看一些這些新的Oracle9i特性和腳本,它可以幫助我們查看具體的內(nèi)存使用。當(dāng)然我們不可能在這里詳述所有的技術(shù),以下就讓我們看一個(gè)簡(jiǎn)單的例子,它通過使用V$SYSSTAT視圖來(lái)決定何時(shí)重新設(shè)置PGA_AGGREGATE_TARGET參數(shù)。以下的查詢可以得到自數(shù)據(jù)庫(kù)實(shí)例啟動(dòng)后work areas被執(zhí)行的全部數(shù)目和百分比。work_area.sqlselectname profile, cnt, decode(total, 0, 0, round(cnt*100/total)) percentagefrom (select name, value cnt, (sum(value) over ()) totalfromv$sysstat wherename like 'workarea exec%');這個(gè)查詢的輸出可能如下:PROFILE CNT PERCENTAGE----------------------------------- ---------- ----------workarea executions - optimal 5395 95workarea executions - onepass 284 5workarea executions - multipass 0 0這個(gè)查詢的輸出是用來(lái)告訴DBA何時(shí)動(dòng)態(tài)調(diào)整PGA_AGGREGATE_TARGET參數(shù)。 在通常的情況下,假如multi-pass的執(zhí)行大于0,就需要增加PGA_AGGREGATE_TARGET的值,并且在optimal executions是100%時(shí)減少它的值。我們還可以使用V$PGASTAT視圖來(lái)決定我們的Oracle實(shí)例的內(nèi)存使用。V$PGASTAT視圖提供了PGA使用和自動(dòng)內(nèi)存治理的實(shí)例級(jí)摘要統(tǒng)計(jì)信息。以下的腳本提供了全部Oracle9i連接的整體內(nèi)存使用的統(tǒng)計(jì)信息。以下是一個(gè)用來(lái)檢測(cè)Oracle9i中PGA內(nèi)存使用的簡(jiǎn)單腳本。check_pga.sqlcolumn name format a30column value format 999,999,999selectname, value fromv$pgastatThe output of this query might look like the following: NAME VALUE ------------------------------------------------------ ----------aggregate PGA auto target 736,052,224global memory bound 21,200total eXPected memory 141,144total PGA inuse 22,234,736total PGA allocated 55,327,872maximum PGA allocated 23,970,624total PGA used for auto workareas 262,144maximum PGA used for auto workareas 7,333,032total PGA used for manual workareas 0maximum PGA used for manual workareas 0estimated PGA memory for optimal 141,395maximum PGA memory for optimal 500,123,520estimated PGA memory for one-pass 534,144maximum PGA memory for one-pass 在上面的v$pgastat顯示中我們可以看到以下的統(tǒng)計(jì)。Aggregate PGA auto target -該列給出了可用于Oracle9i連接的全部?jī)?nèi)存。我們已經(jīng)提過,這個(gè)值是由PGA_AGGREGATE_TARGET設(shè)置的。Global memory bound -該統(tǒng)計(jì)表示work area的最大值,Oracle建議在該統(tǒng)計(jì)值下降到1M時(shí),你應(yīng)該增加PGA_AGGREGATE_TARGET的值。Total PGA allocated - 這個(gè)統(tǒng)計(jì)顯示了數(shù)據(jù)庫(kù)中全部PGA內(nèi)存使用的高水位線。當(dāng)使用增加時(shí),你應(yīng)該看到這個(gè)值接近PGA_AGGREGATE_TARGET的值。Total PGA used for auto workareas - 這個(gè)統(tǒng)計(jì)監(jiān)視內(nèi)存的使用或者全部運(yùn)行在自動(dòng)內(nèi)存模式中的全部連接。要記住的是,并不是全部的內(nèi)部進(jìn)程使用自動(dòng)內(nèi)存特性。例如,Java和PL/SQL 將分配內(nèi)存,但是這部分將不會(huì)統(tǒng)計(jì)到這個(gè)值中。因此我們可使用整體PGA的值來(lái)減去該值,以得到連接和Java and PL/SQL使用的內(nèi)存。Estimated PGA memory for optimal/one-pass - 該統(tǒng)計(jì)估計(jì)optimal模式下執(zhí)行全部的連接任務(wù)所需要的內(nèi)存。要記住的是,假如Oracle9i碰到內(nèi)存不足時(shí),它就會(huì)調(diào)用multi-pass操作。這個(gè)統(tǒng)計(jì)對(duì)于監(jiān)視Oracle9i中的內(nèi)存使用是非常重要的,大多數(shù)的Oracle DBA將會(huì)增加PGA_AGGREGATE_TARGET到這個(gè)值。現(xiàn)在我們已經(jīng)了解了這個(gè)概念,以下就讓我們來(lái)看一下自動(dòng)重新配置SGA有哪些方法。總述在一個(gè)UNIX環(huán)境中,在處理需求改變時(shí)通過定時(shí)任務(wù)來(lái)修改內(nèi)存配置是非常簡(jiǎn)單的。例如,許多Oracle數(shù)據(jù)庫(kù)在一般的工作時(shí)間以O(shè)LTP模式運(yùn)作,在晚上的時(shí)候則運(yùn)行對(duì)內(nèi)存需求很大的批量報(bào)告。我們知道在一個(gè)OLTP數(shù)據(jù)庫(kù)中應(yīng)該將DB_CACHE_SIZE設(shè)置為一個(gè)較大的值,而在需求內(nèi)存很大的批量任務(wù)中則需要給PGA_AGGREGATE_TARGET分配額外的內(nèi)存。以下的UNIX腳本可以用來(lái)重新設(shè)置OLTP和DSS的SGA值而無(wú)需將實(shí)例停下來(lái)。在這個(gè)例子中,我們假定有一個(gè)孤立的帶有8GB內(nèi)存的的Oracle服務(wù)器。我們還假定保留20%的內(nèi)存供UNIX使用,而剩下的6GB內(nèi)存則用作Oracle和Oracle連接。這些腳本是在HP/UX或者Solaris中使用的,并且接受$ORACLE_SID作為一個(gè)參數(shù)。DSS_CONFIG.KSH腳本將在每晚的6:00 p.m運(yùn)行,以重新設(shè)置Oracle在晚上運(yùn)行對(duì)內(nèi)存需求很大的批量任務(wù)。dss_config.ksh#!/bin/ksh# First, we must set the environment . . . .ORACLE_SID=$1export ORACLE_SIDORACLE_HOME=`cat /etc/oratabgrep ^$ORACLE_SID:cut -f2 -d':'`#ORACLE_HOME=`cat /var/opt/oracle/oratabgrep ^$ORACLE_SID:cut -f2 -d':'`export ORACLE_HOMEPATH=$ORACLE_HOME/bin:$PATHexport 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!現(xiàn)在我們已經(jīng)知道了一個(gè)常見的方式來(lái)修改Oracle的配置,我們也很輕易地看到可以很簡(jiǎn)單地開發(fā)一個(gè)技術(shù)來(lái)連續(xù)地監(jiān)控Oracle的處理需求,并且根據(jù)現(xiàn)有的數(shù)據(jù)庫(kù)需求來(lái)使用ALTER SYSTEM作修改。 結(jié)論雖然Oracle9i中的內(nèi)存治理仍然需要很多的手工操作,不過大部分的Oracle治理員可以使用工具來(lái)連續(xù)地監(jiān)控Oracle SGA中的內(nèi)存使用,并且可以根據(jù)Oracle instance中現(xiàn)在的使用情況來(lái)自動(dòng)地重新分配內(nèi)存。這樣就可以令Oracle 治理員根據(jù)系統(tǒng)的變化來(lái)靈活地重新設(shè)置他們的系統(tǒng)。
標(biāo)簽:
Oracle
數(shù)據(jù)庫(kù)
排行榜
