読者です 読者をやめる 読者になる 読者になる

カタカタブログ

SIerで働くITエンジニアがカタカタした記録を残す技術ブログ。Java, Oracle Database, Linuxが中心です。たまにRuby on Railsなども。

DBを落とさずOSを落とすとORA-27154エラーが出てDBが起動しなくなったときの対処法

Oracle DBのインスタンスを落とさずにOSをshutdownすると
次回OS起動時にDBが上がらなくなった。。
セマフォカーネルパラメータを増やすと解消できたので、対処法をメモ。

[環境]
DB: Oracle DB 11gR2
OS: CentOS6.3

OSシャットダウン後にDBスタートアップしようとすると以下のORA-27154エラー。

[oracle@localhost ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Fri Jan 24 10:24:50 2014

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> startup
ORA-27154: post/wait create failed
ORA-27300: OS system dependent operation:semget failed with status: 28
ORA-27301: OS failure message: No space left on device
ORA-27302: failure occurred at: sskgpsemsper

セマフォが解放されていないっぽい。

ググると、以下の方法で対処できるよう。
参考: http://kabusobu.blog.so-net.ne.jp/2010-07-29-2

一時的にカーネルパラメータを変更し、セマフォの数を増やす。
/etc/sysctl.confのkernel.semの値を一時的にデフォルトの100から10000に上げる。

[root@localhost ~]# cp -p /etc/sysctl.conf /etc/sysctl.conf.org
[root@localhost ~]# vim /etc/sysctl.conf
[root@localhost ~]# diff /etc/sysctl.conf /etc/sysctl.conf.org
47c47
< kernel.sem = 250  10000
---
> kernel.sem = 250  100
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
fs.file-max = 6815744
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_max = 1048576
kernel.sem = 250  10000

そうすると、以下のようにDBインスタンス起動に成功した。

SQL> startup
ORACLE instance started.

Total System Global Area  784998400 bytes
Fixed Size                  2217464 bytes
Variable Size             591399432 bytes
Database Buffers          188743680 bytes
Redo Buffers                2637824 bytes
Database mounted.
Database opened.

なお、正常起動後は上で追加したセマフォの値を10000 -> 100に戻しても
次回は正常に起動できたので、戻しておく。