oracle provides solutions for querying lock tables and unlocking situations
- 2020-12-13 19:09:41
- OfStack
If a lock wait occurs, we may be more interested in knowing who locked the table and caused whose wait
The following statement can be used to query who has locked the table:
SELECT /*+ rule */ s.username,
decode(l.type,'TM','TABLE LOCK',
'TX','ROW LOCK',
NULL) LOCK_LEVEL,
o.owner,o.object_name,o.object_type,
s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser
FROM v$session s,v$lock l,dba_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT NULL
The following statement can query who is waiting:
SELECT /*+ rule */ lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username User_name, o.owner,o.object_name,o.object_type,s.sid,s.serial#
FROM v$locked_object l,dba_objects o,v$session s
WHERE l.object_id=o.object_id
AND l.session_id=s.sid
ORDER BY o.object_id,xidusn DESC
Unlock command:
alter system kill session 'sid,serial#'
1).
select LOCK_INFO.OWNER || '.' || LOCK_INFO.OBJ_NAME as " The object name has been invoked ", -- Object name � ( Already occupied )
LOCK_INFO.SUBOBJ_NAME as " Child object names have been acquired ", -- Child object names ( Already occupied )
SESS_INFO.MACHINE as " � � device name ", -- � � device name
LOCK_INFO.SESSION_ID as " � � ID", -- � � SESSION_ID
SESS_INFO.SERIAL# as " � � SERIAL#", -- � � SERIAL#
SESS_INFO.SPID as "OS Department of � SPID", -- OS Department of � SPID
(SELECT INSTANCE_NAME FROM V$INSTANCE) " � case name SID", -- � case name SID
LOCK_INFO.ORA_USERNAME as "ORACLE With � ", -- ORACLE By name
LOCK_INFO.OS_USERNAME as "OS With � ", -- In the form and in the name
LOCK_INFO.PROCESS as " � cheng � � ", -- � cheng � �
LOCK_INFO.OBJ_ID as " � like ID", -- � like ID
LOCK_INFO.OBJ_TYPE as " � � type ", -- � � type
SESS_INFO.LOGON_TIME as " Deng � � � ", -- Deng � � �
SESS_INFO.PROGRAM as " The program name � ", -- The program name �
SESS_INFO.STATUS as " � � � � ", -- � � � �
SESS_INFO.LOCKWAIT as " Waiting for � ", -- Waiting for �
SESS_INFO.ACTION as " � a ", -- � a
SESS_INFO.CLIENT_INFO as " Guest � � � " -- Guest � � �
from (select obj.OWNER as OWNER,
obj.OBJECT_NAME as OBJ_NAME,
obj.SUBOBJECT_NAME as SUBOBJ_NAME,
obj.OBJECT_ID as OBJ_ID,
obj.OBJECT_TYPE as OBJ_TYPE,
lock_obj.SESSION_ID as SESSION_ID,
lock_obj.ORACLE_USERNAME as ORA_USERNAME,
lock_obj.OS_USER_NAME as OS_USERNAME,
lock_obj.PROCESS as PROCESS
from (select *
from all_objects
where object_id in (select object_id from v$locked_object)) obj,
v$locked_object lock_obj
where obj.object_id = lock_obj.object_id) LOCK_INFO,
(select SID,
SERIAL#,
LOCKWAIT,
STATUS,
(select spid from v$process where addr = a.paddr) spid,
PROGRAM,
ACTION,
CLIENT_INFO,
LOGON_TIME,
MACHINE
from v$session a) SESS_INFO
where LOCK_INFO.SESSION_ID = SESS_INFO.SID
order by LOCK_INFO.SESSION_ID;
2).
select sql_text
from v$sqltext
where address in (select sql_address from v$session where sid = &sid)
order by piece;
3).
ALTER SYSTEM KILL SESSION ' � � ID, � � SERIAL#';
4).
kill-9 OS is derived from SPID