设为首页 收藏本站
查看: 596|回复: 0

[经验分享] LIBRARY CACHE PIN解决方法

[复制链接]
累计签到:278 天
连续签到:1 天
发表于 2017-8-22 10:13:50 | 显示全部楼层 |阅读模式
LIBRARY CACHE PIN通常是发生在编译或重新编译PL/SQL,VIEW,TYPES等object时.编译通常都是显性的,如安装应用程序,升级,安装补丁程序等,
但object的重新编译也可能发生在object变得无效时

一、以下列出几种可能产生”library cache pin”的情况及其避免方法:
1. 用户权限管理
当对用户的权限进行管理即进行”grant” “revoke”时,可能产生”library cache pin”.
建议的避免方法: 通过角色来对最终用户进行授权或收回授权,而不要用显性的方式即直接对最终用户授权或收回授权,从而避免产生”library cache pin”
2. 高峰时的object管理
在系统运行高峰时对数据库object的管理可能产生”library cache pin”.
建议的避免方法: 把对数据库object的管理安排到负载相对较小的时侯.
3. 在PL/SQL包中存在大量的互跨的依赖性(dependency)
建议的避免方法: 尽可能按等级来排列它们的结构.

二、解决这个问题基本思路如下:
1. v$session_wait.p1raw 可以知道library cache pin等待的对象的handle的地址
2. 通过等待对象的handle可以和x$kglob.kglhdadr相关联,可以了解这个等待对象的基本信息,那这个对象的锁(pin)的情况是如何?
3. 再用x$kglob.kglhdadr关联x$kglpn.kglpnhdl,知道谁在持有这个pin(锁),在用x$kglpn.kglpnuse和v$session.saddr关联,了解持有锁(pin)的会话信息。
    如果要了解这个会话在等待什么,可以通过v$session_wait知道,也可以通v$session.sql_hash_value和v$session.sql_address等字段
    关联v$sqltext,v$sqlarea视图了解这个会话的动作.

三、具体步骤:
    select sid,seq#,event,p1,p1raw,p1text,p2,p2raw,p2text,p3,p3raw,p3text,wait_time,seconds_in_wait,state
    from v$session_wait
    where event like 'library%';
SID       SEQ# EVENT                     P1             P1RAW            P1TEXT                 P2          P2RAW            P2TEXT         
---- ---------- --------------------------- ---------------- ---------------------------------------- ---------------- ------------------
23        481 library cache pin        6540622432  0000000185D9FA60    handle address          6482206672 00000001825E9FD0  pin address   

    P3    P3RAW            P3TEXT                 WAIT_TIME SECONDS_IN_WAIT  STATE
    ----- ---------------------------------------- ---------- ---------------- -----------------
    301   000000000000012D 100*mode+namespace         0              32         WAITING

P1RAW='0000000185D9FA60'是会话等待的对象的handle的值,通过这个值可以在x$kglob里查看这个对象的基本信息,如下:

    select addr,kglhdadr,kglhdpar,kglnaown,kglnaobj,kglnahsh,kglhdobj
    from sys.x$kglob  
    where kglhdadr='0000000185D9FA60';
ADDR             KGLHDADR         KGLHDPAR         KGLNAOWN       KGLNAOBJ         KGLNAHSH     KGLHDOBJ
---------------- ---------------- ---------------- ----------------------------------------------------------------
0000002A965B38D0 0000000185D9FA60 0000000185D9FA60 SYS            PINNG            1626462215 00000001843E6F68

    select a.PADDR,a.sid,a.SERIAL#,a.PROGRAM,a.SQL_ADDRESS,a.STATUS,a.SQL_HASH_VALUE,b.addr,b.kglpnadr,b.kglpnuse,b.kglpnses,
                    b.kglpnhdl,b.kglpnlck,b.kglpnmod,b.kglpnreq
    from x$kglpn b, v$session a
    where a.SADDR = b.kglpnuse
    and b.kglpnhdl = '0000000185D9FA60'
    and b.kglpnmod <> 0;
PADDR               SID    SERIAL# PROGRAM            SQL_ADDRESS      STATUS   SQL_HASH_VALUE ADDR             KGLPNADR         
---------------- ---------- ---------- ------------------------------------------------ ---------------- -------- --------------
0000000180433138    33         18 plsqldev.exe       0000000185D8ACD0  ACTIVE       3937586639 0000002A965CF1D0 00000001825EA050

    KGLPNUSE         KGLPNSES         KGLPNHDL         KGLPNLCK           KGLPNMOD   KGLPNREQ
    ---------------- ---------------- ---------------- ---------------- ---------------- ------
    00000001804A8D50 00000001804A8D50 0000000185D9FA60 00000001825E8E98          2          0

查看持有该锁(pin)的会话的基本信息,到这个有如下几种分析情况:
    1. 字段status的值如果是“killed”,表明这个会话被关闭了,虽然会话被标记为“killed”但会话持有的资源可没有释放,这个时候要查看视图v$process,
查询会话对应os进程是否还存在。
    select * from v$process where addr in ('&paddr');  ---这里变量paddr等于‘0000000180433138’
    如果这个查询里有值,说明os进程没有释放资源,可以通过os命令:  kill -9 spid 杀掉进程(spid是v$process对应os的服务器进程)

    2. 字段status的值如果为“ACTIVE”,说明持有pin的会话是活跃的,那就看看这个会话在等待什么,在执行什么操作
    查看会话在等待什么?
    select * from v$session_wait  where sid=33
    查看会话的动作是什么?
    select * from v$sqlarea where hash_value='&sql_hash_value';

到此,library cache pin的原因已经找到剩下就是如何处理,一般快速处理是先kill掉看看是否可以解决,如果无法解决,那就看应用。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-403314-1-1.html 上篇帖子: Linux+Oracle+12c+RAC+安装配置详细-GI安装 下篇帖子: Oracle10g通过sqlplus导出excel
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表