1. 程式人生 > >Oracle 11G啟動自動記憶體管理AMM

Oracle 11G啟動自動記憶體管理AMM

前言:下面主要介紹了11G的AMM特性,實現了對SGA,PGA,以及SGA下面的記憶體如share_pool的自動管理,因為10G的ASMM特性需要手動對SGA,PGA管理,所以11G引出來了AMM管理。

在一個oracle server可以分為兩部分,一部分是database,一部分是instance。

Database:datafile,controlfile,redolog file,這三個檔案構成了整個oracle的物理結構

Instance:當要訪問資料的時候那麼就要通過instance來訪問了。Instance=記憶體+後臺程序

當oracle作為一個服務在作業系統上面啟動的時候,作業系統會給oracle分配一定的記憶體,同時會執行一些後臺程序。

在linux系統下面可以通過ipcs命令來檢視分配給oracle的記憶體。

[[email protected] ~]# ipcs

------ Shared Memory Segments --------

key        shmid      owner      perms      bytes      nattch     status      

0x00000000 720910     oracle     640        4096       0                              

0x00000000 753681     oracle     640        4096       0   --對oracle進行管理的使用者可以看到是oracle                    

0x84bc7544 786450     oracle     640        4096       0                       

------ Semaphore Arrays --------

key        semid      owner      perms      nsems     

0x00000000 0          root       600        1         

0x00000000 65537      root       600        1         

0x6a52b5d4 196610     oracle     640        154       

------ Message Queues --------

key        msqid      owner      perms      used-bytes   messages

[[email protected] ~]# ipcs -m  --這個檢視分配給oracle的共享記憶體

------ Shared Memory Segments --------

key        shmid      owner      perms      bytes      nattch     status         

0x00000000 720910     oracle     640        4096       0                          

0x00000000 753681     oracle     640        4096       0                       

0x84bc7544 786450     oracle     640        4096       0                       

[[email protected] ~]# ipcs -s  --看oracle記憶體訪問的訊號燈

------ Semaphore Arrays --------

key        semid      owner      perms      nsems     

0x6a52b5d4 196610     oracle     640        154

上面可以看到的ipcs的資訊就是在oracle啟動的時候linux給其分配的記憶體。

現在資料庫是開啟的狀態,下面是關閉資料庫

[[email protected] ~]# ps -ef | grep pmon

oracle    2412     1  0 Jun24 ?        00:00:09 ora_pmon_oradb

root      8188  8117  0 07:45 pts/1    00:00:00 grep pmon

[[email protected] ~]# su - oracle

[[email protected] ~]$ sqlplus / as sysdba

SQL> shutdown immediate;  

Database closed.

Database dismounted.

ORACLE instance shut down.

再去檢視linux分配給資料庫的記憶體發現沒有了。

[[email protected] ~]# ipcs -m

------ Shared Memory Segments --------

key        shmid      owner      perms      bytes      nattch     status  

上面可以看到使用ipcs來檢視在作業系統層面分配給oracle記憶體的資訊。

[[email protected] ~]# ps -ef | grep ora_ | grep -v grep --檢視oracle啟動之後有哪些後臺程序

oracle    8251     1  0 07:49 ?        00:00:00 ora_pmon_oradb

oracle    8253     1  0 07:49 ?        00:00:00 ora_psp0_oradb

oracle    8255     1  3 07:49 ?        00:00:04 ora_vktm_oradb

oracle    8259     1  0 07:49 ?        00:00:00 ora_gen0_oradb

.....................................................................................................................................

可以看到格式都是ora開始,中間就是程序的名字,最後跟著例項的名字oradb。

可以看到在資料庫啟動的時候會獲得分配的記憶體空間,並且會啟動相應的後臺程序。後臺程序實現了資料庫的資料檔案和記憶體之間的互動。

SQL> show parameter mem;  --在11G之後,就可以通過memory_max_target,memory_target對記憶體進行管理了。

NAME      TYPE   VALUE

------------------------------------ -------------------- ------------------------------

hi_shared_memory_address      integer   0

memory_max_target      big integer   800M

memory_target      big integer   800M

shared_memory_address      integer   0

memory_max_target:oracle例項可以獲得作業系統最大記憶體的,一般是作業系統physical mem*80%給oracle使用。比如實體記憶體是8G,最少給memory_max_target分配6G左右。

memory_max_target代表了oracle例項啟動以後可以從作業系統上所獲得的最大記憶體。

memory_target:當前例項分配的記憶體,memory_target<=memory_max_target

memory_max_target      big integer   800M

memory_target      big integer   800M

上面可以看到可以從作業系統獲得到的最大記憶體是800M,但是實際上oracle當前例項獲得了800M。

在11G之後,如果這兩個引數是非0的,那麼就叫啟動了記憶體的自動管理AMM。

Oracle記憶體分為兩部分,SGA(系統全域性區,是一個共享記憶體,共享給所有訪問資料庫例項會話的),PGA(程式全域性區,通過建立會話以後,給每一個會話分配UGA的獨立記憶體空間)。

OLTP:以事務操作為主,比如銀行,存錢,取錢,轉賬。在這種型別的資料庫裡面SGA佔80%,PGA佔20%,PGA這部分的空間大部分用來資料的排序,OLTP型別的資料庫一般訪問的資料量不會特別大,排序也不會特別多,所以給PGA的記憶體不會特別多。希望執行的SQL和訪問的資料塊都可以被共享,所以SGA佔80%。

OLAP(DSS):以海量的查詢為主,會牽扯到大量表的連線,資料統計分析彙總,在SQL執行的過程當中訪問的資料量都比較大,執行的時間都比較長,會涉及到大量的排序工作,因為訪問的資料量大,訪問的資料塊在記憶體裡很難被共享,執行的SQL也很難做到共享,所以SGA 40%+PGA 60%

由於銀行等很多系統,白天可能是OLTP系統,到了晚上是OLAP系統,那麼手工方式管理SGA和PGA的記憶體分配就很麻煩了,在11G之前記憶體是不能自動管理的,必須手動調整PGA和SGA的大小,在11G增加了memory_max_target,memory_target兩個引數。

如果將memory_max_target,memory_target這兩個引數設定了非0值,那麼就叫啟動了記憶體自動管理AMM,那麼oracle就會根據業務型別自動的調整SGA,PGA的大小。

在Oracle 11g中禁用 Automatic  Memory Management (AMM)特性(關閉了記憶體自動管理,SGA,PGA就要手動進行分配了(這個就要使用ASMM管理了),這個適合非常有經驗的,對資料庫業務很熟悉的DBA,如果是新的DBA,對業務不是很熟悉,不建議設為手工管理,使用自動管理)。

SQL> set linesize 1200;

SQL> show parameter mem;

NAME      TYPE   VALUE

------------------------------------ -------------------- ------------------------------

hi_shared_memory_address      integer   0

memory_max_target      big integer   800M

memory_target      big integer   800M

shared_memory_address      integer   0

從上面記憶體分配原則,2G*80%=1.6G,實際資料庫記憶體大小是800M,可以調整的大一些,在生產環境下要注意一定要先create pfile from spfile,備份一下引數檔案。

SQL> alter system set memory_max_target=1024m scope=spfile;

System altered.

SQL> alter system set memory_target=1024m scope=spfile;

System altered.

最好是將memory_max_target和memory_target調整為一樣大。

SQL> show parameter mem;

NAME      TYPE   VALUE

------------------------------------ -------------------- ------------------------------

hi_shared_memory_address      integer   0

memory_max_target      big integer   1G

memory_target      big integer   1G

shared_memory_address      integer   0

當將AMM開啟了SGA,PGA大小就不需要再去管了,即使設定了sga_target和pga_aggregate_target為0,那也是說明sga_target和pga_aggregate_target為自動管理。最小值大於0而已,SGA,PGA大小都會根據業務型別來調整。

SGA裡包括了:share pool,buffer cache,large pool,Java pool,stream pool。這幾個緩衝區大小都可以根據SGA自動進行分配,因為啟動了AMM管理,最後調整結果如下(SGA,PGA,SGA下面的記憶體區都自動管理):

SQL> show parameter mem;

NAME      TYPE   VALUE

------------------------------------ -------------------- ------------------------------

hi_shared_memory_address      integer   0

memory_max_target      big integer   1104M

memory_target      big integer   1104M

shared_memory_address      integer   0

SQL> show parameter sga;

NAME      TYPE   VALUE

------------------------------------ -------------------- ------------------------------

lock_sga      boolean   FALSE

pre_page_sga      boolean   FALSE

sga_max_size      big integer   1104M

sga_target      big integer   0

SQL> show parameter pga;

NAME      TYPE   VALUE

------------------------------------ -------------------- ------------------------------

pga_aggregate_target      big integer   0

SQL> show parameter db_cache_size;

NAME      TYPE   VALUE

------------------------------------ -------------------- ------------------------------

db_cache_size      big integer   0

SQL> show parameter  shared_pool_size;

NAME      TYPE   VALUE

------------------------------------ -------------------- ------------------------------

shared_pool_size      big integer   0

SQL> show parameter java_pool_size;

NAME      TYPE   VALUE

------------------------------------ -------------------- ------------------------------

java_pool_size      big integer   0

SQL> show parameter large_pool_size;

NAME      TYPE   VALUE

------------------------------------ -------------------- ------------------------------

large_pool_size      big integer   0

SQL> show parameter streams_pool_size;

NAME      TYPE   VALUE

------------------------------------ -------------------- ------------------------------

streams_pool_size      big integer   0