oracle在RHEL5上使用大内存遇到的几个问题
前几天在安装oracle11g的时候可以看到,使用大内存是很简单的事情,内核参数设定没有问题,只需要指定memory_target就可以直接使用大内存了。而oracle10g就麻烦一些,首先内核参数要设正确,然后要设置use_indirect_data_buffers=TRUE,要注意的是,打开这个参数后DB_CACHE_SIZE 就不能用了,否则启动的时候会报ORA-00385: cannot enable Very Large Memory with new buffer cache parameters的错误,要用DB_BLOCK_BUFFERS来代替(单位是块数不是字节了),这样的话不同块大小的表空间特性似乎也应该没法用了(数据库迁移的时候要小心这一点),而且你还会发现sga_target也不能再用了,如果使用会报:
ORA-00824: cannot set sga_target due to existing internal settings, see alert log for more information
ORA-01078: failure in processing system parameters
这应该是跟新老参数冲突有关,换句话说,在10g里面用大内存页就不能用自动管理了(这个结论不知是否正确,有待讨论)。
设置好其它几个主要内存初始化参数后还有一个必须要编辑的地方,要在/etc/security/limits.conf文件里增加下面内容:
* soft memlock 3145728
* hard memlock 3145728
用ulimit -l命令可以比较设置前后的区别。
如果没有设置lock memory的限制,启动的时候很可能会报:
ORA-27103: internal error
Linux
Error: 11: Resource temporarily unavailable
启动后用命令
$ ls -l /dev/shm
$ ipcs -m
来检查内存分配的情况。
在以前的RHEL版本中应该还需要设置系统hugetlb_pool,但RHEL5中我一直没找到相应的位置,是否有变化目前还未找到相应的资料(以前的计算方法我将在另外一个操作系统文章里记录一下)。
从目前看没有设置hugetlb状态也都是正常的,有什么影响发现了才会指定,呵呵。
最后要提一句的是,10g手动配置初始化内存参数时,shared pool的会根据sga的变化调整最低下限值,不在想以前可以自由定义了,当出现这个问题是,oracle会报shared pool不足的错误,并告诉你根据当前sga的设置应该配多大的shared pool,当然自动化管理是不会出现这样的问题的。