检查被阻塞会话的等待事件
更新语句以后没有响应,明显是被锁住了,那么现在这个会话经历的是什么等待事件呢?
SQL> SELECT sid,event,username,SQL.SQL_text 2 FROM v$session s,v$SQL SQL 3 WHERE s.SQL_id=SQL.SQL_id 4 AND SQL.SQL_text LIKE 'update emp set ename%'; SID EVENT USERNAME SQL_TEXT ---------- ------------------------- --- ------------------------------------------- 79 enq: TX - ROW LOCK contention ENMOTECH UPDATE emp SET ename='ENMOTECH' WHERE empno=7369
以上使用的是关联v$SQL的SQL语句,实际上通过登录用户名等也可以快速定位被锁住的会话。
得知等待事件是enq: TX – row lock contention,行锁,接下来就是要找到谁锁住了这个会话。在10gR2以后,只需要gv$session视图就可以迅速定位blocker,通过BLOCKING_ INSTANCE和BLOCKING_SESSION字段即可。
SQL> SELECT SID,INST_ID,BLOCKING_INSTANCE,BLOCKING_SESSION FROM gv$session WHERE INST_ID=2 AND SID=79; SID INST_ID BLOCKING_INSTANCE BLOCKING_SESSION ---------- ---------- ----------------- ---------------- 79 2 1 73
上述方法是最简单的,如果是使用更传统的方法,实际上也并不难,从gv$lock视图中去查询即可。
SQL> SELECT TYPE,ID1,ID2,LMODE,REQUEST FROM v$lock WHERE sid=79; TY ID1 ID2 LMODE REQUEST -- ---------- ---------- ---------- ---------- TX 589854 26267 0 6 AE 100 0 4 0 TM 79621 0 3 0 SQL> SELECT INST_ID,SID,TYPE,LMODE,REQUEST FROM gv$Lock WHERE ID1=589854 AND ID2=26267; INST_ID SID TY LMODE REQUEST ---------- ---------- -- ---------- ---------- 2 79 TX 0 6 1 73 TX 6 0
已经确认了可以kill掉session之后,需要再找到相应session的serail#,这是kill session时必须输入的参数。
SQL> SELECT SID,SERIAL# FROM gv$session WHERE INST_ID=1 AND SID=73; SID SERIAL# ---------- ---------- 73 15625
如果是11gR2数据库,那么直接在实例2中加入@1参数就可以杀掉实例1中的会话,如果是10g,那么登入实例1再执行kill session的操作。
SQL> ALTER system KILL SESSION '73,15625,@1'; System altered.
再检查之前被阻塞的更新会话,可以看到已经更新成功了。
SQL> UPDATE emp SET ename='ENMOTECH' WHERE empno=7369; 1 ROW updated.
最后修改时间:2019-07-24 17:07:05
「喜欢文章,快来给作者赞赏墨值吧」
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。