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會自動幫你調整,設定比它大,會報錯。