1 概述 Oracle SGA區(qū)的監(jiān)控和管理,是數(shù)據庫日常維護的重要內容。本文詳細介紹SGA的基本概念,SGA運行情況檢查,以及SGA的參數(shù)設置原則,希望對大家的有所幫助。 2 SGA的基本概念 當啟動Oracle數(shù)據庫時,系統(tǒng)會先在內存內規(guī)劃一個固定區(qū)域,用來儲存用戶需要的數(shù)據,以及Oracle運行時必備的系統(tǒng)信息。我們稱此區(qū)域為系統(tǒng)全局區(qū)(System Global Area),簡稱SGA。 SGA 包含數(shù)個重要區(qū)域,分別是: ■ Database Buffer Cache (數(shù)據庫緩沖區(qū)) ■ Redo Log Buffer (重做日志緩沖區(qū)) ■ Shared Pool (共享區(qū)) ■ 其它,如Java pool, Large pool 2.1 Database Buffer Cache (數(shù)據庫緩沖區(qū)) 數(shù)據庫緩沖區(qū)的作用主要是在內存中緩存從數(shù)據庫中讀取的數(shù)據塊。數(shù)據庫緩沖區(qū)越大,為用戶已經在內存里的共享數(shù)據提供的內存就越大,這樣可以減少所需要的磁盤物理讀。 在9i以前數(shù)據庫緩沖區(qū)的大小是由db_block_buffers*db_block_size 來決定大小的。db_block_size參數(shù)是在創(chuàng)建數(shù)據庫時設置的,OLTP系統(tǒng)的db_block_size一般設置為8k。 在9i中,數(shù)據庫緩沖區(qū)的大小由db_cache_size決定,8i中的db_block_buffers被取消。db_cache_size的單位是字節(jié),它直接決定了數(shù)據庫緩沖區(qū)的大小,而不再是塊的數(shù)量。 2.2 Shared Pool (共享區(qū)) 共享區(qū)由三部分組成,分別是Dictionary cache(包括數(shù)據字典的定義,如表結構、權限等),Library cache(包括共享的sql游標,sql原代碼以及執(zhí)行計劃、存儲過程和會話信息)和Control structure。它的大小由初始化參數(shù)shared_pool_size控制,它的作用是緩存已經被解析過的SQL,使其能被重用,不用再解析。SQL的解析非常消耗CPU的資源,如果一條SQL在Shared pool中已經存在,則進行的僅是軟解析(在Shared pool中尋找相同SQL),這將大大提高數(shù)據庫的運行效率。當然,這部分內存也并非越大越好,太大的Shared pool,oracle為了維護共享結構,將付出更大的管理開銷。建議在150M-500M之間。如果系統(tǒng)內存為1G,該值可設為150M-200M;如果為2G,該值設為250M-300M;每增加1G內存,該值增加100M;但該值最大不應超過500M。 2.3 Redo Log Buffer (重做日志緩沖區(qū)) Log_buffer是重做日志緩沖區(qū),對數(shù)據庫的任何修改都按順序被記錄在該緩沖,然后由LGWR 進程將它寫入磁盤。LGWR的寫入條件是:用戶提交、有1/3 重做日志緩沖區(qū)未被寫入磁盤、有大于1M 重做日志緩沖區(qū)未被寫入磁盤、超時、DBWR需要寫入的數(shù)據的SCN 號大于LGWR 記錄的SCN 號,DBWR 觸發(fā)LGWR寫入。 從中可以看出,大于1M的log buffer值意義并不大。重做日志緩沖區(qū)的大小由初始化參數(shù)log_buffer設定。
文章轉載自網管網:http://www./pdb/oracle/200904/160360.html 2.4 Large pool和Java pool
Large pool:用于MTS、并行查詢和RMAN。如果使用了MTS或RMAN,large_pool特別有用,它可以降低用戶對share pool的爭用。
如果應用系統(tǒng)不使用MTS,也不使用RMAN,large_pool_size的大小可設為1M。
Java pool:Oracle8I以后,oracle數(shù)據庫內置了對java的支持,如果數(shù)據庫安裝時選擇了JServer組件,則這個值可以設置為20M-30M之間??梢圆樵僾$option動態(tài)視圖,如果java那一項值為true,則表示安裝了JServer,為false,表示未安裝。
如果應用系統(tǒng)不使用PORTAL,APPS,也不使用RMAN,Java pool值的大小可設為1M。如果系統(tǒng)需要安裝補丁,建議先把Java pool值的大小臨時增加到50-150M。
3 SGA運行情況檢查
3.1 SGA整體檢查
對于SGA部分,我們通過sqlplus查詢:
SQL> show sga
Total System Global Area 316899848 bytes Fixed Size 741896 bytes
Variable Size 150994944 bytes
Database Buffers 163840000 bytes
Redo Buffers 1323008 bytes
或者 SQL> select * from v$sga;
NAME VALUE -------------------- ----------
Fixed Size 741896
Variable Size 150994944
Database Buffers 163840000
Redo Buffers 1323008
Show sga的結果和SGA的初始化參數(shù)配置并不是完全一一對應的,下面是每一個部分的具體解釋: Fixed Size
oracle 的不同平臺和不同版本下可能不一樣,但對于確定環(huán)境是一個固定的值,里面存儲了SGA各部分組件的信息,可以看作引導建立SGA的區(qū)域。
Variable Size
包含了shared_pool_size、java_pool_size、large_pool_size等內存設置和用于管理數(shù)據緩沖區(qū)等內存結構的hash table、塊頭信息等。
Database Buffers
指數(shù)據緩沖區(qū),在8i中包含default pool、buffer_pool_keep、buffer_pool_recycle三部分內存。在9i中包含db_cache_size、db_keep_cache_size、db_recycle_cache_size、db_nk_cache_size。這里要注意在8i中三部分內存總和為db_block_buffers*db_block_size。
Redo Buffers
指重做日志緩沖區(qū)的實際大小,和log_buffer的值可能稍有不同。
3.2 Data buffer 命中率檢查
檢查語句:
SQL>select 1 - (phy.value / (cur.value + con.value)) "HIT RATIO"
from v$sysstat cur, v$sysstat con, v$sysstat phy where cur.name = 'db block gets' and con.name = 'consistent gets'
and phy.name = 'physical reads';
調整原則: 命中率不應該低于90%.
如果該值過低,應該調高初始化參數(shù)。8i調整db_block_buffer,9i調整db_cache_size。
3.3 Dictionary cache命中率檢查
檢查語句:
SQL>SELECT 1 - (SUM(getmisses)/SUM(gets)) "Data Dictionary Hit Ratio" FROM v$rowcache;
調整原則: 命中率不應該低于95%.
如果該值過低,應調高shared_pool_size的大小。
3.4 Library cache命中率檢查
檢查語句:
SQL>SELECT 1-(SUM(reloads)/SUM(pins)) "Library cache Hit Ratio" FROM v$librarycache;
調整原則: 命中率不應該低于99%.
如果該值過低,應調高shared_pool_size的大小。
3.5 Log buffer命中率檢查
檢查語句:
命中率不應該高于1. 如果該值過高,應調高log_buffer的大小。 4 SGA 的參數(shù)設置原則 在 Oracle8i 時,SGA 的大小是由初始化參數(shù)文件內的某些參數(shù)所設定,最麻煩的是每次調整參數(shù)之后必須等重新激活數(shù)據庫才生效。從Oracle9i 開始,DBA 可以動態(tài)配置內存的大小;這樣的技術我們稱為「dynamicSGA」。有了dynamic SGA ,SGA的各組成區(qū)域都可以動態(tài)地進行規(guī)劃與調整,而不需先關閉數(shù)據庫。 在Oracle9i中,SGA_MAX_SIZE可設定 SGA 所占用的最大內存空間。需要注意的是:SGA_MAX_SIZE 盡量不要超過物理內存大小,否則將會使用到硬盤上的虛擬內存,反而導致性能低下。如果 SGA_MAX_SIZE 之設定值小于其它 SGA 相關參數(shù)設定值的總和,或是小于各相關參數(shù)默認值的總和,則 SGA_MAX_SIZE 之設定值無效。 在SGA的基本概念部分,已經介紹了各個部分大小設置的原則,這里再用一句話來總結: 1)數(shù)據庫緩沖區(qū)建議占物理內存的20%-30%。物理內存在1G以內,可以占20%,1G-2G之間可占25%,物理內存在2G以上,可以占30%,甚至更高。 2)共享區(qū)建議在150M-500M之間。如果系統(tǒng)內存為1G,該值可設為150M-200M;如果為2G,該值設為250M-300M;每增加1G內存,該值增加100M;但該值最大不應超過500M。 3)重做日志緩沖區(qū)建議設為1M。 4)如果應用系統(tǒng)不使用MTS,也不使用RMAN,Large pool的大小可設為1M。否則設為16M。 5)如果應用系統(tǒng)不使用RMAN,Java pool值的大小可設為1M。否則設為50M。如果系統(tǒng)需要安裝補丁,建議先把Java pool值的大小臨時增加到50-150M。 調整完上述參數(shù)后,一定要計算SGA的尺寸,總原則是SGA的尺寸應小于物理內存的一半。SGA的計算方法如下:SGA=DB_BLOCK_BUFFERS*DB_BLOCK_SIZE+SHARED_POOL_SIZE+LOG_BUFFER。同時還要保證(SGA+sort_area_size*sesson數(shù)量)不大于物理內存的70%。 |
|