工作中碰到锁表,原因是本地环境和测试环境同事跑的一个扫表处理的时候,因为本地修改了入表参数,导致同事处理数据锁表了,
以下是查询锁表的sql:
select a.sid waited_session, --被阻塞的会话
a.event,
a.blocking_session for_kill_session, --源头,应该被kill掉
a.osuser, --客户端连接用户
a.PROGRAM, --客户端连接程序
a.schemaname, --客户端连接Schema,并不一定是被锁对象Owner
c.OWNER, --被锁对象Owner
c.object_name, --被锁对象名称
'alter system kill session '''||a.sid||','||a.serial#||''' immediate;' sql_kill_session
from v$session a,v$locked_object b,dba_objects c
where --a.event like 'enq: TX%' and
a.sid=b.session_id
and b.object_id=c.object_id
--and schemaname = Schema名称
--and lower(a.PROGRAM)=连接工具名称 一般让排在后面
--and osuser=用户名
order by schemaname;
查询到源头之后,需要进行杀死进程:
alter system kill session for_kill_session;