共計 5252 個字符,預計需要花費 14 分鐘才能閱讀完成。
本篇內容主要講解“Oracle 的內存管理方式”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓丸趣 TV 小編來帶大家學習“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 來調節大?。?/p>
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 的內存管理方式”有了更深的了解,不妨來實際操作一番吧!這里是丸趣 TV 網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!