ASMM機制涉及的一對參數為: SGA_TARGET和SGA_MAX_SIZE 。 SGA_TARGET Default value 0 (SGA autotuning is disabled for DEFERRED mode autotuning requests, but allowed for IMMEDIATE mode autotuning requests) Modifiable ALTER SYSTEM (即表示該參數
Default value | 0 (SGA autotuning is disabled forDEFERRED mode autotuning requests, but allowed forIMMEDIATE mode autotuning requests) |
---|---|
Modifiable | ALTER SYSTEM |
Range of values | 64 MB to operating system-dependent |
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. |
---|---|
Modifiable | No(即表示該參數為靜態參數) |
Range of values | 0 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》 第二章 參數分類
0、SGA_TARGET始終<=SGA_MAX_SIZE。
否則,會提示
ORA-00823: Specified value ofsga_target greater than sga_max_size。
一、
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值。
二、
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。
附加
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com