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

eric0435發表於2015-06-16

Linux作業系統,oracle 11.2.0.4 啟動例項時出現如下錯誤:

SQL> startup nomount pfile=/u03/app/oracle/11.2.0/db/dbs/initcssb.ora
ORA-00845: MEMORY_TARGET not supported on this system

檢視錯誤幫助資訊

[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。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26015009/viewspace-1700776/,如需轉載,請註明出處,否則將追究法律責任。

相關文章