最近的uat数据库迁移,由于是多个db需要迁移到同一台机器,一部分完成后,启动后续数据库碰到了ora-27102错误,提示内存超出,查
最近的uat数据库迁移,由于是多个db需要迁移到同一台机器,一部分完成后,启动后续数据库碰到了ora-27102错误,提示内存超出,查看系统可用内存,远大于需要启动数据库的sga和pga,究竟是怎么一回事呢?如果你也碰到类似错误,不妨往下看。
1、故障现象
oracle@v2013db02u:~> cat /etc/issue
welcome to suse linux enterprise server 10 sp3 (x86_64) - kernel \r (\l).
oracle@v2013db02u:~> sqlplus / as sysdba
sql*plus: release 10.2.0.3.0 - production on sat mar 30 09:46:57 2013
copyright (c) 1982, 2006, oracle. all rights reserved.
connected to an idle instance.
sql> startup pfile=/u02/database/mhuat02/initmhuat02.ora
ora-27102: out of memory
linux-x86_64 error: 28: no space left on device
sql> ho oerr ora 27102
27102, 00000, out of memory
// *cause: out of memory
// *action: consult the trace file for details
2、分析与解决
--首先查看了系统实际可用内存
--系统实际可用内存还剩50多个gb呢
sql> exit
disconnected
oracle@v2013db02u:/u02/database> free -m
total used free shared buffers cached
mem: 64435 5968 58467 0 3 4045
-/+ buffers/cache: 1919 62516
swap: 32773 1232 31540
--metalink上给出了关于这个问题的描述 [id 301830.1]
--是由于kernel.shmall值设置太小引起的
kernel.shmall
该参数用于配置系统一次能够使用的最大的共享页面数,该参数的值总是ceil(shmmax/page_size)
oracle 9i,10g的x86以及x86-64平台推荐以及缺省的大小通常为2097152
在大多数情况下,该参数是够用的。按照上述计算方式页面内存总大小可以达到8gb(2097152*4096 bytes (shmall*page_size))
通常情况下,page_size 的大小为4096byte,除非使用了big pages 或 huge pages
对于超出8gb系统内存,如共享内存段(shmmax)的最大大小是16g,则所需要共享内存页数(shmall)为16gb/4kb=16777216kb/4kb=4194304(页)
32gb,,64gb可以依上述方式类推。
--下面查看本机的设置
v2013db02u:~ # getconf page_size
4096
v2013db02u:~ # /sbin/sysctl -a | grep shm
vm.hugetlb_shm_group = 0
kernel.shmmni = 4096 --定义共享内存段的最大数量,也就是可以开辟多少个共享内存段,一般够用
kernel.shmall = 2097152 --由于当前server有多个db运行,应该是总页数超出所致
kernel.shmmax = 4294967296 --定义单个共享内存段的最大值,由于当前server没有sga大于4gb的,可以保留原值
--前面我们在使用free时,系统使用内存已经超出了4gb,也表明shmall的超出了最大的共享页面数
--author : robinson
--blog :
v2013db02u:~ # vi /etc/sysctl.conf --修改kernel.shmall的值,将其改为16gb能容纳的页面数,使用root身份
v2013db02u:~ # sysctl -p --使修改立即生效,无需重启server
v2013db02u:~ # /sbin/sysctl -a | grep shm
vm.hugetlb_shm_group = 0
kernel.shmmni = 4096
kernel.shmall = 4194304
kernel.shmmax = 4294967296
--再次启动db正常
oracle@v2013db02u:~> export oracle_sid=mhuat02
oracle@v2013db02u:~> sqlplus / as sysdba
sql*plus: release 10.2.0.3.0 - production on sat mar 30 10:29:18 2013
copyright (c) 1982, 2006, oracle. all rights reserved.
connected to an idle instance.
sql> startup pfile=/u02/database/mhuat02/initmhuat02.ora
oracle instance started.
total system global area 599785472 bytes
fixed size 2074568 bytes
variable size 167774264 bytes
database buffers 423624704 bytes
redo buffers 6311936 bytes
database mounted.
database opened.