關於oracle11G的自動記憶體管理MEMORY_TARGET和MEMORY_MAX_TARGET

531968912發表於2017-04-18
自動記憶體管理是用兩個初始化引數進行配置的:
  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初始化引數。
    在一個系統上啟用自動記憶體管理其實很簡單,不需要事先做太多的事情,可以使用下面的計算公式來計算:           MEMORY_TARGET=SGA_TARGET+GREATEST(PGA_AGGREGATE_TARGET,"maximumPGAallocated");
下面的查詢語句向你展示有關的資訊,以及如何計算出需要的值:
1.SELECT name, value
FROM   v$parameter
WHERE  name IN ('pga_aggregate_target', 'sga_target')
UNION
SELECT 'maximum PGA allocated' AS name, TO_CHAR(value) AS value
FROM   v$pgastat
WHERE  name = 'maximum PGA allocated';
2.SELECT sga.value + GREATEST(pga.value, max_pga.value) AS memory_target
FROM (SELECT TO_NUMBER(value) AS value FROM v$parameter WHERE name = 'sga_target') sga,
     (SELECT TO_NUMBER(value) AS value FROM v$parameter WHERE name = 'pga_aggregate_target') pga,
     (SELECT value FROM v$pgastat WHERE name = 'maximum PGA allocated') max_pga;
    除現有的用於記憶體管理的V$檢視外,Oracle 11g還新增加了下面4個檢視用於自動記憶體管理:
    V$MEMORY_CURRENT_RESIZE_OPS
    V$MEMORY_DYNAMIC_COMPONENTS
    V$MEMORY_RESIZE_OPS
    V$MEMORY_TARGET_ADVICE
    為每個動態元件分配的記憶體大小使用檢視V$MEMORY_DYNAMIC_COMPONENTS顯示:
SELECT  component, current_size, min_size, max_size
FROM    v$memory_dynamic_components
WHERE   current_size != 0;
    V$MEMORY_CURRENT_RESIZE_OPS和V$MEMORY_RESIZE_OPS分別顯示了元件當前改變大小操作的資訊和上一次改變大小操作的資訊。
    V$MEMORY_TARGET_ADVICE提供了幫助調整MEMORY_TARGET引數的資訊,它顯示了一段MEMORY_TARGET設定可用的範圍,根據當前的設定,估算完成當前負載所需要的DB Time值。
    SELECT * FROM v$memory_target_advice ORDER BY memory_size;


下面來看看在11g 中Memory_target 設定和不設定對SGA/PGA 的影響:
如果Memory_target 設定為非0 值
1、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 將根據資料庫執行狀況進行分配大小,但在資料庫啟動是會有一個固定比例來分配:
sga_target =memory_target *60%
pga_aggregate_target=memory_target *40%


如果Memory_target 沒有設定為0 
11g 中預設為0 則初始狀態下取消了Memory_target 的作用,完全和10g 在記憶體管理上一致,完全向下相容。
1、SGA_TARGET設定值
自動調節SGA 中的shared pool,buffer cache,redo log buffer,java pool,larger pool等記憶體空間的大小。PGA 則依賴pga_aggregate_target 的大小。
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 18G
memory_target     big integer 18G
parallel_servers_target     integer 256
pga_aggregate_target     big integer 8G
sga_target     big integer 9G


如果需要監視Memory_target 的狀況則可以使用下面三個動態試圖:
   V$MEMORY_DYNAMIC_COMPONENTS
   V$MEMORY_RESIZE_OPS 
   v$memory_target_advice 

一張能直觀體現10g和11g的自動記憶體管理的引數之間的關係的引數關係圖:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25462274/viewspace-2137450/,如需轉載,請註明出處,否則將追究法律責任。

相關文章