定位并解决library cache lock的方法
作者:sylar版权所有[文章允许转载,但必须以链接方式注明源地址,否则追究法律责任.]
1、查看具体是那些操作导致library cache lock等待事件的发生
注意:此处SQL状态可以是active和INACTIVE
-
SELECT SE.INST_ID, --实例
-
SQ.SQL_TEXT, /*SQL文本*/
-
SQ.SQL_FULLTEXT, /*SQL全部文本*/
-
SE.SID, /*会话的唯一标识,通常要对某个会话进行分析前,首先就需要获得该会话的SID。*/
-
'ALTER SYSTEM kill SESSION ''' || SE.SID || ',' || SE.SERIAL# ||
-
''';' kill,
-
SQ.OPTIMIZER_COST AS COST_, /* COST 值*/
-
SE.LAST_CALL_ET CONTINUE_TIME, /*执行时间 可能是单个sql也可能是整个功能*/
-
SE.PREV_EXEC_START, /*SQL execution start of the last executed SQL statement*/
-
SE.EVENT, /*等待事件*/
-
SE.LOCKWAIT, /*是否等待LOCK(SE,P)*/
-
SE.MACHINE, /*客户端的机器名。(WORKGROUP\PC-201211082055)*/
-
SE.USERNAME, /*创建该会话的用户名*/
-
SE.LOGON_TIME /*登陆时间*/
-
FROM GV$SESSION SE,
-
GV$SQLAREA SQ ,
-
x$kglpn p
-
WHERE SE.SQL_HASH_VALUE = SQ.HASH_VALUE(+)
-
AND p.kglpnuse=SE.saddr(+) AND p.kglpnmod <> 0
-
AND SE.SQL_ID = SQ.SQL_ID(+)
-
AND SQ.INST_ID(+) = SE.INST_ID
-
and p.kglpnhdl in ( select p1raw from gv$session_wait where event in ('library cache pin','library cache lock' ,'library cache load lock') )
2、根据上面结果得到引起该事件的SQL,确认这些SQL能不能kill
经查发现是下面两个SQL,且状态是INACTIVE
1)SQL一:
-
select count(tt.transport_point_no) countNo
-
from tms_transport_point tt
-
left join tms_unload_point_dtl ud
-
on ud.transport_point_no = tt.transport_point_no
-
left join store st
-
on st.store_no = tt.store_no
-
left join tms_quartzcenter q
-
on tt.quartzcenter_no = q.quartzcenter_no
-
where tt.store_type = '11'
-
and ud.transport_point_no is null
2)SQL二:
-
select distinct t.QUARTZCENTER_SIMPLE_NAME centerNo,
-
T.QUARTZCENTER_NAME centerName,
-
t.zone_no areaNo,
-
a.store_name areaName,
-
t.isSign,
-
nvl(p.system_param_value, 0) isBatchFlag,
-
nvl(t.edit_time, t.create_time) downTime
-
from tms_quartzCenter T
-
left join store a
-
on t.zone_no = a.store_code
-
left join tms_system_param p
-
on t.quartzcenter_no = p.quartzcenter_no
-
and p.system_param_name = 'IsDeliverBatchFlag'
-
where t.status = '0'
与业务再次确认,可以进行KILL
3、经沟通,kill引起该等待事件的SQL
kill方法1:
根据”
1、查看具体是那些操作导致library cache lock等待事件的发生“根据这个视图查出来的“kill”列结果进行kill

kill方法2:
如果方法1kill不掉这些SQL,则用下面SQL进行kill
-
SELECT SE.INST_ID, --实例
-
SQ.SQL_TEXT, /*SQL文本*/
-
SQ.SQL_FULLTEXT, /*SQL全部文本*/
-
'kill -9 '||s.spid||';' kill,
-
SQ.OPTIMIZER_COST AS COST_, /* COST 值*/
-
SE.LAST_CALL_ET CONTINUE_TIME, /*执行时间 可能是单个sql也可能是整个功能*/
-
SE.PREV_EXEC_START, /*SQL execution start of the last executed SQL statement*/
-
SE.EVENT, /*等待事件*/
-
SE.LOCKWAIT, /*是否等待LOCK(SE,P)*/
-
SE.MACHINE, /*客户端的机器名。(WORKGROUP\PC-201211082055)*/
-
SE.USERNAME, /*创建该会话的用户名*/
-
SE.LOGON_TIME /*登陆时间*/
-
FROM GV$SESSION SE,
-
GV$SQLAREA SQ ,
-
x$kglpn p,
-
GV$process s
-
WHERE SE.SQL_HASH_VALUE = SQ.HASH_VALUE(+)
-
AND p.kglpnuse=SE.saddr
-
AND SE.SQL_ID = SQ.SQL_ID(+)
-
AND SE.INST_ID = SQ.INST_ID(+)
-
and s.addr=SE.paddr(+)
-
and p.kglpnhdl in ( select p1raw from gv$session_wait where event in ('library cache pin','library cache lock' ,'library cache load lock') )
该视图运行结果如下:
4、MOS 的文档【122793.1】里说导致librarycache lock通常有2种原因
-
(1)A DML operation that is hangingbecause the table which is accessed is currently undergoing changes (ALTERTABLE). This may take quite a long time depending on the size of the table andthe type of the modification (e.g. ALTER TABLE x MODIFY (col1 CHAR(200) on atable with thousands of records)
-
In this case,V$LOCK will show that the session doing the 'ALTER TABLE' with an exclusive DMLenqueue lock on the table object (LMODE=6, TYPE=TM where ID1 is the OBJECT_IDof the table). The waiting session however does not show up in V$LOCK yet so inan environment with a lot of concurrent sessions the V$LOCK information will beinsufficient to track down the culprit blocking your operation.
-
-
(2)The compilation of package willhang on Library Cache Lock and Library Cache Pin if any users are executing aprocedure/function defined in the same package.
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31324175/viewspace-2126076/
,如需转载,请注明出处,否则将追究法律责任。