转载

oracle 9i 32位系统 使用VLM 突破SGA 1.7G限制

最近公司有几台旧环境的机器,32位RHEL AS 4.8的系统,oracle 9i的数据库,数据库的压力比较大,内存都是8GB的,但是oracle在32位系统中,SGA只能使用不超过1.7G,多出来的内存空置着,顶多缓存下系统文件,我开始想办法把这部分内存利用起来,还是要靠oracle的VLM特性,实际上就是利用linux的tmpfs(内存文件系统)
1、启动数据库,查看原有主要参数配置情况:
启动sqlplus,导出初始化参数文件:
SQL>create pfile from spfile
备份init和spfile。

2、配置linux参数
(1)修改/etc/fstab 的shm,并添加权限
tmpfs                     /dev/shm                tmpfs   defaults,size=4G,uid=500,gid=500    0 0

(2)增加  max locked memory     ulimit
为了适应VLM 窗口大小(默认为512M)需要调整Oracle锁定的内存地址空间的大小(在默认情况下为4k),本次中将Oracle锁定的内存设置为接近4G,添加如下内容到/etc/security/limits.conf
oracle soft memlock 4194303
oracle hard memlock 4194303
注:在32位的Oracle中,锁定内存的大小不能超过4G,计算公式:4*1024*1024-1。

(3)切换到Oracle用户,输入如下命令,使第(2)步的设置生效:
$ ulimit
(4)输入“ulimit -l”可以查看当前设置的结果
3、配置Oracle
(1)修改initorcl.ora文件中如下参数设置,如果参数文件中没有,则添加下述参数设置。
*.use_indirect_data_buffers=true
*.db_block_buffers = 510000
*.shared_pool_size = 252984832  (这个值不能太大,也不能太小,如果太小了,在加载这个pfile时系统会提示你把这个值放到多少at least,按照系统提示的值放就行了)
(本次计划将SGA区调整到接近4G,由于db_block_size=8192,所以设置db_block_buffers为510000,计算公式:4*1024*1024/8.192-200)
将db_cache_size参数设置删除(使用VLM技术增大SGA到2.6G时db_cache_size参数将失效,必须使用db_block_buffers参数。)
将sga_target参数删除(默认没配置)
删除:
*.db_cache_size=xxxxxx
*.java_pool_size= xxxxxx
*.large_pool_size= xxxxxx
*.shared_pool_size= xxxxxx
**************************
#我的设置如下(4G):
*.use_indirect_data_buffers=true
*.db_block_buffers = 510000
*.shared_pool_size = 419430400
*.pga_aggregate_target=629145600
*******************************
 
(2)以initorcl.ora参数文件启动并关闭数据库,查看参数设置是否生效:
SQL>startup pfile='/opt/app/oracle/product/9.2.0/dbs/initorcl.ora'
启动没问题,再建立spfile
SQL> create spfile from pfile;
正常重启数据库。

可以发现, data buffer部分的共享内存来自VLM,但SGA的其他部分,如shared_pool使用的共享内存来自系统的普通共享内存;
kernel.shmmax的设置应大于等于除data buffer以外的其他SGA组件之和;

参考:http://www.cnblogs.com/guhome/archive/2011/04/25/2027084.html

正文到此结束
Loading...