您好,登錄后才能下訂單哦!
本篇內容主要講解“Oracle的內存管理方式”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Oracle的內存管理方式”吧!
Oracle 內存管理方式
oracle11g新出參數MEMORY_MAX_TARGET 和 MEMORY_TARGET進行自動管理PGA 和SGA 稱之為 自動化內存管理(Automatic Memory Management,AMM。
MEMORY_MAX_TARGET :MEMORY_TARGET所能設定的最大值。非動態可調。
MEMORY_TARGET :操作系統上 Oracle 所能使用的最大內存值。動態參數,MEMORY_TARGET 是PAG 和SGA的總和。memory_target 為 0 是手動管理,非0為自動管理。
如果指定了memory_target 而沒有指定memory_max_target 重啟后,memory_max_target 和memory_target 大小相等;
如果指定了memory_max_target 而沒有指定 memory_target重啟后memory_target 為0;
當設置 memory_max_target < memory_target 時,則重啟后報錯(ORA-00837: Specified value of MEMORY_TARGET greater than MEMORY_MAX_TARGET)
sga_max_size : sga_max_size 是sga的最大值 。
sga_target : sga_target 是自動和手段管理; sga_target 為0 是手動管理,非0 是自動管理
oracle 11g 引入參數mymory_max_target 和memory_target 就是oracle的新特性自動內存管理,AMM 的引入, 組合出來有 5 種內存管理形式.如下:
自動內存管理(AMM): memory_target=非0,是自動內存管理 ,如果初始化參數 LOCK_SGA = true ,則 AMM 是不可用的。
自動共享內存管理(ASMM): 在memory_target=0 and sga_target=非0 是自動內存管理
手工共享內存管理: memory_target=0 and sga_target=0 指定 share_pool_size 、db_cache_size 等 sga 參數
自動 PGA 管理: memory_target=0 and workarea_size_policy=auto and PGA_AGGREGATE_TARGET=值
手動 PGA 管理: memory_target=0 and workarea_size_policy=manal 然后指定 SORT_AREA_SIZE 等 PGA 參數,一般不使用手動管理PGA;
=========================================================================
racle的內存分為兩個部分。一個是SGA(system global area),一個是PGA(program global area)。所謂的內存管理,就是對這兩部分區域進行管理。oracle的內存管理經理了如下發展:
oracle 9i PGA自動管理,SGA手動管理
oracle10g PGA自動管理,SGA自動管理
oracle11g PGA,SGA統一自動管理
先看9i時期的PGA自動管理,SGA手動管理
這時期PGA管理有兩個選擇,手動和自動。
手動時,設置WORKAREA_SIZE_POLICY為MANUAL, 設置各種*_AREA_SIZE的值比如SORT_AREA_SIZE_HASH_AREA_SIZE就可以實現手動PGA管理。
自動時,設置WORKAREA_SIZE_POLICY為AUTO,設置PGA_AGGREAGATE_TARGET的值,則為自動PGA管理。
這時期SGA的管理只可以手動管理,但是相比之前有了進步,可以動態的管理。
再看10g時期的PGA自動管理,SGA自動管理
這時期PGA和9i一樣,都可以手動和自動。
這時期的SGA則有了進步,可以手動管理,也增加了自動管理的選擇。
設置SGA_TARGET,就可以實現自動SGA管理。
現在看11g時期的PGA,SGA統一自動管理
這時期的內存管理向前兼容。
PGA可以手動,自動管理
SGAK也可以手動,自動管理
但是有了一個更方便的特性,就是把PGA,SGA的自動整合到一起,通過MEMORY_TARGET來管理。 這時有了兩個參數MEMORY_TARGET,MEMORY_MAX_TARGET.有了這兩個參數,就可以把PGA,SGA作為一個整體管理。
有一些要注意的地方:
1.如果設置了MEMORY_TARGET的同時還設置了SGA_TARGET,PGA_TARGET 怎么辦呢?這時候,SGA_TARGET和PGA_TARGET的值如果小于MEMORY_TARGET,那么oracle就會把他們作為SGA,和PGA的最小值,如果他們比MEMORY_TARGET還大,那么oracle就會報錯。
2.PGA是跟每一個oracle server 進程相關的,所以WORKAREA_SIZE_POLICY應該是可以設置在session級別,也可以設置在system級別。
3. 幾個視圖比較有用,V$MEMORY_DYNAMIC_COMPONENTS會展示動態調整的內存組件大小。 V$MEMORY_RESIZE_OPS展示了最近的800條SGA調整記錄。
=========================================================================
Oracle 9i引入pga_aggregate_target,可以自動對PGA進行調整;
Oracle 10g引入sga_target,可以自動對SGA進行調整;
Oracle 11g則對這兩部分進行綜合,引入memory_target,可以自動調整所有的內存,這就是新引入的自動內存管理特性。
自動內存管理是用兩個初始化參數進行配置的:
MEMORY_TARGET:動態控制SGA和PGA時,Oracle總共可以使用的共享內存大小,這個參數是動態的,因此提供給Oracle的內存總量是可以動態增大,也可以動態減小的。它不能超過MEMORY_MAX_TARGET參數設置的大小。默認值是0。
MEMORY_MAX_TARGET:這個參數定義了MEMORY_TARGET最大可以達到而不用重啟實例的值,如果沒有設置MEMORY_MAX_TARGET值,默認等于MEMORY_TARGET的值。使用動態內存管理時,SGA_TARGET和PGA_AGGREGATE_TARGET代表它們各自內存區域的最小設置,要讓Oracle完全控制內存管理,這兩個參數應該設置為0。
memory_max_target是一個非動態參數,不能在memory范圍動態改變,只能通過指明 scope=spfile這個條件來達到數據庫在下次啟動后讓改變生效的目的。但是memory_target這個參數是可以動態調節的...也就是說不需要重新啟動DB,就可以讓其生效。
MEMORY_MAX_TARGET 是設定Oracle能占OS多大的內存空間;SGA_MAX_SIZE是Oracle SGA 區最大能占多大內存空間. 、
10g 的sga_max_size 是動態分配 Shared Pool Size,database buffer cache,large pool,java pool,redo log buffer 大小的,是根據Oracle 運行狀況來重新分配SGA 各內存塊的大小。PGA在10g中需要單獨設定。
11g MEMORY_MAX_TARGET 參數包含SGA和PGA兩部分。
在手動創建數據庫時,只需要在創建數據庫之前設置合適的MEMORY_TARGET和MEMORY_MAX_TARGET初始化參數。
下面來看看在11g 中Memory_target 設置和不設置對SGA/PGA 的影響:
A :如果 Memory_target 設置為非 0 值
(下面有四種情況來對 SGA 和 PGA 的大小進行分配)
1 : sga_target 和 pga_aggregate_target 已經設置大小如果 Oracle 中已經設置了參數 sga_target 和 pga_aggregate_target ,則這兩個參數將各自被分配為 最小值最為它們的目標值。
Memory_Target =SGA_TARGET+PGA_AGGREGATE_TARGET ,大小和memory_max_size 一致。
2 : sga_target 設置大小, pga_aggregate_target 沒有設置大小
那么 pga_aggregate_target 初始化值 =memory_target-sga_target
3 : sga_target 沒有設置大小, pga_aggregate_target 設置大小
那么 sga_target 初始化值 =memory_target-pga_aggregate_target
4 : sga_target 和 pga_aggregate_target 都沒有設置大小 Oracle 11g中對這種 sga_target 和 pga_aggregate_target 都沒有設定大小的情況下, Oracle 將對這兩個值沒有最小值和默認值。 Oracle 將根據數據庫 運行狀況進行分配大小。 但在數據庫啟動是會有一個固定比例來分配:
sga_target =memory_target *60%
pga_aggregate_target=memory_target *40%
B :如果 Memory_target 沒有設置或 =0 (在 11g 中默認為 0 )
11g中默認為 0 則初始狀態下取消了 Memory_target 的作用,完全和 10g 在內存管理上一致,完全向下兼容。
(也有三種情況來對 SGA 和 PGA 的大小進行分配)
1 : SGA_TARGET 設置值,則自動調節 SGA 中的 shared pool,buffer cache,redo log buffer,java pool,larger pool等內存空間的大小。 PGA 則依賴 pga_aggregate_target 的大小。 sga 和 pga 不能自動增長和自動縮小。
2 : SGA_target 和 PGA_AGGREGATE_TARGET 都沒有設置
SGA 中的各組件大小都要明確設定,不能自動調整各組建大小。 PGA 不能自動增長和收縮。
3 : MEMORY_MAX_TARGET 設置 而 MEMORY_TARGET =0 這種情況先和 10g 一樣,不做說明
在11g 中可以使用下面看各組件的值
SQL> show parameter target
NAME TYPE VALUE
------------------------ ----------- ---------------------
archive_lag_target integer 0
db_flashback_retention_target integer 1440
fast_start_io_target integer 0
fast_start_mttr_target integer 0
memory_max_target big integer 1024M
memory_target big integer 1024M
pga_aggregate_target big integer 0
sga_target big integer 0
如果需要監視 Memory_target 的狀況則可以使用下面三個動態試圖:
V$MEMORY_DYNAMIC_COMPONENTS
V$MEMORY_RESIZE_OPS
v$memory_target_advice
使用下面 Command 來調節大小:
SQL>ALTER SYSTEM SET MEMORY_MAX_TARGET = 1024M SCOPE = SPFILE;
SQL>ALTER SYSTEM SET MEMORY_TARGET = 1024M SCOPE = SPFILE;
SQL>ALTER SYSTEM SET SGA_TARGET =0 SCOPE = SPFILE;
SQL>ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 0 SCOPE = SPFILE ;
到此,相信大家對“Oracle的內存管理方式”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。