Introduction:
Some times if the database shut down is not graceful, shared memory wont be released. In that case if you try to login and start the database you will get following error.
-bash-2.05b$ sqlplus /nolog
SQL*Plus: Release 8.1.7.0.0 – Production on Thu Jun 26 12:57:25 2008
(c) Copyright 2000 Oracle Corporation. All rights reserved.
SQL> connect / as sysdba
ERROR:
ORA-03113: end-of-file on communication channel
To resolve such issues, you can check the shared memory and semaphores that are blocked by or locked by the defunct oracle processes. Before that here is the bried understanding of Shared memory segments and semaphores in UNIX.
Shared Memory Segments
Shared memory allows processes to access common structures and data by placing them in shared memory segments. It’s the fastest form of Interprocess Communication (IPC) available since no kernel involvement occurs when data is passed between the processes. In fact, data does not need to be copied between the processes.
Oracle uses shared memory segments for the Shared Global Area (SGA) which is an area of memory that is shared by Oracle processes. The size of the SGA has a significant impact to Oracle’s performance since it holds database buffer cache and much more.
To see all shared memory settings, execute:
-bash-3.00$ ipcs -lm
—— Shared Memory Limits ——–
max number of segments = 4096
max seg size (kbytes) = 4194303
max total shared memory (kbytes) = 8388608
min seg size (bytes) = 1
The max value of Shared Memory segment is decided by SHMMAX parameter.
ipcs -m will give you the shared memory segments, its size and which user owns the segment.
-bash-3.00$ ipcs -m
—— Shared Memory Segments ——–
key shmid owner perms bytes nattch status
0x0001ffb8 0 root 666 76 3
0x00025990 32769 root 666 8308 3
0x00027cb9 65538 root 666 132256 1
0x00027cba 98307 root 666 132256 1
0xf771930c 1277956 oracle01 660 2166358016 144
Semaphores
You can see semaphores setting using ipcs -ls
-bash-3.00$ ipcs -ls
—— Semaphore Limits ——–
max number of arrays = 1100
max semaphores per array = 1100
max semaphores system wide = 32000
max ops per semop call = 100
semaphore max value = 32767
SEMMSL parameter determinies the max size of semaphores.
You can see the various semaphores assigned to different processes using
-bash-3.00$ ipcs -s
—— Semaphore Arrays ——–
key semid owner perms nsems
0x00000000 393216 root 666 1
0x00000000 425985 root 666 1
0x00000000 458754 root 666 1
0x00000000 491523 root 666 1
0x0001ffb8 524292 root 666 1
0x000251c0 557061 root 666 1
0x000255a8 589830 root 666 1
0x00025990 622599 root 666 1
0x000278d1 655368 root 666 1
0x00027cb9 688137 root 666 1
0x000278d2 720906 root 666 1
0x00027cba 753675 root 666 1
0x26e55b68 3244044 oracle01 660 1004
You can also see the semaphores and Shared Memory Segments assigned to oracle processes using Oracle utility sysresv
-bash-3.00$ sysresv
IPC Resources for ORACLE_SID “tkr12r3m2” :
Shared Memory:
ID KEY
1277956 0xf771930c
Semaphores:
ID KEY
3244044 0x26e55b68
Oracle Instance alive for sid “tkr12r3m2”
If the instance is not alive you can remove the shared memory segments and semaphores using ipcrm command
ipcrm -m <Shared Memory ID (shmid)>
ipcrm -s <Semaphore ID (semid)>
Hope this helps !!