Thursday, January 4, 2007

Killing an oracle session to remove a lock

I always have to search around for the right commands in order to remove table locks in Oracle. Thought I'd post and hopefully will remember I can look her for it in the future. Below seems to work at least in 8/9i.

Identifying the locks:


SELECT l.inst_id,
SUBSTR(L.ORACLE_USERNAME,1,8) ORA_USER,
SUBSTR(L.SESSION_ID,1,3) SID,
S.serial#,
SUBSTR(O.OWNER||'.'||O.OBJECT_NAME,1,40) OBJECT, P.SPID OS_PID,
DECODE(L.LOCKED_MODE, 0,'NONE',
1,'NULL',
2,'ROW SHARE',
3,'ROW EXCLUSIVE',
4,'SHARE',
5,'SHARE ROW EXCLUSIVE',
6,'EXCLUSIVE',
NULL) LOCK_MODE
FROM sys.GV_$LOCKED_OBJECT L
, DBA_OBJECTS O
, sys.GV_$SESSION S
, sys.GV_$PROCESS P
WHERE L.OBJECT_ID = O.OBJECT_ID
and l.inst_id = s.inst_id
AND L.SESSION_ID = S.SID
and s.inst_id = p.inst_id
AND S.PADDR = P.ADDR(+)
order by l.inst_id


Deep Six the session:

The SID and the SERIAL# fields can then be used to issue the kill command:


ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;


Using this combo I almost never have to resort to a "kill -9 OS_PID" on the database server itself.

No comments: