oracle三對記憶體引數間關係之3AMM啟動和關閉兩種情況下ASMM機制涉及的一對引數間的關係探討

NO IMAGE

ASMM機制涉及的一對引數為:SGA_TARGET和SGA_MAX_SIZE

SGA_TARGET

Default value0 (SGA autotuning is disabled forDEFERRED mode autotuning requests, but allowed forIMMEDIATE mode autotuning requests)
ModifiableALTER SYSTEM(即表示該引數為動態引數)
Range of values64 MB to operating system-dependent

參見:http://docs.oracle.com/cd/E11882_01/server.112/e40402/initparams236.htm#I1010256

SGA_MAX_SIZE

Default valueInitial size of SGA at startup, dependent on the sizes of different pools in the SGA, such as buffer cache, shared pool, large pool, and so on.
ModifiableNo(即表示該引數為靜態引數)
Range of values0 to operating system-dependent

On 64-bit platforms and non-Windows 32-bit platforms, when either MEMORY_TARGET orMEMORY_MAX_TARGET is specified, the default value ofSGA_MAX_SIZE is set to the larger of the two parameters. This causes more address
space to be reserved for expansion of the SGA.

On Windows 32-bit platforms, the default value of SGA_MAX_SIZE is the largest of the following values:

  • 60% of MEMORY_TARGET, if specified

  • 60% of MEMORY_MAX_TARGET, if specified

  • 25% of the total available virtual address space

參見:http://docs.oracle.com/cd/E11882_01/server.112/e40402/initparams235.htm

上述描述可知,

1、當SGA_TARGET=非0時,SGA_TARGET要在64 MB to operating system-dependent這個範圍內,確切說是,SGA_TARGET要在64 MB toSGA_MAX_SIZE。

2、

由於SGA_TARGET始終<=SGA_MAX_SIZE,所以

當SGA_TARGET=0時,SGA_MAX_SIZE取值範圍為0 toSGA_MAX_SIZE。

當SGA_TARGET=非0時,SGA_TARGET要在64 MB toSGA_MAX_SIZE這個範圍內,故而SGA_MAX_SIZE取值範圍為64
MB to operating system-dependent。

說明了SGA_TARGET要<=SGA_MAX_SIZE的例子,參見下文一大點裡1.2的例子。

這裡還有一點要知道,sga_max_size可以自動來變動的(sga_max_size自動變動值,無論在例項啟動時,還是例項執行期間,都可以;而alter system setsga_max_size只能在例項啟動時起效,因為sga_max_size是靜態引數),當sga的記憶體元件的和小於sga_max_size的時候,sga_max_size不會改變,還是維持自己的值,如果超過了這個和,sga_max_size的就會自動變動成和的值,這個你可以自己試試。例如,

我現在想調整database buffer的值到1G,我只需要設定db_cache_size到1G,而不設定sga_max_size,這時由於各元件值大於sga_max_size目前值,所以sga_max_size自動變化:

 

SQL>alter system set db_cache_size=1000Mscope=spfile;

 

SQL> shutdown immediate;

 

SQL> startup;

 

看看現在的記憶體資訊

 

Total System Global Area 1301357848 bytes

 

Fixed Size                   455960 bytes

 

Variable Size             251658240 bytes

 

Database Buffers         1048576000 bytes

 

Redo Buffers                 667648 bytes

 

發現sga_max_size已經自動變化

 

SQL> show parameters sga_

 

NAME                                 TYPE                              VALUE

 

———————————— ——————————— ———

 

sga_max_size                         big integer                       130135784

 

也已經變化叻。

 【

參見:  

http://blog.csdn.net/haiross/article/details/41696485

為什麼會出現這樣的問題叻,是因為在32位的機器上Oracle的記憶體有限制,記憶體最大4G,32位留50%給作業系統,window是單執行緒的,不能超過1.7G。out of memory也就出來叻。

SGA不能超過1.7G的限制

在Windows上調整SGA大小遭遇ORA-27100、ORA-27102錯誤的處理方法

當例項啟動前的引數裡sga_max_size=0,sga_target=0時,例項啟動後sga_max_size值也會自動調整,詳見下文一大點裡的2.2例子。

那麼sga_max_size值自動調整時,該引數的值具體為多少,是什麼決定呢?

是由sga_max_size的預設值:

Default value  :Initial size of SGA at startup, dependent on the sizes of different pools in the SGA, such as buffer cache, shared pool, large pool, and so on。也就是說

SGA_MAX_SIZE 的 Default value     為Initial size of SGA at startup,所以說SGA_MAX_SIZE是一個沒有初始化值的變數。故而在ASMM啟動時,SGA_MAX_SIZE 的 Default value 是將SGA_target的值賦值給SGA_MAX_SIZE的,在ASMM關閉時,SGA_MAX_SIZE 的 Default
value 是將sga各個元件的引數值如shared_pool_size相加的值賦值給SGA_MAX_SIZE的。

具體的說是,

On 64-bit platforms and non-Windows 32-bit platforms, when either MEMORY_TARGET orMEMORY_MAX_TARGET is specified, the default value ofSGA_MAX_SIZE is set to the larger of the two parameters. This causes more address
space to be reserved for expansion of the SGA.

On Windows 32-bit platforms, the default value of SGA_MAX_SIZE is the largest of the following values:

  • 60% of MEMORY_TARGET, if specified

  • 60% of MEMORY_MAX_TARGET, if specified

  • 25% of the total available virtual address space

例項執行期間的SGA_MAX_SIZE都是一個非0值,因為SGA_MAX_SIZE是一個靜態引數,所以例項執行期間將SGA_MAX_SIZE置為0,但是修改後的值不會立馬起效,只有待下一次例項啟動時才起效,而待下一次例項啟動時如上所說例項啟動時SGA_MAX_SIZE還是會從0被調整為一個非0值詳見下文一大點裡的2.2例子。

註釋:

引數預設值不一定就是引數的初始化值:

SGA_MAX_SIZE  Default value     為Initial size of SGA at startup,所以說SGA_MAX_SIZE是一個沒有初始化值的變數。故而在ASMM啟動時,SGA_MAX_SIZE 的 Default value 是將SGA_target的值賦值給SGA_MAX_SIZE的,在ASMM關閉時,SGA_MAX_SIZE 的 Default value 是將sga各個元件的引數值如shared_pool_size相加的值賦值給SGA_MAX_SIZE的。

參見蓋國強  《深入解析oracle》 第二章  引數分類

SGA_TARGET和SGA_MAX_SIZE兩者關係為

0、SGA_TARGET始終<=SGA_MAX_SIZE。

否則,會提示

ORA-00823: Specified value ofsga_target greater than sga_max_size。

一、

當AMM啟動時,即memory_target=非0

If Automatic Memory Management is enabled (MEMORY_TARGET is set to a positive value) andSGA_TARGET is also set to a positive value, theSGA_TARGET value acts as the minimum value for the size of the SGA.

以下實驗時引數檔案裡MEMORY_TARGET=非0,MEMORY_MAX_TARGET=非0。

1、當SGA_TARGET=非0時(即ASMM啟動時)

1.1

當引數檔案裡SGA_TARGET=非0,SGA_MAX_SIZE=非0時,例項啟動成功。

1.2

當引數檔案裡SGA_TARGET=非0,SGA_MAX_SIZE=0時,例項啟動不成功。

下面是具體實驗來證明:

引數檔案裡:

*.memory_max_target= 700M

*.memory_target=700M

*.sga_max_size=0

*.sga_target=400M

*.pga_aggregate_target=100M

 

SQL>shutdown immediate

資料庫已經關閉。

已經解除安裝資料庫。

ORACLE例程已經關閉。

SQL>startup pfile=E:\app\hc\product\11.2.0\dbhome_1\database\INITmonkey.ORA

ORA-00823: Specified value of sga_target greater than sga_max_size

ORA-01078:處理系統引數失敗

SQL>

註釋:

對比memory_max_target和memory_target關係不同點在於:

當MEMORY_TARGET=非0,MEMORY_MAX_TARGET=0時,啟動例項後MEMORY_MAX_TARGET=MEMORY_TARGET值。

2、當SGA_TARGET=0時(即ASMM關閉時)

2.1

當引數檔案裡SGA_TARGET=0,SGA_MAX_SIZE=非0時,例項啟動成功。

註釋:

memory_target=0時sga_ target可以為0是因為memory_target=0時sga_ target為0,表示sga為手動管理,即由shared_pool_size引數等之和為sga大小。

2.2

當引數檔案裡SGA_TARGET=0,SGA_MAX_SIZE=0時,例項啟動成功。

啟動例項成功後,檢視SGA_TARGET和SGA_MAX_SIZE(使用showparameters 
sga或是select * from  v$parameter where name like ‘%sga%’;),發現SGA_MAX_SIZE被調整為一個非0值。

下面是具體實驗來證明:

以如下引數檔案來啟動例項:

memory_target=0,memory_max_target=1400M,

pga_aggregate_target 為0,workarea_size_policy=manual

sga_max_size=0,sga_target=0

則可以啟動例項成功。

SQL> select name,value from  v$parameter where name like ‘%target%’ orname like

 ‘%sga%’;

 

NAME                                              VALUE

————————                      ——————————————————–

 sga_max_size                         150994944

 

pre_page_sga                           FALSE

 

lock_sga                                     FALSE

 

sga_target                                 0

 

memory_target                        0

 

memory_max_target             1468006400

 

archive_lag_target                   0

 

fast_start_io_target                  0

 

fast_start_mttr_target              0

 

db_flashback_retention_target           1440

 

pga_aggregate_target            0

 

parallel_servers_target            32

 

已選擇12行。

註釋:

為什麼啟動例項時SGA_MAX_SIZE會從0被調整為一個非0值呢?

因為

sga_max_size可以自動來變動的(sga_max_size自動變動值,無論在例項啟動時,還是例項執行期間,都可以;而alter system setsga_max_size只能在例項啟動時起效,因為sga_max_size是靜態引數),當sga的記憶體元件的和小於sga_max_size的時候,sga_max_size不會改變,還是維持自己的值,如果超過了這個和,sga_max_size的就會自動變動成和的值。

那麼sga_max_size值自動調整時,該引數的值具體為多少,是什麼決定呢?

是由sga_max_size的預設值

SGA_MAX_SIZE  Default value     為Initial size of SGA at startup,所以說SGA_MAX_SIZE是一個沒有初始化值的變數。故而在ASMM啟動時,SGA_MAX_SIZE 的 Default value 是將SGA_target的值賦值給SGA_MAX_SIZE的,在ASMM關閉時,SGA_MAX_SIZE 的 Default value 是將sga各個元件的引數值如shared_pool_size相加的值賦值給SGA_MAX_SIZE的。


所以,例項啟動前的引數檔案即使設定了SGA_MAX_SIZE=0,例項啟動時SGA_MAX_SIZE也會從0被調整為一個非0值。

故而我們可以知道例項執行期間的SGA_MAX_SIZE都是一個非0值,因為SGA_MAX_SIZE是一個靜態引數,所以例項執行期間將SGA_MAX_SIZE置為0,但是修改後的值不會立馬起效,只有待下一次例項啟動時才起效,而待下一次例項啟動時如上所說例項啟動時SGA_MAX_SIZE還是會從0被調整為一個非0值

二、

當AMM關閉時,即memory_target=0

2、當MEMORY_TARGET=0時(即AMM關閉時)

2.1

當引數檔案裡MEMORY_TARGET=0,MEMORY_MAX_TARGET=非0時,例項啟動成功。

例項啟動後,檢視MEMORY_TARGET和MEMORY_MAX_TARGET都為原值(使用showparameters  mem或是select * from  v$parameter where name like ‘%mem%’;)。即

If you omit the line for MEMORY_TARGET and include a value forMEMORY_MAX_TARGET, theMEMORY_TARGET parameter defaults to zero. After startup, you can then dynamically changeMEMORY_TARGET
to a nonzero value, provided that it does not exceed the value ofMEMORY_MAX_TARGET.(文章詳解)

2.2

當引數檔案裡MEMORY_TARGET=0,MEMORY_MAX_TARGET=0時,例項啟動成功。

例項啟動後,檢視MEMORY_TARGET和MEMORY_MAX_TARGET(使用showparameters  mem或是select * from  v$parameter where name like ‘%mem%’;),發現MEMORY_MAX_TARGET被調整為一個非0值。

下面是具體實驗來證明:

三、

AMM關閉時(即memory_target=0),才會出現ORA-00849:SGA_TARGET
524288000 cannot be set to more than MEMORY_MAX_TARGET 0.
無論是sga_target>memory_max_target還是sga_max_size>memory_max_target。當sga_max_size>memory_max_target時,即使此時sga_target也>memory_max_target,ORA-00849裡的SGA_TARGET值還是來自sga_max_size

附加

sga_max_size是靜態引數,所以它即使在例項執行期間修改的值也要在下次啟動時起作用,故而不用試驗sga_max_size靜態引數在例項執行期間修改對sga_target影響。