一 问题描述
执行普通的grant授权sql(grant select,update on 表名 to 用户名)好几分钟都没反应,跟被阻塞了似的。
二 问题排查
#排查是否有阻塞
用OEM可以看到阻塞信息:
点‘性能’-‘阻塞会话’:
下面那个会话2958是我执行grant sql的会话。
/*
在执行grant前,先查询下当前会话的sid:
select userenv('sid') from dual;
2958
*/
所以猜测是上面那个实例的那个会话id为6730的会话阻塞了下面那个2958的会话。
三 解决办法-终止阻塞源端会话
点击阻塞源会话的sql_id,可以看到该sql的文本,跟开发同事确认下能否kill,可以kill的话,将其kill。
选中该会话,点击上面的‘终止会话’的按钮进行kill。
有时发现终止该会话不管用,还能看到这种阻塞。手动用alter system kill session也不管用。
这时可以用kill -9 进程号的方式在操作系统层面进行kill。
#生成kill sql
select a.inst_id,a.sid,a.serial#,b.spid, 'kill -9 '||b.spid
from gv$session a
inner join gv$process b on a.paddr = b.addr
where sid=6730
and a.sql_id in('9wr2bqm4j3q37')
and a.inst_id=2
#执行上面的kill -9 命令即可