日期:2014-05-16  浏览次数:20453 次

SHM不足导致导致数据库宕机

今天早上到办公室,开发说测试环境应用程序挂掉,看日志说是连接不上数据库,经查看,数据库在晚上10点的时候挂掉,告警日志报错如下:

WARNING: You are trying to use the MEMORY_TARGET feature. This feature requires the /dev/shm file system to be mounted for at least 7868514304 bytes.

/dev/shm is either not mounted or is mounted with available space less than this size. Please fix this so that MEMORY_TARGET can work as expected.

Current available is 7857356800 and used is 562315264 bytes. Ensure that the mount point is /dev/shm for this directory.

memory_target needs larger /dev/shm

???????? 启动数据库,报ORA-00845错误。

SQL> startup

ORA-00845: MEMORY_TARGET not supported on this system

原因是昨天下午3点多,测试人员说SHARED_POOL不够,要求增大SHARED_POOL,我们的数据库是11gR2,内存自动管理,MEMORY_TARGET的值为5GB,可是观察AWR报告的内存建议,1.8GBSHARED_POOL应该是够用的,可是测试的有需求,只好将MEMORY_TARGET改成8GB,我们的服务器是16GB的内存的RHEL 5.4操作系统,昨天下午测试人员一直在这套系统上工作,没有问题,晚上10点,数据库自动收集统计信息时,数据库挂掉。导致数据库挂掉的原因是MEMORY_TARGET超过了/dev/shm的大小。

??? /dev/shmLINUXtmpfs,一般都被理解为虚拟磁盘,但是它和虚拟磁盘还不一样,tmpfs是个文件系统,并不像虚拟磁盘是个块设备,tmpfs可以使用内存,内存不足时使用交换分区,也不需要使用mkfs命令创建,典型的 tmpfs 文件系统会完全驻留在内存中,所以对tmpfs的操作速度非常快,但是由于数据会保留在内存中,所以,当服务器关闭或重启后,这里面的数据会丢失。ORACLE使用的也是tmpfs,所以,MEMORY_TARGET不能超过/dev/shm的大小,就像MEMORY_TARGET不能超过MEMORY_MAX_TARGETSGA_TARGET不能超过SGA_MAX_SIZE的大小一样。

??? 我们的服务器16GB内存,/dev/shm的大小默认是操作系统内存的一半,但是由于16G的内存实际达不到16GB,所以/dev/shm的默认大小达不到8GB,如下:

[oracle@dbserver1 ~]$ cat /proc/meminfo | grep MemTotal

MemTotal:?????? 16444672 kB

??? 可以看到内存15.68GB,并没有达到16GB