Docs/数据库/oracle/oracle锁表问题.md

1.3 KiB

查询被锁定的表

select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id;

查询发生锁定表的会话及序列号

select b.username,b.sid,b.serial#,logon_time from v$locked_object a,v$session b where a.session_id = b.sid order by b.logon_time;

结束产生锁表的会话

alter system kill session 'SID,SERIAL#'; 

结束锁表会话异常ORA-00031

# 查询处于KILLED状态的进程id
select b.spid,a.osuser,b.program from v$session a, v$process b where a.paddr=b.addr and a.sid=[SID];
kill -9 SPID

查询导致锁表的sql

SELECT
	A.USERNAME,
	A.MACHINE,
	A.PROGRAM,
	A.SID,
	A.SERIAL#,
	A.STATUS,
	C.PIECE,
	C.SQL_TEXT 
FROM
	V$SESSION A,
	V$SQLTEXT C 
WHERE
	A.SID IN ( SELECT DISTINCT T2.SID FROM V$LOCKED_OBJECT T1, V$SESSION T2 WHERE T1.SESSION_ID = T2.SID ) 
	AND A.SQL_ADDRESS = C.ADDRESS ( + ) 
ORDER BY
	C.PIECE;

查询导致锁表的sql语句

select l.session_id sid,
 s.serial#,
 l.locked_mode,
 l.oracle_username,
 s.user#,
 l.os_user_name,
 s.machine,
 s.terminal,
 a.sql_text,
 a.action 
from v$sqlarea a, v$session s, v$locked_object l
where l.session_id = s.sid
and s.prev_sql_addr = a.address
order by sid, s.serial#;