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