Linux下/dev/shm的大小引发ORA-00845: MEMORY_TARGET not supported on this system

2015-07-16 12:07:26 · 作者: · 浏览: 2


查看错误帮助信息
[oracle11@oracle11g dbs]$ oerr ora 845
00845, 00000, "MEMORY_TARGET not supported on this system"
// *Cause: The MEMORY_TARGET parameter was not supported on this operating system or /dev/shm was not sized correctly on Linux.
// *Action: Refer to documentation for a list of supported operating systems. Or, size /dev/shm to be at least the SGA_MAX_SIZE on each Oracle instance running on the system.



错误原因是这个操作系统不支持MEMORY_TARGET参数或/dev/shm在Linux上的大小不正确造成的,这是该操作系统上的第二个实例,第一个实例设置了MEMORY_TARGET参数,所以并不是不支持这个参数,原因就只有/dev/shm大小不正确了,解决方法是要将/dev/shm的最小值设置为操作系统上运行实例SGA_MAX_SIZE所设置的大小。/dev/shm/是linux下一个目录,/dev/shm目录不在磁盘上,而是在内存里,因此使用linux /dev/shm/的效率非常高,直接写进内存。
tmpfs有以下特点:
1.tmpfs 是一个文件系统,而不是块设备;您只是安装它,它就可以使用了。
2.动态文件系统的大小。
3.tmpfs 的另一个主要的好处是它闪电般的速度。因为典型的 tmpfs 文件系统会完全驻留在 RAM 中,读写几乎可以是瞬间的。
4.tmpfs 数据在重新启动之后不会保留,因为虚拟内存本质上就是易失的。所以有必要做一些脚本做诸如加载、绑定的操作。


linux下/dev/shm的容量默认最大为内存的一半大小,使用df -h命令可以看到。但它并不会真正的占用这块内存,如果/dev/shm/下没有任何文件,它占用的内存实际上就是0字节;如果它最大为1G,里头放有100M文件,那剩余的900M仍然可为其它应用程序所使用,但它所占用的100M内存,是绝不会被系统回收重新划分的。


linux /dev/shm容量(大小)是可以调整,在有些情况下(如oracle数据库)默认的最大一半内存不够用,并且默认的inode数量很低一般都要调高些,这时可以用mount命令来管理它。
mount -o size=1500M -o nr_inodes=1000000 -o noatime,nodiratime -o remount /dev/shm
在2G的机器上,将最大容量调到1.5G,并且inode数量调到1000000,这意味着大致可存入最多一百万个小文件通过/etc/fstab文件来修改/dev/shm的容量(增加size选项即可),修改后,重新挂载即可。


这里该实例的SGA_MAX_SIZE为1G,下面的命令查看/dev/shm的大小。
[root@oracle11g ~]# df -lh
Filesystem? ? ? ? ? ? Size? Used Avail Use% Mounted on
/dev/sda1? ? ? ? ? ? ? 23G? 20G? 1.6G? 93% /
/dev/sdb1? ? ? ? ? ? 9.9G? 5.8G? 3.6G? 62% /u02
tmpfs? ? ? ? ? ? ? ? 2G? ? 1.3M? 0.7G? 65% /dev/shm



从上面结果可以看到/dev/shm可用大小只有0.7G,执行下面的命令来进行修改。
[root@oracle11g ~]# vi /etc/fstab
LABEL=/? ? ? ? ? ? ? ? /? ? ? ? ? ? ? ? ? ? ? ext3? ? defaults? ? ? ? 1 1
/dev/sdb1? ? ? ? ? ? ? /u02? ? ? ? ? ? ? ? ? ? ext3? ? defaults? ? ? ? 1 2
tmpfs? ? ? ? ? ? ? ? ? /dev/shm? ? ? ? ? ? ? ? tmpfs? defaults,size=4G? ? ? ? 0 0
devpts? ? ? ? ? ? ? ? ? /dev/pts? ? ? ? ? ? ? ? devpts? gid=5,mode=620? 0 0
sysfs? ? ? ? ? ? ? ? ? /sys? ? ? ? ? ? ? ? ? ? sysfs? defaults? ? ? ? 0 0
proc? ? ? ? ? ? ? ? ? ? /proc? ? ? ? ? ? ? ? ? proc? ? defaults? ? ? ? 0 0
LABEL=SWAP-sda2? ? ? ? swap? ? ? ? ? ? ? ? ? ? swap? ? defaults? ? ? ? 0 0


"/etc/fstab" 7L, 540C written



卸载/dev/shm,但/dev/shm正被访问
[root@oracle11g ~]#? umount /dev/shm
umount: /dev/shm: device is busy
umount: /dev/shm: device is busy



用fuser处理,fuser命令,-k:kill processes accessing the named file(杀死所有正在访问指定文件的进程),-m 表示指定文件所在的文件系统或者块设备(处于 mount 状态)。所有访问该文件系统的进程都被列出。
[root@oracle11g ~]# fuser -km /dev/shm
/dev/shm:? ? ? ? ? ? 3152m? 3154m? 3156m? 3160m? 3162m? 3164m? 3166m? 3168m? 3170m? 3172m? 3174m? 3176m? 3178m? 3180m? 3182m? 3184m? 3186m? 3193m? 3195m? 3197m? 3199m? 3201m? 3236m? 3248m? 3250m? 3256m? 3292m? 4366m
[root@oracle11g ~]#? umount /dev/shm
[root@oracle11g ~]# mount /dev/shm
[root@oracle11g ~]# df -lh
Filesystem? ? ? ? ? ? Size? Used Avail Use% Mounted on
/dev/sda1? ? ? ? ? ? ? 23G? 20G? 1.6G? 93% /
/dev/sdb1? ? ? ? ? ? 9.9G? 5.8G? 3.6G? 62% /u02
tmpfs? ? ? ? ? ? ? ? 4.0G? ? 0? 4.0G? 0% /dev/shm



再重新启动实例
SQL> startup nomount pfile=/u03/app/oracle/11.2.0/db/dbs/initcssb.ora
?ORACLE instance started.


Total System Global Area 1334786560 bytes
?Fixed Size 1364480 bytes
?Variable Size 171970048 bytes
?Database Buffers 1155189248 bytes
?Redo Buffers 6262784 bytes


小结:Oracle 11g的AMM内存管理模式就是使用/dev/shm,所以有时候修改MEMORY_TARGET或者MEMORY_MAX_TARGET会出现ORA-00845的错误,在安装配置实例内存时为了避免出现这个故障可以对Linux系统中的/dev/shm进行调整,让其可用大小至少等于实例的sga_max_size。