记一次shared pool中的等待事件——LIBRARY CACHE PIN

周末在公司打游戏,同事突然问我,为什么我的procedure删除不了?我觉得很纳闷,过去一看,drop procedure之后处于吊死状态,凭借经验,很有可能是library cache pin或者library cache lock,通过一番检查发现确实是library cache pin

虽然现在又开始从事Java的设计和开发工作,但是对于Oracle方面还是比较热衷的,类似等待事件都必须非常熟悉,接下去就要结合多次文章来把常见的等待事件使用模拟的方式来进行分析讲解

Oracle使用两种数据结构来进行shared pool的并发控制:lock pin.
Lock
pin具有更高的级别.

Lockhandle上获得,pin一个对象之前,必须首先获得该handle的锁定.锁定主要有三种模式: Null,share,Exclusive.在读取访问对象时,通常需要获取Null()模式以及share(共享)模式的锁定.在修改对象时,需要获得Exclusive(排他)锁定.

在锁定了Library Cache对象以后,一个进程在访问之前必须pin该对象.同样pin有三种模式,Null,sharedexclusive.只读模式时获得共享pin,修改模式获得排他pin.

这里的library cache locklibrary cache pin都是我们关心的.接下来我们就研究一下这几个等待事件

接下来我来通过实际模拟来解释LIBRARY CACHE PIN等待事件:

首先,我们先创建需要使用到的procedure

C:Documents and Settingskidd>sqlplus /nolog

SQL*Plus: Release 9.0.1.0.1 - Production on 星期五 1 29 14:18:00 2010

(c) Copyright 2001 Oracle Corporation. All rights reserved.

SQL> conn /as sysdba

已连接。

SQL> create or replace PROCEDURE pining

2 IS

3 BEGIN

4 NULL;

5 END;

6 /

过程已创建。

SQL> create or replace procedure calling

2 is

3 begin

4 pining;

5 dbms_lock.sleep(3000);

6 end;

7 /

过程已创建。

然后在另一个会话中执行calling,使calling进入等待阶段:

C:Documents and Settingskidd>sqlplus /nolog

SQL*Plus: Release 9.0.1.0.1 - Production on 星期五 1 29 14:21:59 2010

(c) Copyright 2001 Oracle Corporation. All rights reserved.

SQL> conn /as sysdba

已连接。

SQL> exec calling

[@more@]

接下去就是要在其它的终端对calling进行DDL干涉了,比如说:

C:Documents and Settingskidd>sqlplus /nolog

SQL*Plus: Release 9.0.1.0.1 - Production on 星期五 1 29 14:26:17 2010

(c) Copyright 2001 Oracle Corporation. All rights reserved.

SQL> conn /as sysdba

已连接。

SQL> drop procedure calling;

结果就是会话被挂起

接下去我们就要开始揭抛了

v$session_wait入手,我们可以得到哪些session正在经历library cache pin的等待

SQL> select sid,seq#,event,p1,p1raw,p2,p2raw,p3,p3raw,state from v$session_wait

where event like 'library%';

SID SEQ#

---------- ----------

EVENT P1

---------------------------------------------------------------- ----------

P1RAW P2 P2RAW P3 P3RAW STATE

-------- ---------- -------- ---------- -------- -------------------

10 40

library cache pin 1712146160

660D46F0 1719361780 667B60F4 301 0000012D WAITING

在这里简单的解释一下v$session_wait的几个列,P1 列是Library Cache Handle Address,Pn字段是10进制表示,PnRaw字段是16进制表示,其它的可以通过相关资料获得:)

首先获得library cache pin等待的对象的handle地址为: 660D46F0

有了handle之后,通过查询X$KGLOB视图就可以得到对象的具体信息:

SQL> select ADDR,KGLHDADR,KGLHDPAR,KGLNAOWN,KGLNAOBJ,KGLNAHSH,KGLHDOBJ

2 from X$KGLOB

3 where KGLHDADR ='660D46F0';

ADDR KGLHDADR KGLHDPAR

-------- -------- --------

KGLNAOWN

----------------------------------------------------------------

KGLNAOBJ

--------------------------------------------------------------------------------

KGLNAHSH KGLHDOBJ

---------- --------

029C1034 660D46F0 660D46F0

SYS

CALLING

1069625444 660D5638

从这个信息反馈上,我们了解到在PINING对象上正经历library cache pin的等待

SQL> select a.sid,a.username,a.program,b.addr,b.KGLPNADR,b.KGLPNUSE,b.KGLPNSES,b

.KGLPNHDL,

2 b.kGLPNLCK, b.KGLPNMOD, b.KGLPNREQ

3 from v$session a,x$kglpn b

4 where a.saddr=b.kglpnuse and b.kglpnhdl = '660D46F0' and b.KGLPNMOD<>0;

SID USERNAME

---------- ------------------------------

PROGRAM ADDR

---------------------------------------------------------------- --------

KGLPNADR KGLPNUSE KGLPNSES KGLPNHDL KGLPNLCK KGLPNMOD KGLPNREQ

-------- -------- -------- -------- -------- ---------- ----------

8 SYS

sqlplus.exe 029BBB10

667B62EC 66DB7758 66DB7758 660D46F0 667B51E8 2 0

OK,我们引入了x$kglpn视图,可以获得当前持有该SID用户信息

SQL> select EVENT from v$session_wait where sid=8;

EVENT

----------------------------------------------------------------

PL/SQL lock timer

Ok,这个用户正在等待一次PL/SQL lock timer计时

SQL> select v$session.SQL_HASH_VALUE,v$session.SQL_ADDRESS from v$session where sid = '8';

SQL_HASH_VALUE SQL_ADDR

-------------- --------

1315522757 660C9EE8

我们通过SID得到了v$session视图的SQL_HASH_VALUE,这样我们就可以得到v$sqlarea .sql_text

SQL> select sql_text from v$sqlarea where v$sqlarea.hash_value='1315522757';

SQL_TEXT

--------------------------------------------------------------------------------

BEGIN calling; END;

至此就找到了Library Cache Pin的原因,哈哈

当然了,那么shared pool中的lock机制是如何的呢?当然我们可以通过存储shared pooltrace,在之前做了些什么,之后又做了些什么呢?

我们将在下一次篇幅中进行介绍

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

转载于:http://blog.itpub.net/111631/viewspace-1030986/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值