The following errors occurred while starting up a 12.2.0.1 Oracle database 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: sskgpcreates
The error “operation:semget failed with status: 28” points out that it could be semaphore resource issue.
Oracle 12.2.0.1 doc recommended minimum value for semaphore are :
kernel.sem = SEMMSL SEMMNS SEMOPM SEMMNI
SEMMSL - max semaphores per array
SEMMNS - max semaphores system wide
SEMOPM - max ops per semop call
SEMMNI - max number of arrays
semmsl = 250
semmns = 32000
semopm = 100
semmni = 128
Check current system configuration for semaphores:
$ cat /proc/sys/kernel/sem
250 32000 100 200
$ ipcs -ls
------ Semaphore Limits --------
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 100
max number of arrays = 200
semaphore max value = 32767
We can see SEMMNS is not right. it is supposed to be equal to SEMMSL*SEMMNI =250*200=50000.
If SEMMNS value too small, then we have to increase SEMMNI first, then adjust SEMMNS to SEMMSL*SEMMNI.
Set semaphore kernel parameter dynamically without the need for server reboot:
# sysctl -w kernel.sem="250 50000 100 200"
kernel.sem = 250 50000 100 200
-- Put into file
cat /etc/sysctl.conf | grep kernel.sem
kernel.sem = 250 50000 100 200
Or put into /etc/sysctl.conf file first, then
# sysctl -p
Then verify the current semaphore configurations:
# ipcs -ls
------ Semaphore Limits --------
max number of arrays = 200
max semaphores per array = 250
max semaphores system wide = 50000
max ops per semop call = 100
semaphore max value = 32767
Finally start up instance successfully.
SQL> startup
ORACLE instance started.
Total System Global Area 4294967296 bytes
Fixed Size 8801008 bytes
Variable Size 1073743120 bytes
Database Buffers 3187671040 bytes
Redo Buffers 24752128 bytes
Database mounted.
Database opened.