library cache pin和lock等待分析

本文详细分析了Oracle Library Cache Pin和Lock等待事件的原理及成因,并通过查询数据字典基表x$kglpn和x$kgllk提供了具体的诊断方法,最终给出了通过v$session和v$process获取并杀死占用Pin或Lock的进程的步骤,以解决此类性能瓶颈。
Library cachelock/pin是用来控制对librarycache object的并发访问的。Lock管理并发,pin管理一致性,lock是针对于librarycache handle, 而pin是针对于heap。


最近运行一个分批删除数据的procedure,感觉运行比较慢,临时取消了该job,然后再次重建procedure时,sessionhang住了,应该是library cache pin的等待事件了,oracle用两种结构pin和lock来控制shared pool的并发访问控制。
访问一个对象将其pin到内存中,在pin之前需要先获取该对象的handle的锁定,lock的索引主要有nullshare exclusive,当然pin该对象也有上述三种状态。
Session a :execute delete_data
临时取消了该procedure的运行,实际进程并没有马上释放该对象的pin
Session b:
SQL> create orreplace procedure delete_data
  2  as
  3 begin
  4  loop
Delete fromTEXTAUTO_FOLDERARTICLE where LASTPOSTDATE<sysdate-10 and rownum<10000;
Exit whensql%notfound;--dml语句中隐式游标属性进行控制
Commit;
End loop;
  9 Commit;
10  end;
11  /
出现了library cache pin等待事件:
SQL> selectevent,count(*) from v$session group by event;
EVENT                                                             COUNT(*)
--------------------------------------------------------------------------
SQL*Net messagefrom client                                             92
library cachepin                                                        1
jobq slavewait                                                          1
rdbms ipcmessage                                                       10
smon timer                                                               1
pmon timer                                                               1
db file scatteredread                                                    1
Streams AQ: qmnslave idle wait                                           1
SQL*Net message toclient                                                1
Streams AQ: qmncoordinator idle wait                                     1
Streams AQ: waitingfor time management or cleanup tasks                  1
11 rows selected.
分析一下上述的library cache pin是如何造成的:首先系统运行了该procedure,此时该对象已经被pin到内存,占用了一个share pin和一个null lock,而此时在进程还没有释放此pin之前再次create procedure,此时要获取一个exclusive pin和exclusivelock,由于之前的share pin和exclusivepin不共存,此时就会产生一个library cache pin等待。
这里注意一下两个基表x$kglpn和x$kgllk,对于解决library cache pin和lock太轻松了。
SQL> descx$kglpn;
Name                                     Null?    Type
------------------------------------------------- ----------------------------
ADDR                                              RAW(8)
INDX                                              NUMBER
INST_ID                                           NUMBER
KGLPNADR                                          RAW(8)
KGLPNUSE                                          RAW(8)
KGLPNSES                                           RAW(8)
KGLPNHDL                                          RAW(8)
KGLPNLCK                                          RAW(8)
KGLPNCNT                                          NUMBER
KGLPNMOD                                           NUMBER
KGLPNREQ                                          NUMBER
KGLPNDMK                                          NUMBER
KGLPNSPN                                          NUMBER
通过等待事件的p1raw参数联合kglpnhdl来获取kglpnuse,这里的kglpnmod和kglpnreq和v$lock的lmode和request基本相同,kglpnmod=2表示此时这个session占有了library cache pin而造成了kglpnreq=3这个session的等待。
SQL> selectkglpnuse,kglpnhdl,kglpnmod,kglpnreq from x$kglpn where kglpnhdl in (selectp1raw from v$session where event='library cache pin');
KGLPNUSE         KGLPNHDL           KGLPNMOD  KGLPNREQ
-------------------------------- ---------- ----------
00000000D822759000000000DD876D98          0          3
00000000DA22534000000000DD876D98          2          0
联合v$session的saddr来获取sid然后可以通过v$process来kill掉没有释放的进程。
SQL> selectb.spid,a.sid from v$session a,v$process b where a.saddr in ('00000000DA225340') and a.paddr=b.addr;
SPID                SID
----------------------
11232               195
而如果此时再重新编译一下该procedure,同样需要获取一个该对象的lock锁定,由于上述重建procedure还在视图获取该对象的librarycache lock的exclusive lock,那么当然此时出现librarycache lock是当然的。
SQL> alterprocedure delete_data compile;
SQL> selectevent,count(*) from v$session group by event;
EVENT                                                             COUNT(*)
--------------------------------------------------------------------------
SQL*Net messagefrom client                                             91
library cachepin                                                        1
jobq slavewait                                                           1
rdbms ipcmessage                                                       10
smon timer                                                               1
pmon timer                                                               1
db file scatteredread                                                   1
library cachelock                                                       1
Streams AQ: qmnslave idle wait                                           1
SQL*Net message toclient                                                 1
Streams AQ: qmncoordinator idle wait                                     1
SQL> descx$kgllk;
Name                                     Null?    Type
------------------------------------------------- ----------------------------
ADDR                                              RAW(8)
INDX                                              NUMBER
INST_ID                                           NUMBER
KGLLKADR                                           RAW(8)
KGLLKUSE                                          RAW(8)
KGLLKSES                                          RAW(8)
KGLLKSNM                                          NUMBER
KGLLKHDL                                          RAW(8)
KGLLKPNC                                          RAW(8)
KGLLKPNS                                          RAW(8)
KGLLKCNT                                          NUMBER
KGLLKMOD                                          NUMBER
KGLLKREQ                                           NUMBER
KGLLKFLG                                          NUMBER
KGLLKSPN                                          NUMBER
KGLLKHTB                                          RAW(8)
KGLNAHSH                                           NUMBER
KGLLKSQLID                                        VARCHAR2(13)
KGLHDPAR                                          RAW(8)
KGLHDNSP                                          NUMBER
USER_NAME                                         VARCHAR2(30)
KGLNAOBJ                                          VARCHAR2(60)
获取blocking session的方法基本相同,也是通过p1raw参数联合kgllkhdl来获取kgllkuse,最后联合v$session来获取sid,进而通过v$process获取spid,杀掉进程后即可
SQL> selectkgllkhdl,kgllkuse,kgllkreq,kgllkmod from x$kgllk where kgllkhdl in (Selectp1raw from v$session where event='library cache lock');
KGLLKHDL         KGLLKUSE           KGLLKREQ   KGLLKMOD
-------------------------------- ---------- ----------
00000000DD876D9800000000DA225340          0          1
00000000DD876D9800000000D8227590          0          3
00000000DD876D9800000000D821FC40          3          0
通过上述的library cache pin和library cache lock等待事件的分析和诊断,可以看出数据字典基表可以提供我们非常的信息,而帮助解决一些比较棘手的案例,当然上述我们也可以利用oradebug然后通过trace文件来诊断,不过相对trace文件较难以阅读,需要一定的功底,后续如果有对该等待事件trace的解决案例再拿出来与大家分享。
先看效果: https://renmaiwang.cn/s/jkhfz Hue系列产品将具备高度的个性化定制能力,并且借助内置红、蓝、绿三原色LED的灯泡,能够混合生成1600万种不同色彩的灯光。 整个操作流程完全由安装于iPhone上的应用程序进行管理。 这一创新举措为智能照明控制领域带来了新的启示,国内相关领域的从业者也积极投身于相关研究。 鉴于Hue产品采用WiFi无线连接方式,而国内WiFi网络尚未全面覆盖,本研究选择应用更为普及的蓝牙技术,通过手机蓝牙与单片机进行数据交互,进而产生可调节占空比的PWM信号,以此来控制LED驱动电路,实现LED的调光功能以及DIY调色方案。 本文重点阐述了一种基于手机蓝牙通信的LED灯设计方案,该方案受到飞利浦Hue智能灯泡的启发,但考虑到国内WiFi网络的覆盖限制,故而选用更为通用的蓝牙技术。 以下为相关技术细节的详尽介绍:1. **智能照明控制系统**:智能照明控制系统允许用户借助手机应用程序实现远程控制照明设备,提供个性化的调光及色彩调整功能。 飞利浦Hue作为行业领先者,通过红、蓝、绿三原色LED的混合,能够呈现1600万种颜色,实现了全面的定制化体验。 2. **蓝牙通信技术**:蓝牙技术是一种低成本、短距离的无线传输方案,工作于2.4GHz ISM频段,具备即插即用强抗干扰能力。 蓝牙协议栈由硬件层软件层构成,提供通用访问Profile、服务发现应用Profile以及串口Profiles等丰富功能,确保不同设备间的良好互操作性。 3. **脉冲宽度调制调光**:脉冲宽度调制(PWM)是一种高效能的调光方式,通过调节脉冲宽度来控制LED的亮度。 当PWM频率超过200Hz时,人眼无法察觉明显的闪烁现象。 占空比指的...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值