(轉)Oracle 11g記憶體分配分析(oracle 11g Memory Allocation Analysis)
開始用oracle11g有一段時間了,一直沒有整理Oracle記憶體方面的特點,尤其是在oracle11g裡面引入了 memory_max_target 和 memory_target之後,有了些新的變化和安排在memory方面;
Oracle對記憶體的管理的優化從未間斷,從8i到11g不斷地提出新的管理概念。每個本版都對記憶體管理進行了簡化:
- 8i->9i:PGA的自動管理;
- 9i->10g:SGA的自動管理;
- 10g->11g:MEMORY(SGA+PGA)的自動管理。
在11g中oracle引入了自動化記憶體管理(Automatic Memory Management)概念,僅用兩個引數就能完成oracle的記憶體管理工作。DBA的工作看來又要輕鬆不少了,看看兩個引數:
MEMORY_TARGET:oracle所能使用的最大記憶體,該引數可以動態調整。
MEMORY_MAX_TARGET:MEMORY_TARGET引數所能動態設定的最大值,不能動態調整,需要重啟資料庫
注:oracle的記憶體管理方式可以根據本版向下相容的,11g可以實現10g,9i,8i時的管理方式。
SQL> select component,current_size,min_size,max_size from v$memory_dynamic_components;
首先來看一個測試例子來了解他的變化和其他的內部memory的互動:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
SQL> show parameter mem;
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
hi_shared_memory_address integer 0
memory_max_target big integer 4G
memory_target big integer 4G
shared_memory_address integer 0
SQL> alter system set memory_target=3000M scope=both;
alter system set memory_target=3000M scope=both
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-00838: Specified value of MEMORY_TARGET is too small, needs to be at least 4016M
*****************************************************************
為什麼這步調整memory_target竟然failed了呢? 我們來看看下面的SGA 和PGA的設定就明白了其中的緣由 ,而且還特別強調了memory_target的value調整的太小,需要至少多少XXX;
SQL> show parameter pga;
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
pga_aggregate_target big integer 1500M
SQL> show parameter sga;
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
lock_sga boolean FALSE
pre_page_sga boolean FALSE
sga_max_size big integer 4G
sga_target big integer 2512M
SQL>
從上面SGA 和 PGA ,它們display出來的memory value可以看到,其實memory_target 直接control的就是它們兩個的總和 。
Memory_Target = SGA_Target + pga_aggregate_target
其中我們知道sga_target 和 pga_aggregate_target ,它們都是動態可以調整的,但是現在調整的時候都要先看看memory_target的limit的value了,否則你調高了,就會給你下面的 Error message:
SQL> alter system set pga_aggregate_target=1510M scope=both;
alter system set pga_aggregate_target=1510M scope=both
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-00840: PGA_AGGREGATE_TARGET cannot be modified to the specified value
***********************************************************************************************************
而對於sga_max_size的設定也不可以不考慮其他的限制,請看下面一個案例,我們看到SGA_MAX_SIZE的突破設定,帶來的啟動報錯 ;
SQL> show parameter sga;
NAME TYPE VALUE
------------------------------------ ---------------------- -----------------------------
lock_sga boolean FALSE
pre_page_sga boolean FALSE
sga_max_size big integer 4G
sga_target big integer 2000M
SQL> show parameter mem;
NAME TYPE VALUE
------------------------------------ ---------------------- -----------------------------
hi_shared_memory_address integer 0
memory_max_target big integer 4G
memory_target big integer 3504M
shared_memory_address integer 0
SQL> alter system set sga_max_size=4200M scope=spfile;
System altered.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORA-00844: Parameter not taking MEMORY_TARGET into account
ORA-00851: SGA_MAX_SIZE 4412407808 cannot be set to more than MEMORY_TARGET 3674210304.
SQL>
我們從報錯的message可以看出來, SGA_MAX_SIZE之前調整的大小(4G)肯定是不行的在DB restart的時候,DB後臺會通過內部計算來發現了這個引數的問題。 所以報了SGA_MAX_SIZE是不允許大於MEMORY_TARGET設定的value的。
所以可以總結一下MEMORY之間互相制約的順序;
memory_max_target==>memory_target===>sga_max_size==>sga_target , 此外, Memory_target還有下面的這個power哦:
Memory_Target = SGA_Target + pga_aggregate_target