ITPub博客

首页 > 数据库 > Oracle > How to Find which Session is Holding a Particular Library Cache Lock

How to Find which Session is Holding a Particular Library Cache Lock

原创 Oracle 作者:DB_BLOCK 时间:2014-10-27 10:47:32 0 删除 编辑

  1. How to Find which Session is Holding a Particular Library Cache Lock

  2. 如何找到会话持有的锁为Library Cache Lock

  3. 今天在生产上开发说一个view删除不了,我试了一下,也不行。无思路,光辉说看看等待事件。

  4. select w.SID,
  5.        w.EVENT,
  6.        w.STATE,
  7.        round(w.SECONDS_IN_WAIT / 60 / 60, 2) hours,
  8.        s.USERNAME,
  9.        s.COMMAND,
  10.        s.BLOCKING_SESSION
  11.   from v$session_wait w, v$session s
  12.  where s.SID = w.SID
  13.    and w.STATE = \'WAITING\'
  14.    and w.wait_class <> \'Idle\'
  15.  order by w.SECONDS_IN_WAIT desc
  16.  
  17. 发现有个SID为2039的 Library Cache Lock 的等待事件,查看MOS,MOS上说有两种方法可以查看。

  18. 1. EXAMINE THE X$KGLLK TABLE

  19. X$KGLLK表只能被SYS/INTERNAL用户访问

  20. 通过关联v$sql去查sql_text时查不到东西。


  21. -查看等待事件为librarycache lock的session 的session address (SADDR):

  22. SQL> select sid,saddr from v$session where event=\'library cache lock\';

  23.        SID SADDR
  24. ---------- ----------------
  25.       2039 000000069C6D09A8



  26. SQL> select kgllkhdl Handle, kgllkreq Request,kglnaobj Object from x$kgllk where kgllkses = \'000000069C6D09A8\' and kgllkreq > 0;

  27. HANDLE REQUEST                             OBJECT
  28. ---------------- ---------- --------------------------------
  29. 00000004109DDDE0 3 MV_F_JIESUAN_VIEW


  30. /*我要删除的正是这个view*/

  31. --查看该回话的连接程序和用户名:
  32. select sid,username,terminal,program from v$session where saddr = \'000000069C6D09A8\';


  33. --或者直接通过回话的ADDR查到用户名,终端,程序

  34. select sid, username, terminal, program
  35.   from v$session
  36.  where saddr in
  37.        (select kgllkses
  38.           from x$kgllk lock_a
  39.          where kgllkreq > 0
  40.            and exists (select lock_b.kgllkhdl
  41.                   from x$kgllk lock_b
  42.                  where kgllkses = \'572eac94\' /* blocking session */
  43.                    and lock_a.kgllkhdl = lock_b.kgllkhdl
  44.                    and kgllkreq = 0));
  45.                    
  46. --根据SID,去查到serial#,然后kill掉:

  47. select sid,serial# from v$session where sid=\'XXX\' /*sid number*/

  48. alter system kill session \'SID,serial#\' immediate;


  49. 二、另外一种方法是通过oradebug做dump这里不再赘述




  50. 参考MOS ID:122793.1

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29210156/viewspace-1310540/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2013-09-25

  • 博文量
    12
  • 访问量
    130817