通过修改lock_sga和pre_page_sga参数可以保证SGA不被换出到虚拟内存,进而可以提高SGA的使用效率。通过这个小文儿给大家展示一下这两个参数的修改过程,不要太乐观,修改过程是存在“小坎坷”的。
当lock_sga参数设置为TRUE时(默认值是FALSE),可以保证整个SGA被锁定在物理内存中,这样可以防止SGA被换出到虚拟内存。只要设置lock_sga为“TRUE”便可保证SGA被锁定在物理内存中,这里之所以顺便将pre_page_sga参数也设置为“TRUE”,是因为这样可以保证在启动数据库时把整个SGA读入到物理内存中,以便提高系统的效率(虽然会增加系统的启动时间)。
修改过程如下:
1.查看lock_sga和pre_page_sga参数的默认值
sys@ora10g> show parameter sga
NAME
--------------- -------------------- -----------------
lock_sga
pre_page_sga
sga_max_size
sga_target
2.注意:两个参数都是静态参数。确认之。
sys@ora10g> alter system set lock_sga=true;
alter system set lock_sga=true
ERROR at line 1:
ORA-02095: specified initialization parameter cannot be modified
sys@ora10g> alter system set pre_page_sga=true;
alter system set pre_page_sga=true
ERROR at line 1:
ORA-02095: specified initialization parameter cannot be modified
3.使用“scope=spfile”选项修改之,成功。
sys@ora10g> alter system set lock_sga=true scope=spfile;
System altered.
sys@ora10g> alter system set pre_page_sga=true scope=spfile;
System altered.
4.重新启动Oracle使spfile的修改生效
sys@ora10g> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
sys@ora10g> startup;
ORA-27102: out of memory
Linux-x86_64 Error: 12: Cannot allocate memory
“小坎坷”出现了,想一想,这里为什么会启动失败呢?
原因很简单,Linux操作系统对每一个任务在物理内存中能够锁住的最大值做了限制!需要手工进行调整。
5.“ORA-27102”及“Cannot allocate memory”问题处理
1)使用“ulimit -a”命令获得“max locked memory”的默认大小
ora10g@ secDB /home/oracle$ ulimit -a
core file size
data seg size
scheduling priority
file size
pending signals
max locked memory
max memory size
open files
pipe size
POSIX message queues
real-time priority
stack size
cpu time
max user processes
virtual memory
file locks
可见,一个任务可以锁住的物理内存最大值是32kbytes,这么小的值根本无法满足我们SGA的5G大小需求。
2)将其修改为无限大
(1)oracle用户是无法完成这个修改任务的
ora10g@ secDB /home/oracle$ ulimit -l unlimited
-bash: ulimit: max locked memory: cannot modify limit: Operation not permitted
(2)切换到root用户
ora10g@ secDB /home/oracle$ su - root
Password:
(3)在root用户下尝试修改,成功。
[root@secDB ~]# ulimit -l unlimited
[root@secDB ~]# ulimit -a
core file size
data seg size
scheduling priority
file size
pending signals
max locked memory
max memory size
open files
pipe size
POSIX message queues
real-time priority
stack size
cpu time
max user processes
virtual memory
file locks
6.调整完操作系统的限制后,我们再次尝试启动数据库。成功!
[root@secDB ~]# su - oracle
ora10g@ secDB /home/oracle$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.3.0 - Production on Sun Dec 20 22:21:40 2009
Copyright (c) 1982, 2006, Oracle.
Connected to an idle instance.
NotConnected@> startup;
ORACLE instance started.
Total System Global Area 5368709120 bytes
Fixed Size
Variable Size
Database Buffers
Redo Buffers
Database mounted.
Database opened.