查看: 4095|回复: 8

我的常用定位library cache lock的方法,希望对大家有用

[复制链接]
论坛徽章:
9
数据库板块每日发贴之星
日期:2006-09-06 01:01:55数据库板块每日发贴之星
日期:2006-09-07 01:02:41数据库板块每日发贴之星
日期:2006-09-23 01:02:09数据库板块每日发贴之星
日期:2006-09-26 01:03:58数据库板块每日发贴之星
日期:2006-10-06 01:02:42数据库板块每日发贴之星
日期:2006-10-08 01:02:15数据库板块每日发贴之星
日期:2006-10-09 01:02:43授权会员
日期:2006-12-23 10:14:58会员2007贡献徽章
日期:2007-09-26 18:42:10
跳转到指定楼层
1#
发表于 2007-12-22 13:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
经常看到PUB上有兄弟说什么LIBRARY CACHE LOCK和PIN的错误不知道该如何处理,而且定位不到问题出在哪里,我来说几句吧,以我工作上的经验,希望能对大家有用
   一般来说,这类错误是因为在包或过程被频繁调用的过程中,DDL语句引起的,那我们该怎么处理呢?其实我们可以这样来操作来查原因,老板要的一般都是为什么产生这个故障和谁操作导致的这个故障,特别是故障处理好后,这个问题就要回答老板了。

1、预先在数据库中建立DDL级的触发器,我认为这个是必要的,因为这个对生产影响不大,但是却可以让我们监控到不少有用的信息.,比如记录在abc表中,可以记录登陆用户,操作语句,操作时间等等信息。

  2、在数据库中出现大量的libriary cache lock 的等待事件的时候,系统出现严重的问题了,我们可以立即从这个时间点左右着手,比如12日21日中午12点到12点半之间出问题,如下语句
select * from dba_objects where
last_ddl_time>to_date('20071221 12:00:00','yyyymmdd hh24:mi:ss')
AND last_ddl_time<=to_date('200712 12:30:00','yyyymmdd hh24:mi:ss')
and (object_type like '%PACK%' or object_type like 'FUNCTION' OR object_type='PROCEDURE')
AND STATUS='INVALID'
order by last_ddl_time desc

其实通过这个基本上就发现是什么问题了,基本上就只会有一两个对象比如包BBB失效

3、然后找包关联的对象,是否在我们的触发器记录的表中有记录,接着执行如下语句(切记,这个记录DDL动作的语句发挥作用了)

select * from abc where ddl_time>to_date('20071221 12:00:00','yyyymmdd hh24:mi:ss')
AND ddl_time<=to_date('200712 12:30:00','yyyymmdd hh24:mi:ss')
and schema_object in (SELECT referenced_name FROM DBA_DEPENDENCIES WHERE NAME='BBB' )
ORDER BY DDL_time desc
(请注意,这个BBB就是上面我查出来的,举例说比如失效的包)

这样查出来的,绝对就是引起这次事故的罪魁祸首的动作了。(ddl_time和 schema_object 是abc表的字段,记录了登陆者操作DDL的时间和对象)


以上方式是我在工作中经常采用的,很好用,一般不会有问题。


当然我上面并没有说明解决问题的方法,解决问题的方法是如下。但是有的时候发现问题原因,追究问题原因是非常非常重要的,可以避免下次再发生,当然通过DUMP systemstate等方式,比较复杂,我的这个思路操作起来应该比较简便,很明了。另外,建立DDL级的触发器,个人认为是必须的!所以上面的方法我想说出来,希望对大家有用!


解决问题的方法步骤

  1、查看具体产生library cache lock 的对象,比如不哪些包和存储过程

SELECT KGLNAOWN,KGLNAOBJ
    FROM x$kglob
   WHERE kglhdadr in( select P1RAW from v$session_wait where event like 'library cache%');


2、  查看具体是那些用户做了这个操作导致 library cache lock
  select sid, program ,machine from v$session where paddr in (
       SELECT s.paddr
        FROM x$kglpn p, v$session s
       WHERE p.kglpnuse=s.saddr(+) AND p.kglpnmod <> 0
   and kglpnhdl in ( select p1raw  from v$session_wait where event  in ('library cache pin','library cache lock' ,'library cache load lock')  )        );


3、、以下语句用来杀掉会话(前面查看,然后到这步是决定是否要杀掉进程解决这个问题)
select 'kill -9 '||spid from v$process where addr in (
       SELECT s.paddr
        FROM x$kglpn p, v$session s
       WHERE p.kglpnuse=s.saddr --AND p.kglpnmod <> 0
   and kglpnhdl in ( select p1raw  from v$session_wait where event  in (' library cache pin','library cache lock' )  )        );



看过我这帖子的兄弟希望能补充补充,看看有没有说的不对的地方,或者说考虑不全面的地方,谢谢!


附:DDL触发器的语句

CREATE OR REPLACE TRIGGER tr_trace_ddl
AFTER ddl
ON database
DECLARE
  SQL_TEXT   ORA_NAME_LIST_T;
  STATE_SQL  VARCHAR2(4000); --DDL$TRACE.DDL_SQL%TYPE;
  V_ERR_INFO VARCHAR2(200);
BEGIN
  FOR I IN 1 .. ORA_SQL_TXT(SQL_TEXT) LOOP
    STATE_SQL := STATE_SQL || SQL_TEXT(I);
  END LOOP;

  INSERT INTO SYSTEM.ABC
    (LOGIN_USER,
     AUDSID,
     IPADDRESS,
     SCHEMA_USER,
     SCHEMA_OBJECT,
     DDL_TIME,
     DDL_SQL)
  VALUES
    (ORA_LOGIN_USER,
     USERENV('SESSIONID'),
     SYS_CONTEXT('userenv', 'ip_address'),
     ORA_DICT_OBJ_OWNER,
     ORA_DICT_OBJ_NAME,
     SYSDATE,
     STATE_SQL);
EXCEPTION
  WHEN OTHERS THEN
    V_ERR_INFO := SUBSTRB(SQLERRM, 1, 198);
END TR_TRACE_DDL;

[ 本帖最后由 wdjk1999 于 2007-12-22 14:08 编辑 ]
论坛徽章:
33
红孩儿
日期:2006-04-13 07:34:50ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54玉石琵琶
日期:2012-02-21 15:04:38奥运会纪念徽章:射击
日期:2012-08-10 11:01:09ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07
2#
发表于 2007-12-22 13:56 | 只看该作者
学习一下

使用道具 举报

回复
论坛徽章:
97
ITPUB元老
日期:2008-06-30 12:48:39暖羊羊
日期:2015-03-04 14:50:372015年新春福章
日期:2015-03-06 11:57:312010数据库技术大会纪念徽章
日期:2015-04-23 10:33:192011数据库大会纪念章
日期:2015-04-23 10:33:192012数据库大会纪念章
日期:2015-04-23 10:33:192013数据库大会纪念章
日期:2015-04-23 10:33:192014数据库大会纪念章
日期:2015-04-23 10:33:19林肯
日期:2013-10-31 12:31:382013年新春福章
日期:2013-02-25 14:51:24
3#
发表于 2007-12-22 19:57 | 只看该作者

回复 #1 wdjk1999 的帖子

3、、以下语句用来杀掉会话(前面查看,然后到这步是决定是否要杀掉进程解决这个问题)
目的找出spid ,也可以用下面的sql:
SELECT spid
   FROM v$process p, v$session s
  WHERE p.addr = s.paddr
    AND s.SID IN (SELECT sid
                    FROM v$session_wait b
                   WHERE b.EVENT in (' library cache pin','library cache lock' )  )

使用道具 举报

回复
论坛徽章:
97
ITPUB元老
日期:2008-06-30 12:48:39暖羊羊
日期:2015-03-04 14:50:372015年新春福章
日期:2015-03-06 11:57:312010数据库技术大会纪念徽章
日期:2015-04-23 10:33:192011数据库大会纪念章
日期:2015-04-23 10:33:192012数据库大会纪念章
日期:2015-04-23 10:33:192013数据库大会纪念章
日期:2015-04-23 10:33:192014数据库大会纪念章
日期:2015-04-23 10:33:19林肯
日期:2013-10-31 12:31:382013年新春福章
日期:2013-02-25 14:51:24
4#
发表于 2007-12-22 20:00 | 只看该作者
前提是sesion 没有被 killed 掉, 如果被killed , v$session.paddr <> v$process.addr.

使用道具 举报

回复
论坛徽章:
11
生肖徽章2007版:虎
日期:2008-01-02 17:35:53奥运会纪念徽章:帆船
日期:2008-07-10 11:29:10生肖徽章2007版:鸡
日期:2008-10-07 15:25:30奥运会纪念徽章:艺术体操
日期:2008-10-24 13:26:02生肖徽章2007版:虎
日期:2009-03-10 21:13:282010世博会纪念徽章
日期:2010-08-12 17:02:18
5#
发表于 2007-12-22 20:17 | 只看该作者
内容先记下!
学习!

使用道具 举报

回复
论坛徽章:
314
行业板块每日发贴之星
日期:2012-07-12 18:47:29双黄蛋
日期:2011-08-12 17:31:04咸鸭蛋
日期:2011-08-18 15:13:51迷宫蛋
日期:2011-08-18 16:58:25紫蛋头
日期:2011-08-31 10:57:28ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47蜘蛛蛋
日期:2011-10-20 15:51:25迷宫蛋
日期:2011-10-29 11:12:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41鲜花蛋
日期:2011-11-09 20:33:30
6#
发表于 2007-12-22 22:33 | 只看该作者
先说说你如何理解LOCK,PIN的产生原因,以及什么情况下是S,X 锁,
理解这个,比你的解法更重要.

使用道具 举报

回复
论坛徽章:
2
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44授权会员
日期:2007-12-29 23:38:44
7#
发表于 2007-12-22 23:22 | 只看该作者
用plsql下的tools--session定位比较快的

使用道具 举报

回复
论坛徽章:
11
授权会员
日期:2007-07-08 18:54:592009日食纪念
日期:2009-07-22 09:30:00生肖徽章2007版:蛇
日期:2008-10-24 16:46:51奥运会纪念徽章:现代五项
日期:2008-10-24 13:26:49生肖徽章2007版:羊
日期:2008-04-17 18:05:112008新春纪念徽章
日期:2008-02-13 12:43:03生肖徽章2007版:鼠
日期:2008-01-02 17:35:53生肖徽章2007版:鸡
日期:2008-01-02 17:35:53ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44会员2007贡献徽章
日期:2007-09-26 18:42:10
8#
发表于 2007-12-23 00:19 | 只看该作者
LZ找产生library cache pin的sql,稍许有点繁琐,看一下,eygle如何找的,
http://www.eygle.com/internal/shared_pool-5.htm

使用道具 举报

回复
论坛徽章:
2
ITPUB 11周年纪念徽章
日期:2012-10-09 18:11:482013年新春福章
日期:2013-02-25 14:51:24
9#
发表于 2012-7-26 13:35 | 只看该作者
好贴好贴

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表