AMM與ASMM

yhou31發表於2015-04-13

一、AMM相關知識:
1.從oracle 11.1開始oracle提供了透過MEMORY_TARGET引數實現自動SGA和PGA自動管理的功能,從此版本開始不再需要明確設定SGA_TARGET及PGA_AGGREGATE_TARGET,這個被支援在linux、windows、solaris、hpux、aix。
2.在使用MEMORY_TARGET引數的linux機器上,在oracle啟動時遇到ORA-00845是由於/dev/shm的大小小於memory_target所致(df -k /dev/shm),如果設定memory_max_target>memory_target,則需要確保/dev/shm至少memory_max_target
3.從11.1.0.6.0開始ASM例項預設實現自動管理SGA及PGA,(禁用ASM例項的自動記憶體管理,必須手動設定memory_target到0,DBCA介面將不支援此更改,這個bug被修正在11.1.0.7.0)
4.10.1版本之前shared pool在SGA中分配的大小=shared_pool_size+內部SGA的開銷,此開銷被用來維護SGA中各元件的狀態,從10.1開始shared_pool_size將包括內部SGA的開銷
5.在手動記憶體管理模式下,由於shared_pool_size太小不足以容納內部SGA開銷將導致ORA-00371
6.在非windows32位的作業系統上SGA_MAX_SIZE預設被設定為memory_target和memory_max_target中的最大值,在windows32作業系統上sga_max_size=60%memory_target+60%memory_max_target+25%可用虛擬地址空間
7.當lock_sga初始化引數被設定為true時將不能啟用自動記憶體管理

二、啟用、配置AMM:
SQL>show parameter lock_sga  ------確保lock_sga為false
SQL>show parameter target  ------確定當前SGA_TARGET及PGA_AGGREGATE_TARGET的值
SQL>select value from v$pgastat where name='maximum PGA allocated'; ---確定從上次啟動DB後的最大例項的PGA
memory_target = sga_target + max(pga_aggregate_target, maximum PGA allocated)
為MEMORY_MAX_TARGET確定一個儘可能大的值,等於或大於SGA_TARGET
當DB使用spfile時:ALTER SYSTEM SET MEMORY_MAX_TARGET = nM SCOPE = SPFILE;  當DB使用pfile時:編輯pfile設定memory_max_target = nM  memory_target = mM
關閉並重啟DB
ALTER SYSTEM SET MEMORY_TARGET = nM;  ALTER SYSTEM SET SGA_TARGET = 0;  ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 0;
-------!!!如果你在pfile中設定了MEMORY_TARGET沒有設定MEMORY_MAX_TARGET,則資料庫自動設定MEMORY_MAX_TARGET值為MEMORY_TARGET的值
-------!!!如果你在pfile中設定了MEMORY_MAX_TARGET而沒有設定MEMORY_TARGET,則MEMORY_TARGET預設為0,在DB啟動後可以動態改變MEMORY_TARGET不超過MEMORY_MAX_TARGET的值
-------!!!也可以設定SGA_TARGET或PGA_AGGREGATE_TARGET為一個非0的值,這個值將作為SGA或PGA分配的最小值

三、監視、最佳化AMM:
SQL> select * from v$memory_target_advice order by memory_size;
-------MEMORY_SIZE_FACTOR表示假設替代的MEMORY_TARGET大小
-------ESTD_DB_TIME表示在此預計的MEMORY_TARGET大小下所需的DB time

二、ASMM相關知識:

1.SGA_MAX_SIZE設定:如果不設定則oracle在初始化的時候將選擇所有指定元件的總和或者預設值,如果設定的值比分配給所有元件的記憶體小,那麼資料庫將忽略此設定的值
2.SGA_TARGET設定:在設定之前,同時為了啟用自動共享記憶體管理的功能,STATISTICS_LEVEL必須被設定為TYPICAL (the default)或ALL,如果此引數被設定那麼必須設定自動調整大小的元件的大小為0或最小值
3.SGA中能自動調整大小的元件:Fixed SGA、SHARED_POOL_SIZE、LARGE_POOL_SIZE、JAVA_POOL_SIZE、DB_CACHE_SIZE、STREAMS_POOL_SIZE
4.SGA中不能自動調整(固定)大小的元件:LOG_BUFFER、DB_KEEP_CACHE_SIZE、DB_RECYCLE_CACHE_SIZE、DB_nK_CACHE_SIZE
5.SGA中分配記憶體的單位:在SGA中動態分配各元件大小的最小單元是顆粒,通常來說在多數平臺上如果SGA的大小<=1G,則顆粒大小是4M,SGA>1G,則顆粒大小為16M(32位NT上SGA>1G,則顆粒大小為8M)
6.查詢V$SGAINFO或V$SGA_DYNAMIC_COMPONENTS看顆粒的大小,如果手動給SGA中元件分配的記憶體不是顆粒的倍數,則DB實際給該元件分配(四捨五入到最小粒度的倍數)大於分配值為其顆粒倍數的是小值
7.SGA_MAX_SIZE不能被動態修改

三、啟用、配置ASMM:
從MSMM到ASSM:
1.獲得SGA_TARGET的值SELECT ((SELECT SUM(value) FROM V$SGA) - (SELECT CURRENT_SIZE FROM V$SGA_DYNAMIC_FREE_MEMORY)) "SGA_TARGET" FROM DUAL;
2.修改pfile中sga_target的值並重啟DB,或者ALTER SYSTEM SET SGA_TARGET=value [SCOPE={SPFILE|MEMORY|BOTH}]
3.透過修改pfile中各自動調優元件對應的初始化引數的值為0或最小分配量,或者alter system set %_size=0——————期望的最小值
從AMM到ASMM:
1.ALTER SYSTEM SET MEMORY_TARGET = 0
2.透過修改pfile中各自動調優元件對應的初始化引數的值為0或最小分配量,或者alter system set %_size=0-期望的最小值
---------啟用ASMM後可以動態調整相應自動調整元件的最小值,該值只限制該元件大小不能減小到此值以下,但不限制元件的最大值
---------動態設定sga_target一個非0值之前,也就是啟用ASMM之前最好重啟DB,因為共享池不能被動態收縮,因為其中含有一些開啟的遊標、PL/SQL包及sql的執行狀態
---------手動調整大小的元件也可以動態改變,但增加或減少的相應值都從自動調整大小元件中動態獲取或釋放,而且設定的是一個精確的值

四、監視、最佳化ASMM:
SQL> select * from v$sga_target_advice order by sga_size;
五、建議參考(from Yong Huang):
配置總大小時參考如下:
在現在作業系統記憶體比較充足的情況下,初始一般將shared pool設定為1至3G,其餘的分配給buffer cache
10gASMM中db_cache_size至少2G
11g中將禁用AMM使用ASMM,因為能夠使用大的緩衝頁

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

相關文章