oracle 內存二 SGA

SGA概念

SGA(System Global Area 系統全局區域)是一組包含一個Oracle實例的數據和控制信息的共享內存結構。這句話可以說是SGA的定義。雖然簡單,但其中闡述了SGA幾個很重要的特性:

1、SGA的構成——數據和控制信息

2、SGA是共享的,即當有多個用戶同時登錄了這個實例,SGA中的信息可以被它們同時訪問(當涉及到互斥的問題時,由latch和enquence控制);

3、一個SGA只服務於一個實例,也就是說,當一臺機器上有多個實例運行時,每個實例都有一個自己的SGA,儘管SGA來自於OS的共享內存區,但實例之間不能相互訪問對方的SGA區。

Oracle進程和一個SGA就構成了一個Oracle實例。當實例啓動時,Oracle會自動從系統中分配內存給SGA,而實例關閉時,操作系統會回收這些內存。

 

SGA包含的組件

SGA包含的組件有:

數據緩衝(Buffer Cache)
重做日誌緩衝(Redo Log Buffer)
共享池(Shared Pool)
Java池(Java Pool)
大池(Large Pool)
流池(Streams Pool --- 10g以後纔有)
數據字典緩存(Data Dictionary Cache)
其他信息(如數據庫和實例的狀態信息)

在啓動oracle的時候,會顯示以下信息

SQL> startupORACLE instance started. Total System Global Area 289406976 bytesFixed Size 1248576 bytesVariable Size 117441216 bytesDatabase Buffers 163577856 bytesRedo Buffers 7139328 bytesDatabase mounted.Database opened.

我曾經糾結於fixed size, variable size 到底都是什麼,後來綜合各方面信息,得出以下結論

fixed size : 不必太關心,是oracle自己控制的,我們無法做出太多控制,具體包含了什麼,說不清楚。。。。。。。。。

virable size:  受java pool , share pool , large pool 等等的影響,但還包括其它的一些東西。比如每一個control file都會在virable size這部分佔據一定的空間。 

 

當然,上面的信息並不是只有在數據庫啓動時纔看的到,通過下面的命令一樣可以得到:

SQL> show sgaTotal System Global Area 1068937216 bytesFixed Size 2166536 bytesVariable Size 675283192 bytesDatabase Buffers 377487360 bytesRedo Buffers 14000128 bytesSQL> select * from v$sga;NAME VALUE-------------------- ----------Fixed Size 2166536Variable Size 675283192Database Buffers 377487360Redo Buffers 14000128

關於SGA的幾個參數

MEMORY_TARGET

這個參數是oracle 11g中用來實現SGA,PGA自動管理的。設置了之後,MEMORY_TARGET代表了SGA,PGA一共可以分配的大小,而具體每個組件的大小則要oracle自己調配。

MEMORY_MAX_TARGET

這個參數是MEMORY_TARGET的一共閥值。MEMORY_TARGET的值是可以動態調整的,但是不可以超過這個值。修改這個值需要重啓數據庫。

SGA_TARGET

這個參數設置後會實現自動SGA管理。但是要注意的是,如果MEMORY_TARGET的值也設置了,那麼這個參數的作用就是ORACLE SGA的最小值。

SGA_MAX_TARGET

該參數是SGA_TARGET的閥值(錯誤,不存在這個參數其實,實際上應該是SGA_MAX_SIZE)

SGA_MAX_SIZE

手動SGA管理的時候,這個參數控制着動態調整SGA的時候最多可以給SGA多大內存。

 

PRE_PAGE_SGA

在oracle啓動的時候,只會給各個組件非配最小的,必須的物理內存,其他的內存則作爲虛擬內存非配。只有當進程需要這些內存的時候,纔會把他們touch到物理內存中。通過這個參數可以在oracle啓動的時候指定所有的SGA都作爲物理內存非配。但是這樣啓動會慢些,因爲啓動的時候需要把所有的page都touch到物理內存中。

LOCK_SGA

使用了PRE_PAGE_SGA這個參數,把所有的SGA都touch進內存後,並不能保證這些內存page就不會被交換到虛擬內存中,這時需要LOCK_SGA這個參數把這些page lock在物理內存中。但是有些操作系統不支持內存鎖定,所以這個參數就不好使。

 

關於SGA的重要視圖

V$SGASTAT

這個視圖結構如下:

SQL> desc v$sgastat Name Null? Type ----------------------------------------- -------- ---------------------------- POOL VARCHAR2(12) NAME VARCHAR2(26) BYTES NUMBER
name是內存區域的名字,pool是該內存區域屬於哪個pool,bytes是該內存區域的大小 

例如:

POOL NAME BYTES------------ -------------------------- ----------streams pool msgtree_kgqmctx 64streams pool free memory 4197856streams pool time manager index 64streams pool KGH: NO ACCESS 4177952 

streams pool的  msgtree_kgqmctx內存區域大小爲64.

streams pool的  free_memory內存區域大小爲41978

通過下面的查詢可以查出 shared pool的使用率

SQL> select s.bytes/p.value*100 from v$sgastat s, v$parameter p where s.pool='shared pool' and s.name = 'free memory' and p.name='shared_pool_size';S.BYTES/P.VALUE*100------------------- 43.7007828


V$SGA_DYNAMIC_COMPONENTS

該視圖記錄SGA各個動態內存區的情況,記錄已經完成的,對SGA動態內存區大小的調整

SQL> desc V$SGA_DYNAMIC_COMPONENTS Name Null? Type ----------------- -------- ------------ COMPONENT VARCHAR2(64) CURRENT_SIZE NUMBER MIN_SIZE NUMBER MAX_SIZE NUMBER USER_SPECIFIED_SI NUMBER ZE OPER_COUNT NUMBER LAST_OPER_TYPE VARCHAR2(13) LAST_OPER_MODE VARCHAR2(9) LAST_OPER_TIME DATE GRANULE_SIZE NUMBER
COMPONENT 內存區的名字 

CURRENT_SIZE 當前大小

MIN_SIZE 實力啓動後的最小值

MAX_SIZE 實例啓動後的最大值

USER_SPECIFIED_S IZE用戶在手動管理中指定的大小

OPER_COUNT 實力啓動後調整的次數

LAST_OPER_TYPE 是增加還是減少

LAST_OPER_MODE 是auto還是manual

GRANULE_SIZE 粒度

這個視圖和V$SGASTAT 有什麼區別呢?

1. v$sgastat 的目的是記錄SGA中各個內存區的大小,而不是變化,所以他列舉的非常細,比如shared pool中的各個內存區都列出來

2. oracle內存調整是以各個池爲對象調整,比如shard pool 中sql區需要多少內存,那麼就給shared pool增加多少內存

 

 

 

總結

sga 包括

SQL> show sgaTotal System Global Area 1068937216 bytesFixed Size 2166536 bytesVariable Size 675283192 bytesDatabase Buffers 377487360 bytesRedo Buffers 14000128 bytes
通過池劃分包括 SQL> select distinct(component) from v$sga_dynamic_components order by component;COMPONENT--------------------------------------------------ASM Buffer CacheDEFAULT 16K buffer cacheDEFAULT 2K buffer cacheDEFAULT 32K buffer cacheDEFAULT 4K buffer cacheDEFAULT 8K buffer cacheDEFAULT buffer cacheKEEP buffer cacheRECYCLE buffer cacheShared IO Pooljava poollarge poolshared poolstreams pool14 rows selected.SQL>
不過這裏不包括 redo buffer的信息,不知道是因爲redo buffer 沒有調整過還是就是不包括 

另外v$sgastat也不包括redo和data buffer的信息

SQL> select distinct(pool) from v$sgastat;POOL------------java poolstreams poolshared poollarge pool


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章