本文了解下等待事件library cache lock,进一步理解library cache,之前的文章请见:
  深入理解shared pool共享池之library cache的library cache pin系列三

相关图例

为了真观理解library cache pin及library cache lock的联系,有个图:

结论

1,道理同library cache pin一样,诊断library cache lock也要使用v$session及dba_kgllock
2, library cache lock是由于library cache pin所引发的,即后者是原因
    因为如果会话想修改或查看对象,必须对对象持锁后获取一个PIN,即先要获取library cache pin,然后才是library cache lock
3, 从DUMP LIBRARY CACHE的结构来看,
可见基于前文:多了lock waiters结构,从LIBRARY CACHE LOCK的含义可见,必须先要获取LIBRARY CACHE PIN,方可获取到LIBRARY CACHE LOCK,现在明显LIBRARY CACHE PIN被其它会话占用,所以获取不到,
只有等待,这样就产生了LIBRARY CACHE LOCK,也就是说只要产生LIBRARY CACHE LOCK,必然存在LIBRARY CACHE PIN,而如果出现LIBRARY CACHE PIN,不一定会出现LIBRARY CACHE LOCK

4,所以在产生LIBRARY CACHE PIN要马上处理,以防在业务高期连锁出现library cache lock,最终把业务拖死
5,当然上述我们只是从原理来分析下library cache pin及library cache lock,可以直接采用如下脚本,直接找到原因(不过你明白了LIBRARY CACHE的原因,会更有助于解决与此相关的故障)
当然你直接通过blocking_session也可以更为真观直接找到引发library cache lock的元凶,直观原因是library cache pin,最后原因是执行存储过程
也可以说明library cache lock不是latch,而是锁lock
SQL> select sid,serial#,saddr,event,blocking_session from v$session where sid in (111,116,121);

SID    SERIAL# SADDR            EVENT                          BLOCKING_SESSION
---------- ---------- ---------------- ------------------------------ ----------------
       111        101 00000000A4720168 library cache lock                          121
       116        153 00000000A4726CC0 SQL*Net message from client
       121        215 00000000A472D818 library cache pin                           116
6,library cache lock和library cache pin一样,不是LATCH,它是LOCK锁

测试

library cache lock的含义:
1,用于管理并发访问library cache
2,pinning一个对象,即会把HEAP加载到内存中,也就是说获取到PIN后,方可把HEAP加载到内存中
3,如果会话想修改或查看对象,必须对对象持锁后获取一个PIN,即先要获取library cache pin,然后才是library cache lock

在上述前文的继续,如果新开一个会话编译存储过程,则会产生library cache lock

SQL> select sid from v$mystat where rownum=1;

SID
----------
       111

SQL> alter procedure proc_hard_parse compile;

SQL> select sid,event,p1,p2,p3 from v$session_wait where sid in (116,121,111);

SID EVENT                                                                    P1         P2         P3
---------- ---------------------------------------------------------------- ---------- ---------- ----------
       111 library cache lock                                               2739958280 2664431712        301
       116 SQL*Net message from client                                      1650815232          1          0
       121 library cache pin                                                2739958280 2663017352        301

--查询与library cache lock相关的LATCH
SQL> select latch#,name from v$latch where lower(name) like '%library cache lock%';

LATCH# NAME
---------- --------------------------------------------------
       218 library cache lock
       221 library cache lock allocation

--library cache lock LATCH的信息
SQL> select latch#,name from v$latch_children where lower(name) like '%library cache lock%';

LATCH# NAME
---------- ------------------------------
       218 library cache lock
       218 library cache lock
       218 library cache lock
       218 library cache lock
       218 library cache lock
       218 library cache lock
       218 library cache lock
       218 library cache lock
       218 library cache lock
       218 library cache lock
       218 library cache lock

SQL> select name,parameter1,parameter2,parameter3,wait_class from v$event_name where lower(name) like '%library cache lock%';

NAME                           PARAMETER1                     PARAMETER2                     PARAMETER3                     WAIT_CLASS
------------------------------ ------------------------------ ------------------------------ ------------------------------ --------------------
library cache lock             handle address                 lock address                   100*mode+namespace             Concurrency

---解决LIBRARY CACHE LOCK的脚本

---第1步
可见LIBRARY CACHE LOCK及LIBRARY CACHE PIN皆是基于LIBRARY CACHE HANDLE
SQL> select sid,event,p1,p2,p3 from v$session_wait where sid in (116,121,111);

SID EVENT                                                                    P1         P2         P3
---------- ---------------------------------------------------------------- ---------- ---------- ----------
       111 library cache lock                                               2739958280 2664431712        301    ---library cache lock
       116 SQL*Net message from client                                      1650815232          1          0
       121 library cache pin                                                2739958280 2663017080        301

---第2步,转换上述的P1为16进制
SQL> select to_char('2739958280','xxxxxxxx') from dual;

TO_CHAR('
---------
 a3507208

--第3步,传入上述的P1到如下字典,找到等待及持有LIBRARY CACHE LOCK的信息(请注意列:KGLLKMOD及KGLKREQ的2个列,道理同于V$LOCK的REQUEST及LMODE)

SQL> select kgllkuse,kgllkhdl,kgllkmod,kgllkreq,kgllktype from dba_kgllock where kgllkhdl='00000000A3507208' and kgllktype='Lock';

KGLLKUSE         KGLLKHDL           KGLLKMOD   KGLLKREQ KGLL
---------------- ---------------- ---------- ---------- ----
00000000A4720168 00000000A3507208          0          3 Lock  --等待library cache lock者
00000000A4726CC0 00000000A3507208          1          0 Lock  
00000000A472D818 00000000A3507208          3          0 Lock  ---持有library cache lock者

--第4步找到library cache lock的引发者,即library cache pin(关于library cache pin,请见我本文开始的之前的前文) 
SQL> select sid,serial#,event from v$session where saddr='00000000A472D818';

SID    SERIAL# EVENT
---------- ---------- ------------------------------
       121        215 library cache pin

再整合下上述的SQL脚本

当然你直接通过blocking_session也可以更为真观直接找到引发library cache lock的元凶,直观原因是library cache pin,最后原因是执行存储过程
也可以说明library cache lock不是latch,而是锁lock
SQL> select sid,serial#,saddr,event,blocking_session from v$session where sid in (111,116,121);

SID    SERIAL# SADDR            EVENT                          BLOCKING_SESSION
---------- ---------- ---------------- ------------------------------ ----------------
       111        101 00000000A4720168 library cache lock                          121
       116        153 00000000A4726CC0 SQL*Net message from client
       121        215 00000000A472D818 library cache pin                           116

再从library cache bucket这个维度分析下,可见基于前文:多了lock waiters结构,从LIBRARY CACHE LOCK的含义可见,必须先要获取LIBRARY CACHE PIN,方可获取到LIBRARY CACHE LOCK,现在明显LIBRARY CACHE PIN被其它会话占用,所以获取不到,
只有等待,这样就生了LIBRARY CACHE LOCK,也就是说只要产生LIBRARY CACHE LOCK,必然存在LIBRARY CACHE PIN,而如果出现LIBRARY CACHE PIN,不一定会出现LIBRARY CACHE LOCK
BUCKET 59215:
  LIBRARY OBJECT HANDLE: handle=a3507208 mtx=0xa3507338(0) lct=33 pct=32 cdp=0
  name=SCOTT.PROC_HARD_PARSE 
  hash=84bc90d61f9452e79e7fe2d54c82e74f timestamp=11-24-2015 02:02:36
  namespace=TABL flags=KGHP/TIM/SML/[02000000]
  kkkk-dddd-llll=0000-001d-20bf lock=X pin=S latch#=9 hpc=000c hlc=000c
  lwt=0xa35072b0[0x9ed00090,0x9ed00090] ltm=0xa35072c0[0xa35072c0,0xa35072c0]
  pwt=0xa3507278[0x9eba6d50,0x9eba6d50] ptm=0xa3507288[0xa3507288,0xa3507288]
  ref=0xa35072e0[0xa35072e0,0xa35072e0] lnd=0xa35072f8[0xa34de600,0xa34fed28]
    DEPENDENCY REFERENCES:
    reference latch flags
    --------- ----- -------------------
     98cf88c8     2 DEP[01] whr=0 timestamp=11-24-2015 02:02:36
    LOCK OWNERS:
        lock     user  session count mode flags
    -------- -------- -------- ----- ---- ------------------------
    9ebc9b28 a472d818 a472d818     1 X    [00]  --可以关联DBA_KGLLOCK及V$SESSION找到引发LIBRARY CACHE LOCK的直接原凶,即上述的121会话,可见持有排它锁
    9eb3d748 a4726cc0 a4726cc0     1 N    PNC/[400]  --这是个是最终的原凶,因为最初这个会话是持有NULL模式的LOCK锁,即上述的116会话,可见持有NULL锁
    9eb3d3b0 a4726cc0 a4726cc0     0 N    [4044]   
    LOCK WAITERS:
        lock     user  session count mode
    -------- -------- -------- ----- ----
    9ed00060 a4720168 a4720168     0 X       
    PIN OWNERS:
         pin     user  session     lock count mode mask
    -------- -------- -------- -------- ----- ---- ----
    9eae0b98 a4726cc0 a4726cc0 9eb3d748     3 S    0011
    PIN WAITERS:
         pin     user  session     lock count mode mask
    -------- -------- -------- -------- ----- ---- ----
    9eba6d20 a472d818 a472d818        0     0 X    0000
    LIBRARY OBJECT: object=9d949488
    type=PRCD flags=EXS/LOC[0005] pflags=NST[0001] status=VALD load=0
    DEPENDENCIES: count=3 size=16
    dependency#    table reference   handle position flags
    ----------- -------- --------- -------- -------- -------------------
              0 9d94b210  9d94af50 a3a1b6f0        0 DEP[01]
              1 9d94b210  9d94afa8 a351ce38       33 DEP[01]
              2 9d94b210  9d94b000 a3929db0        0 DEP[01]
    READ ONLY DEPENDENCIES: count=1 size=16
    dependency#    table reference   handle flags
    ----------- -------- --------- -------- -------------------
              0 9d9288d0  9d9285e8 a34fa2c8 /ROD[20]
    ACCESSES: count=1 size=16
    dependency# types
    ----------- -----
              1 0009
    TRANSLATIONS: count=1 size=16
    original    final
    -------- --------
    a351ce38 a351ce38
    DATA BLOCKS:
    data#     heap  pointer    status pins change whr alloc(K)  size(K)
    ----- -------- -------- --------- ---- ------ --- -------- --------
        0 a3507148 9d9495a0 I/P/A/-/-    0 NONE   00      0.37     1.09
        2 9d9497a0 977456b0 I/-/A/-/-    0 NONE   00     13.27    16.00
        4 9d928540 97b67850 I/P/A/-/-    1 NONE   00      2.26     4.00
  BUCKET 59215 total object count=1

深入理解shared pool共享池之library cache的library cache lock系列四的更多相关文章

  1. 深入理解shared pool共享池之library cache系列二

    背景 继续上文:深入理解shared pool共享池之library cache系列一,学习library cache数据结构,本文主要学习library cache object(lco)的数据结构 ...

  2. 深入理解shared pool共享池之library cache的library cache pin系列三

    关于library cache相关的LATCH非常多,名称差不多,我相信一些人对这些概念还是有些晕,我之前也有些晕,希望此文可以对这些概念有个更为清晰的理解,本文主要学习library cache p ...

  3. 深入理解shared pool共享池之library cache系列一

    结论 1,oradebug dump library_cache不同级别dump的library cache内容及粒度会有所区别,具体见测试开始部分2,本文测示基于oradebug dump libr ...

  4. shared pool详解

    共享池shared pool的概念用户提交的命令:解析.执行用户命令的解析解析的过程是一个相当复杂的过程,它要考虑各种可能的异常情况比如SQL语句涉及到的对象不存在.提交的用户没有权限等等而且还需要考 ...

  5. Oracle数据库体系结构-Shared Pool

    Oracle数据库简单介绍 对象关系型数据库 重点:一致性+性能 一致性优于性能 处理模型:C/S模型 Client:用户和用户进程             Server:服务器进程,实例,数据库本身 ...

  6. [转载】——故障排除:Shared Pool优化和Library Cache Latch冲突优化 (文档 ID 1523934.1)

    原文链接:https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrlstate=23w4l35u5_4&id=152393 ...

  7. [20190319]shared pool latch与library cache latch的简单探究.txt

    [20190319]shared pool latch与library cache latch的简单探究.txt --//昨天看Oracle DBA手记3:数据库性能优化与内部原理解析.pdf 电子书 ...

  8. Oracle Shared Pool之Library Cache

    1. Shared Pool组成 Shared Pool由许多区间(Extent)组成,这些区间又由多个连续的内存块(Chunk)组成,这些内存块大小不一.从逻辑功能角度,Shared pool主要包 ...

  9. 关于shared pool的深入探讨(二)【转载】

    关于shared pool的深入探讨(二)   作者:eygle |English [转载时请标明出处和作者信息]|[恩墨学院 OCM培训传DBA成功之道]链接:http://www.eygle.co ...

随机推荐

  1. Muduo-Base-Atomic

    针对原子性操作进行封装, 下面是我们需要用到的原子操作函数, 有需要对此类进行扩展的话,可以根据下面的函数进行扩展. 原子操作需要加上一个编译选项 -march=i386(根据你CPU 的类型来写,也 ...

  2. An exception occurred during configuration of persistence layer.

    配置文件放在bin文件夹下(注意:hibernate.cfg.xml文件名不要随便改动)

  3. 使用jenkins + python + selenium一步步搭建web自动化测试“框架”(1) - 各部件简介

    原先搭建过一个自动化测试框架,迷迷糊糊不求甚解,算是搭建了一个仅限于能用的.根本算不上框架的玩意儿. 现在回过头来好好看看究竟每一步是怎么联系起来的,是怎么运行起来的. 本次博客先说说各部件都是干什么 ...

  4. centos 系统程序包安装记录

    -添加sudoer su - vi /etc/sudoers 在root ALL=(ALL) ALL 下添加: pete ALL=(ALL) ALL -安装拼音: sudo yum install & ...

  5. redhat开启linux server

    1.redhat linux5 enterprize 默认情况下是没有安装telnet server,可以使用rpm -q telnet查询,下图是安装后的查询结果

  6. kafka consumer 分区reblance算法

    转载请注明原创地址 http://www.cnblogs.com/dongxiao-yang/p/6238029.html 最近需要详细研究下kafka reblance过程中分区计算的算法细节,网上 ...

  7. Oracle ROWNUM用法和分页查询总结(转)

    [转载] Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用. Oracle分页查询格式(一):http://yangtingkun.itpub.net/post/468/100278 ...

  8. hdu 4634 Swipe Bo 搜索

    典型的bfs模拟 (广度优先搜索) ,不过有好多细节要注意,比如图中如果是  R#  走到这个R的话就无限往右走了,这样就挂了~肯定到不了出口.还有一种容易造成死循环的,比如 #E## DLLL D. ...

  9. [Java 8] (5) 使用Lambda表达式进行设计

    使用Lambda表达式进行设计 在前面的几篇文章中,我们已经见识到了Lambda表达式是怎样让代码变的更加紧凑和简洁的. 这一篇文章主要会介绍Lambda表达式怎样改变程序的设计.怎样让程序变的更加轻 ...

  10. ViewPager的用法和实现过程

    看图先:          页面中填充内容是随机关键词飞入和飞出动画效果,随后会更新,如今请先无视吧 首先是 导入jar包   下载地址:android-support-v4.jar 布局文件中加入v ...