2014.11.18
下午在检查一个新上线的生产库的时候,发现了一个问题:

为什么/u01 使用了41G,明明这个目录下面只有oracle的安装软件和system.sysaux表空间,大小加起来也就几个G,而且使用du -sh /u01 显示确实只有8.3G。
同时 这里显示/dev/shm使用了30G,我就纳闷呢!找原因。
去到/dev下面 再du -sh 一下,显示shm 有三十多个G,同时去到看到大量的ora_ORACLE_SID_开头的文件,文件大小加起来刚开30G左右。
第一次看到,一头雾水,还以为是数据库里面的那个参数位置指定错了
于是查看归档路径,查一些可以查看的参数路径,结果一无所获。
为什么这下数据库产生的文件会跑到/dev/shm 下面呢。
网上找到了一篇相关了博客,截取一点解释:
1)什么是/dev/shm
它就是所谓的tmpfs,从名字可以看出是一个临时的文件系统,有人说跟ramdisk(虚拟磁盘),但不一样。使用/dev/shm的好处就是读取数据相当快,因为典型的 tmpfs 文件系统会
完全驻留在 RAM 中,读写几乎可以是瞬间的。同时,要注意的是,在/dev/shm中的文件在系统重启后会被清除掉。
tmpfs默认大小一般为物理内存的一半,当然可以修改tmpfs的大小。一般在fstab上可以看到
tmpfs /dev/shm tmpfs defaults 0 0
如果要将tmpfs的大小修改为4G,可以对上面的做适当的修改即可,如:
tmpfs /dev/shm tmpfs defaults,size=4096M 0 0
(2)/dev/shm对oracle 11g的影响
ORACLE 从11g版本开始,引入了一个自动内存管理(Automatic Memory Management)特性,该特性需要更多的共享内存(/dev/shm),因此如果决定应用该特性的话,
必须要确保共享内存大于ORACLE 中初始化参数MEMORY_MAX_TARGET 和MEMORY_TARGET(特别提示,这两个参数即自动内存管理特性对应的初始化参数)的值。
Oracle在metalink的文档:Doc ID:Note:460506.1中进行了说明。解决这个问题只有两个方法,一种是修改初始化参数,使得初始化参数中SGA的设置小于/dev/shm的大小,
另一种方法就是调整/dev/shm的大小。
现在我的问题是磁盘不允许增大shm,当然以前也做过增大shm的满足oracle的内存的需求。
既然这两种方法都不行,我想到的是关闭自动内存管理,会不会解决这个问题
果然我现在先在自己的本子上的11.2.0.1 中实验得到了理想的结果
下面是贴出刚刚正式环境的变化情况
关闭前: 磁盘的使用情况:
[oracle@xxxx~]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 50G 20G 28G 42% /
tmpfs 64G 30G 34G 48% /dev/shm
/dev/sda1 291M 36M 240M 14% /boot
/dev/sda4 30G 173M 28G 1% /tmp
/dev/sda5 47G 41G 3.9G 92% /u01
这是关闭后的:
[oracle@xxxx ~]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 50G 20G 28G 42% /
tmpfs 64G 424K 64G 1% /dev/shm
/dev/sda1 291M 36M 240M 14% /boot
/dev/sda4 30G 173M 28G 1% /tmp
/dev/sda5 47G 8.5G 36G 20% /u01
效果很明显
让后去到/dev/shm 下面发现所有的ora_ORACLE_SID_开头的文件都没有了。
[oracle@xxxx shm]$ ll
total 424
-r--------. 1 oracle dba 67108904 Oct 13 14:51 pulse-shm-1960468867
-r--------. 1 gdm gdm 67108904 Oct 13 14:50 pulse-shm-2383950921
-r--------. 1 oracle dba 67108904 Oct 13 14:50 pulse-shm-3779625268
-r--------. 1 oracle dba 67108904 Oct 13 15:01 pulse-shm-410992017
-r--------. 1 oracle dba 67108904 Oct 13 14:50 pulse-shm-465023947
[oracle@xxxx shm]$
这里说说我的看法:
一般情况下,数据库刚建立的时候,建议是自动管理,等运行一段时间,或者进入正常的时候,根据个人经验和awr.addm等的参考值,来调整数据库的相关参数,并把数据库内存管理变为手动。
因为开启自动内存管理,也是有一些不可预测的风险,好比如,既然想让它为你多做事情,就得承担多一点的风险!
当然这个看自己权衡利弊。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30936525/viewspace-2016692/ ,如需转载,请注明出处,否则将追究法律责任。