devshm目录下产生大量的ora$ORACLESID_的二进制文件
下午在检查一个新上线的生产库的时候,发现了一个问题:
为什么/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等的参考值,来调整数据库的相关参数,并把数据库内存管理变为手动。 因为开启自动内存管理,也是有一些不可预测的风险,好比如,既然想让它为你多做事情,就得承担多一点的风险! 当然这个看自己权衡利弊。