今天做了几个后台删除表记录的运行的脚本,结果发现系统的/dev/shm目录下有很多以ora_开头的文件,都有什么用途。虽然经常在linux系统下看到shm设备,但却从没有太多的关心
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(特别提示,这两个参数即自动内存管理特性对应的初始化参数)的值。
  1. SQL> show parameter MEMORY_MAX_TARGET   
  2. NAME TYPE VALUE  
  3. ------------------------------------ ----------- ------------------------------  
  4. memory_max_target big integer 6400M  
  5. SQL> show parameter MEMORY_TARGET   
  6. NAME TYPE VALUE  
  7. ------------------------------------ ----------- ------------------------------  
  8. memory_target big integer 6400M 
如果在初始化参数中设置了MEMORY_MAX_TARGET 和MEMORY_TARGET 两参数为非0 值,并且不符合系统共享内存,则ORACLE 数据库启动时,就会触发ORA-00845:MEMORY_TARGET
not supported on this system 错误。
 
下面的摘自yangtingkun的技术文档:
 
http://yangtingkun.itpub.net/post/468/408235
 

 
Oracle 11g的Linux版本在修改了MEMORY_TARGET或者SGA_TARGET后启动可能会报错:
 
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORA-00845: MEMORY_TARGET not supported on this system
 

 
这个问题是由于设置SGA的大小超过了操作系统/dev/shm的大小:
 
[root@enterprice64 ~]# df -k /dev/shm
Filesystem 1K-blocks Used Available Use% Mounted on
tmpfs 4089416 0 4089416 0% /dev/shm
 
Oracle在metalink的文档:Doc ID:Note:460506.1中进行了说明。解决这个问题只有两个方法,一种是修改初始化参数,使得初始化参数中SGA的设置小于/dev/shm的大小,
另一种方法就是调整/dev/shm的大小。
 
修改/dev/shm的大小可以通过修改/etc/fstab来实现:
 
[root@enterprice64 ~]# vi /etc/fstab
 
LABEL=/ / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
LABEL=/data /data ext3 defaults 1 2
devpts /dev/pts devpts gid=5,mode=620 0 0
#tmpfs /dev/shm tmpfs defaults 0 0
tmpfs /dev/shm tmpfs defaults,size=10240M 0 0
LABEL=/home /home ext3 defaults 1 2
LABEL=/opt /opt ext3 defaults 1 2
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
LABEL=/usr /usr ext3 defaults 1 2
LABEL=/var /var ext3 defaults 1 2
LABEL=SWAP-sda8 swap swap defaults 0 0
~
~
"/etc/fstab" 13L, 965C written
[root@enterprice64 ~]# umount /dev/shm
[root@enterprice64 ~]# mount /dev/shm
[root@enterprice64 ~]# df -k /dev/shm
Filesystem 1K-blocks Used Available Use% Mounted on
tmpfs 10485760 0 10485760 0% /dev/shm
[root@enterprice64 ~]# su - oracle
[oracle@enterprice64 ~]$ sqlplus "/ as sysdba"
 
SQL*Plus: Release 11.1.0.6.0 - Production on Tue Oct 23 15:42:42 2007
 
Copyright (c) 1982, 2007, Oracle. All rights reserved.
 
Connected to an idle instance.
 
SQL> startup
ORACLE instance started.
 
Total System Global Area 4743446528 bytes
Fixed Size 2143824 bytes
Variable Size 3892316592 bytes
Database Buffers 805306368 bytes
Redo Buffers 43679744 bytes
Database mounted.
Database opened.
 
修改/etc/fstab,重新mount /dev/shm,然后就可以启动数据库了。