天天看點

sga_target和sga_max_size

sga_target和sga_max_size 

1.說明 

sga_max_size是從9i以來就有的作為設定sga大小的一個參數,而sga_target則是從10g才有的一個新參數,作為配合10g自動管理sga而出現的 

sga_target是10g的新特性,隻要sga_target為非零值,那麼記憶體元件就是采用動态配置設定原則,由oracle自動調整各記憶體元件的大小。 

2.參數檢視: 

sql> show parameter sga 

name      type value 

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

lock_sga      boolean false 

pre_page_sga      boolean false 

sga_max_size      big integer 1456m 

sga_target      big integer 0           --自動管理關閉,每個值都是固定的。 

sql> select name,bytes/1024/1024 "size(mb)",resizeable from v$sgainfo; 

name    size(mb) res 

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

fixed sga size 2.12534332             no 

redo buffers    7.359375               no 

buffer cache size 544                   yes 

shared pool size 256                   yes 

large pool size 16                   yes 

java pool size 16                   yes 

streams pool size 16                   yes 

shared io pool size   0                 yes 

granule size 16                     no    --granule size 為16m 

maximum sga size 1449.48828             no    --sga_max_size對應的值 

startup overhead in shared pool    84.60112 no 

free sga memory available 592 

注意,resizeable值為no的,都是不可動态調整的值, 

而所有可動态調整的幾個記憶體元件則正好等于sga_target的值: 

2.12534332+7.359375+544+256+16+16+16+16+84.60112+592~1449.48828 

我們也可以從v$sga_dynamic_components這個視圖了解各記憶體元件的記憶體配置設定情況,和v$sgainfo内容基本是一緻的,除了沒有展示gradual size這一項 

sql> select component,current_size/1024/1024 "size(mb)" from v$sga_dynamic_components; 

component                                                          size(mb) 

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

shared pool                                                             256 

large pool                                                               16 

java pool                                                                16 

streams pool                                                             16 

default buffer cache                                                    544 

keep buffer cache                                                         0 

recycle buffer cache                                                      0 

default 2k buffer cache                                                   0 

default 4k buffer cache                                                   0 

default 8k buffer cache                                                   0 

default 16k buffer cache                                                  0 

default 32k buffer cache                                                  0 

shared io pool                                                            0 

asm buffer cache                                                          0 

14 rows selected 

sga = shared pool + large pool + java pool + streams pool + default buffer cache = 256+16+16+16+544=848m 

這個算出來的sga值比sga_target的值少了4m,其實就是那個gradual size的值 

sql> select name,issys_modifiable from v$parameter where name like '%sga%'; 

name                                issys_mod 

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

sga_max_size                        false 

pre_page_sga                        false 

lock_sga                            false 

sga_target                          immediate 

issys_modifiable列的值為false的,就是不能動态修改的參數,需重新開機生效,為immediate的,即可以動态修改 

3.動态修改sga_target的值 

sql> alter system set sga_target=1000m; 

system altered. 

sql> alter system set sga_target=2000m; 

alter system set sga_target=2000m 

error at line 1: 

ora-02097: parameter cannot be modified because specified value is invalid 

ora-00823: specified value of sga_target greater than sga_max_size 

3.1 如果不帶scope參數,預設為both,但要在記憶體中生效,必須滿足sga_target<sga_max_size的條件,否則會報上述錯誤 

報錯解決步驟: 

1)手動建立一個pfile 

vi pfilepoc.ora 

2)将原來的spfilepoc.ora裡面的内容複制到pfilepoc.ora裡面,修改裡面錯誤的配置。 

3)startup pfile='/u02/oracle/dbs/pfilepoc.ora'; 

4)重新建立spfile 

create spfile from pfile='/u02/oracle/dbs/pfilepoc.ora'; 

5)再次重新開機 

shutdown immediate 

startup 

3.2 如果設定大于sga_max_size---啟動會報錯 

sql> alter system set sga_target=2000m scope=spfile; --超過了sga_max_size的值1456m 

sql> shutdown immediate; 

database closed. 

database dismounted. 

oracle instance shut down. 

--啟動會報錯 

sql> startup 

ora-00838: specified value of memory_target is too small, needs to be at least 2016m  

嘗試手動修改pfile裡面的memory_target的值 

vi /u01/oracle/dbs/pfiletinadb.ora 

*.memory_target=2522532352 

遇到另外一個報錯: 

sql> startup pfile='/u01/oracle/dbs/pfiletinadb.ora' 

ora-00845: memory_target not supported on this system 

報錯是由于/dev/shm過小導緻的,而且/dev/shm是一個tmpfs的檔案系統,該檔案系統是基于記憶體的,大小是随着實體記憶體的大小動态改變的, 

一般為實體記憶體的一半;tmpfs檔案系統可以使用實體内容,也可以使用swap。 

/dev/shm的值必須大于memory_max_target 

[root@oratest ~]# df -th /dev/shm 

filesystem     type   size  used avail use% mounted on 

tmpfs          tmpfs  1.9g  861m  1.1g  45% /dev/shm 

[root@oratest ~]# vi /etc/fstab 

tmpfs                   /dev/shm         tmpfs   defaults,size=2g       0 0 

[root@oratest ~]# umount /dev/shm 

[root@oratest ~]# mount /dev/shm 

tmpfs          tmpfs  2.0g     0  2.0g   0% /dev/shm 

sql> startup pfile='/u01/oracle/dbs/pfiletinadb.ora'   

sql> show parameter memory 

hi_shared_memory_address      integer 0 

memory_max_target      big integer 2000m 

memory_target       big integer 2000m 

shared_memory_address      integer 0 

sga_max_size      big integer 2000m   

sga_target      big integer 1504m 

spfile中的内容: 

*.memory_max_target=2097152000 

*.memory_target=2097152000 

*.sga_target=1577058304 

3.3 如果設定sga_max_size比sga_target小 

sga_max_size      big integer 1648m 

sga_target      big integer 1008m 

sql> alter system set sga_max_size=500m scope=spfile; 

啟動也會報錯: 

結論:在11g中,這個sga_target隻能設定是小于等于sga_max_size的大小,設定比它小,oracle會自動幫你調整,設定比它大,會報錯! 

4.設定的值與顯示不同的原因: 

name                                 type        value 

lock_sga                             boolean     false 

pre_page_sga                         boolean     false 

sga_max_size                         big integer 1456m 

sga_target                           big integer 1408m 

可以看到,當調整了sga_target參數從0調整為1400m,這裡還有個比較有意思的地方,這多出來的8m又是什麼呢? 

sql> select 1400/16 "granual count" from dual; 

granual count 

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

         87.5 

sql> select 88*16 "sga_size(mb)" from dual; 

sga_size(mb) 

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

        1408 

剛才說了granual size的大小為16m,由于granual必須完整地配置設定,是以會配置設定給sga共88個granual,即88*16=1408m,也就是多給了8m 

5.對比下,開啟自動管理sga後,内部的參數發生了哪些變化: 

default buffer cache                                                   1088    --這個值變化了。 

name                               size(mb) resizeable 

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

fixed sga size                   2.12534332 no 

redo buffers                       7.359375 no 

buffer cache size                      1088 yes 

shared pool size                        256 yes 

large pool size                          16 yes 

java pool size                           16 yes 

streams pool size                        16 yes 

shared io pool size                       0 yes 

granule size                             16 no 

maximum sga size                 1449.48828 no 

startup overhead in shared pool  93.4275817 no 

free sga memory available                48      ---重要參數 

12 rows selected 

注意,48就是1456-1408得到的,相當于做了個預留,告訴sga,你可以現在隻用1408m 

但如果想增加,可以再多用48m,達到1456m。而這個時候隻要sga_target重新設定的值沒有超過sga_max_size的值,就可以在不停庫的情況下增加sga大小,這樣做是有好處的 

6.關閉自動管理sga 

把sga_target設定為0,即表示禁用10g的新特性——自動配置設定記憶體,這樣我們可以對各個記憶體元件的值進行單獨設定,對于特殊的應用場景, 

有時候也是需要的 

sql> alter system set sga_target=0; 

設定sga_target=0以後,已經配置設定的記憶體元件的值不會變化,如果不設定新值,那麼依舊保持原來的值,除非單獨設定, 

sga_target      big integer 0    

總結: 

1.sga_max_size是靜态參數,而sga_target可以動态修改 

2.當先給sga_max_size設定了一個較大的值,重新開機資料庫後,sga_target可以依然保持原有大小,相當于給sga_target先預留了一些記憶體, 

預先設定好sga可配置設定記憶體,等到資料庫出現壓力導緻sga記憶體不足,可以直接通過sga_target動态修改到這一上限而無需停庫。 

3.當給sga_target設定非零值時,表示采用記憶體元件記憶體由oracle動态調整,如shared pool,db buffer cache等,這些記憶體元件隻會跟着 

sga的大小動态進行調整(增大或減小),與其他值無關。 

4.當sga_target設定為零時,表示禁用記憶體元件由sga自動管理,如果未做單獨設定,那麼保持原有值。此時可以根據具體場景需求,單獨 

為某個記憶體元件配置合理的記憶體大小。 

5.在11g中,這個sga_target隻能設定是小于等于sga_max_size的大小,設定比它小,oracle會自動幫你調整,設定比它大,會報錯。