总之,一般设置shmmax >=SGA(32Bit 系统是否支持到1.7G 以上SGA 需要注意) ,缺省为32M,
如果是64Bit 的Linux 操作系统,shmmax 设置为大于SGA_MAX_SIZE即可。
Linux共享内存页大小为4KB。共享内存段的大小都是共享内存页大小的整数倍。
一个共享内存段的最大大小是16G,那么需要共享内存页数是16GB/4KB = 16777216KB/ 4KB = 4194304(页),也就是64Bit 系统下16GB 物理内存,设置kernel.shmall =4194304才符合要求(几乎是原来设置2097152的两倍)。这时可以将shmmax 参数调整到16G 了,同时可以修改SGA_MAX_SIZE 和SGA_TARGET为12G(您想设置的SGA 最大大小,当然也可以是2G~14G 等,还要协调PGA参数及OS 等其他内存使用,不能设置太满,比如16G)。
其值应不小于shmmax/page_size.缺省值就是2097152,如果服务器上运行的所有实例的SGA总和不超过8GB(通常系统可分配的共享内存的和最大值为8GB),通常不需要修改。
32位的CPU的在windows系统中2G给系统用2G给应用程序使用,oracle的SGA内存使用不能超过1.7G,将sga扩大到1.7G以上需要下面的一些设置
一.OS上修改
1.修改boot.ini文件,加/3GB /PAE:
在这行,multi(0)disk(0)rdisk(0)partition(1)WINDOWS="Microsoft Windows" /3GB /PAE
2.修改windows注册表:
regedit到HKEY_LOCAL_MACHINESOFTWAREORACLEHOME0这个目录中找到AWE_WINDOW_MEMORY这个参数,将其修改为oracle需要内存的大小:例如:3G时为:3*1024*1024*1024
这个参数如不存大时,可以新建一个字符串名为AWE_WINDOW_MEMORY,值为上面讲过的大小,这个值需要足够大,不够时将报:
ORA-27102 out of memory
OSD-00034 Message 34 not found; Product=RDBMS;facility =SOSD
O/S Error: (OS 8) Not enough storage is available to process this command
3.修改windows控制面板中的管理工具--> 域安全策略-->本地安全策略-->用户权限分配-->锁定内存页(内存中锁定页面)中加入启oracle数据库的OS用户名.
4.重启电脑
SELECT NAME,VALUE FROM v$parameter WHERE NAME IN ('sga_max_size','db_cache_size','shared_pool_size','shared_pool_reserved_size','large_pool_size','java_pool_size','db_block_size','db_block_buffers','log_buffer','sort_area_size','sort_area_retained_size','hash_area_size','sessions','open_cursors')
ORDER BY NAME;
alter system set SGA_TARGET = 3749707776 scope=spfile;
1.备份spfile D:\DiabloOracle\product\10.2.0\db_1\database\SPFILEDIA.ORA
create pfile='c:/initSID.ora' from spfile;
2.在pfile上修改参数
use_indirect_data_buffers=true
pre_page_sga=true
db_block_buffers=262144
sga_max_size=2147483648
sga_target=2147483648
3.用pfile启动数据库,将参数写回spfile,重启数据库
startup pfile=''
create spfile from pfile
shutdown immeidate
startup
===============
方法2:
通过PAE选项让Oracle在4G内存的32位windows服务器上使用超过1.7G的SGA
大 | 中 | 小
[不指定 2009/02/23 14:35 | by zeus ]
1.测试环境:HP DL380 G5服务器,4GB内存,32位Windows 2003企业版
2.修改c:\boot.ini文件,添加/PAE选项后如下:
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows Server 2003, Enterprise" /noexecute=optout /fastdetect /PAE
[code]
3.重新启动Windows后,修改Oracle SGA参数,重启Oracle即可生效:
[code]
alter system reset sga_max_size scope=spfile sid='*';
alter system reset sga_target scope=spfile sid='*';
alter system set shared_pool_size=256M scope=spfile;
alter system set db_block_buffers=320000 scope=spfile;
alter system set use_indirect_data_buffers=true scope=spfile;
shutdown immediate;
startup;
使用PAE模式后,无法再使用Oracle自动内存管理功能,因此需要将sga_max_size和sga_target参数去掉,改用手动管理各内存组 件,如上面的shared_pool_size参数和db_block_buffers参数分别指定的是共享池和数据缓冲区的大 小,use_indirect_data_buffers指定oracle可以使用超过32位平台限制4GB以上的内存段
4.通过查看Oracle sga统计信息可以看到设置已生效:
PRE_PAGE_SGA
oracle實例啓動時,會只載入各個內存區最小的大小。而其他SGA內存只作爲虛擬內存分配,只有當進程touch到相應的頁時,纔會置換到物理內存中。但我們也許希望實例一啓動後,所有SGA都分配到物理內存。這時就可以通過設置PRE_PAGE_SGA參數來達到目的了。
這個參數的默認值爲FALSE,即不將全部SGA置入物理內存中。當設置爲TRUE時,實例啓動會將全部SGA置入物理內存中。它可以使實例啓動達到它的最大性能狀態,但是,啓動時間也會更長(因爲爲了使所有SGA都置入物理內存中,oracle進程需要touch所有的SGA頁)。
LOCK_SGA
爲了保證SGA都被鎖定在物理內存中,而不必頁入/頁出,可以通過參數LOCK_SGA來控制。這個參數默認值爲FALSE,當指定爲TRUE時,可以將全部SGA都鎖定在物理內存中。當然,有些系統不支持內存鎖定,這個參數也就無效了
SGA_TARGET /SGA_MAX_SIZE
10G中不需要分別制定SGA的每個部分的大小,假設將SGA_TARGET設置爲200M,表明SGA最大爲200M所有SGA組件如share pool,buffer cache,large pool,javapool都需從其中分配,oracle會自動爲各組件指定初始值,並在運行過程中動態的調整各組件的大小。
當使用SGA_TARGET時,若未設置SGA_MAX_SIZE 或設置小於SGA_TARGET則SGA_MAX_SIZE等於SGA-TARGET.SGA_TARGET是可動態調整的,其值不能大於SGA_MAX_SIZE目前推薦的參數配置:
LOCK_SGA = TRUE
SGA_TARGET>= 4G (在系統物理內存允許的情況下越大越好)
SGA_MAX_SIZE>= 4G (在系統物理內存允許的情況下越大越好)但是效率並沒有什麼提高,通過以下兩個查詢看,命中率分別爲99.2%和98.8%,說明在oracle程序層的優化已經達到了較高的效率:查詢高速數據緩存命中率:
select sum(pins) "data access",sum(pins)-sum(reloads) "cachehit",
(1-sum(reloads)/sum(pins)) * 100 "hit rate" fromv$librarycache查詢數據字典命中率:
select sum(gets) "dictionary access",sum(gets) - sum(getmisses)"dictionary cache hit",
(1-sum(getmisses)/sum(gets)) * 100 "hit rate" from v$rowcache