select * from v$session_blockers; 或者 select * from gv$session_blockers; (在rac情况下)
通过 select count(1) from v$locked_object; 可以查出内容
首先询问客户能否提供lock table的session sid和serial#,如果客户只能提供session sid,则
可以使用:
select sid,serial#,machine,program from v$session where sid=*;
如果用户无法提供lock table的session信息则使用下面的语句查询:
col program for a20
col spid for a10
select L.TYPE TYPE,
to_number(round(L.CTIME/60)) locktime,
L.SID SID,
S.SERIAL# SERIAL#,
p.spid spid,
s.program program
from V$LOCK L,
V$SESSION S,
V$PROCESS P
where L.SID = S.SID
and P.ADDR=S.PADDR(+)
and L.type in ('TM')
and S.USERNAME not in ('SYS')
order by locktime desc;
或者:
select sid,serial#,sql_id,status,blocking_session from v$session where sid in (select session_id from v$locked_object);
TY为锁类型:
LOCKTIME为锁定时间(分钟)
LOCKTIME(分钟)最大的,一般排在第一位
--将session的sid和serial#报给客户,确认是否可以kill。
alter system kill session '1210,39611' immediate;
通过select * from v$session_blocker;可以查询出内容
可以通过下面的命令查询出产生lock的session的sql语句
select sql_text from v$sqltext where sql_id=(select sql_id from v$session where sid=1522 and serial#=39333);
检查锁问题
oracle 查到锁的源头 blocking_session为源头,
select last_call_et,v.event,
s.sql_id,
--- s.SQL_FULLTEXT,
s.SQL_TEXT,
v.inst_id,
V.SID,
V.CLIENT_IDENTIFIER,
v.blocking_session,
v.blocking_session_status,
'alter system kill session ''' || v.sid || ',' || v.serial# || ''' immediate;',
v.USERNAME,
s.CPU_TIME,
s.ELAPSED_TIME,
v.PROGRAM,
'kill -9 ' || p.spid,
v.CLIENT_INFO,
v.SQL_HASH_VALUE,
v.SQL_ADDRESS,
v.MACHINE,
v.TERMINAL, s.DISK_READS,s.BUFFER_GETS,s.SORTS,s.SHARABLE_MEM,s.PERSISTENT_MEM,s.RUNTIME_MEM,s.ROWS_PROCESSED
from gv$session v, gv$process p, gv$sql s
where v.last_call_et > 0
and v.status = 'ACTIVE'
and v.username != 'SYS'
and p.addr = v.paddr
and s.ADDRESS = v.SQL_ADDRESS
and s.HASH_VALUE = v.SQL_HASH_VALUE
order by last_call_et desc;
杀掉源头blocking_session
select CLIENT_IDENTIFIER,v.inst_id,v.status,'alter system kill session ''' || v.sid || ',' || v.serial# || ''' immediate;', v.USERNAME, v.CLIENT_INFO,v.SQL_HASH_VALUE,v.SQL_ADDRESS,v.MACHINE,v.TERMINAL from gv$session v where sid='XXX';
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;