NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ lock_sga boolean FALSE pre_page_sga boolean FALSE sga_max_size big integer 352M --重启后依然是352M,并不会变为0 sga_target big integer 0 SQL> select name,bytes/1024/1024 "size(MB)",resizeable from v$sgainfo;
NAME size(MB) RES ----------------------------------- ---------- --- Fixed SGA Size 1.16300201 No Redo Buffers 2.8359375 No Buffer Cache Size 172 Yes Shared Pool Size 80 Yes Large Pool Size 4 Yes Java Pool Size 4 Yes Streams Pool Size 8 Yes Granule Size 4 No Maximum SGA Size 352 No Startup overhead in Shared Pool 36 No Free SGA Memory Available 80
11 rows selected.
SQL> alter system set sga_target=270m;
System altered.
SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. SQL> startup ORACLE instance started.
Total System Global Area 369098752 bytes Fixed Size 1219496 bytes Variable Size 184550488 bytes Database Buffers 180355072 bytes Redo Buffers 2973696 bytes Database mounted. Database opened. SQL> show parameter sga
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ lock_sga boolean FALSE pre_page_sga boolean FALSE sga_max_size big integer 352M sga_target big integer 272M
重启数据库实例后,SGA_MAX_SIZE的值没有跟着SGA_TARGET做调整,除非再次增大SGA_TARGET的大小并超过SGA_MAX_SIZE的上限,那么下次重启后,SGA_MAX_SIZE又会再一次跟着SGA_TARGET调整
SQL> alter system set sga_target=380m scope=spfile;
System altered.
Total System Global Area 398458880 bytes Fixed Size 1219640 bytes Variable Size 100664264 bytes Database Buffers 293601280 bytes Redo Buffers 2973696 bytes Database mounted. Database opened. SQL> show parameter sga
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ lock_sga boolean FALSE pre_page_sga boolean FALSE sga_max_size big integer 380M sga_target big integer 380M
SGA_MAX_SIZE又再一次和SGA_TARGET的值一致了,并且380正好可以除尽4,共分配95个Granual,因此不会有多2M的问题
总结:
1.SGA_MAX_SIZE是静态参数,而SGA_TARGET可以动态修改,当要改的SGA_TARGET值超过SGA_MAX_SIZE的值时,因为不允许在内存中直接生效,即scope=both或memory都不行,因此必须指定scope=spfile,重启后才能修改成功。如果此时没有设置过SGA_MAX_SIZE得值,那么无论是改大还是改小,重启数据库后,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.如果是先设置了SGA_MAX_SIZE的值,再设置了SGA_TARGET,那么只有当SGA_TARGET设置的值超过SGA_MAX_SIZE的值时,SGA_MAX_SIZE才会在重启生效后,调整到与SGA_TARGET的值一致,反之则不会改变。