1. 程式人生 > >(轉)Oracle 11g記憶體分配分析(oracle 11g Memory Allocation Analysis)

(轉)Oracle 11g記憶體分配分析(oracle 11g Memory Allocation Analysis)

開始用oracle11g有一段時間了,一直沒有整理Oracle記憶體方面的特點,尤其是在oracle11g裡面引入了 memory_max_target 和 memory_target之後,有了些新的變化和安排在memory方面;

Oracle對記憶體的管理的優化從未間斷,從8i到11g不斷地提出新的管理概念。每個本版都對記憶體管理進行了簡化:

  1. 8i->9i:PGA的自動管理;
  2. 9i->10g:SGA的自動管理;
  3. 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