Chinaunix首页 | 论坛 | 博客
  • 博客访问: 88069
  • 博文数量: 24
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 292
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-05 00:33
个人简介

干掉蝴蝶效应中的蝴蝶。。。

文章分类

全部博文(24)

文章存档

2014年(6)

2013年(18)

我的朋友

分类: Oracle

2013-08-11 17:21:49

1:我常用快速解决问题的语句:
select 'kill -9 '||spid from v$process where addr in (select /*+ ordered */ h1.paddr 
  from dba_kgllock w, dba_kgllock h, v$session w1, v$session h1
 where
  (((h.kgllkmod != 0) and (h.kgllkmod != 1)
     and ((h.kgllkreq = 0) or (h.kgllkreq = 1)))
   and
     (((w.kgllkmod = 0) or (w.kgllkmod= 1))
     and ((w.kgllkreq != 0) and (w.kgllkreq != 1))))
  and  w.kgllktype       =  h.kgllktype
  and  w.kgllkhdl        =  h.kgllkhdl
  and  w.kgllkuse     =   w1.saddr
  and  h.kgllkuse     =   h1.saddr
  and  h1.type='USER')
/

select /*+ ordered */ w1.sid  waiting_session,
        h1.sid  holding_session,
        w.kgllktype lock_or_pin,
        w.kgllkhdl address,
        decode(h.kgllkmod,  0, 'None', 1, 'Null', 2, 'Share', 3, 'Exclusive',
           'Unknown') mode_held,
        decode(w.kgllkreq,  0, 'None', 1, 'Null', 2, 'Share', 3, 'Exclusive',
           'Unknown') mode_requested
  from dba_kgllock w, dba_kgllock h, v$session w1, v$session h1
 where
  (((h.kgllkmod != 0) and (h.kgllkmod != 1)
     and ((h.kgllkreq = 0) or (h.kgllkreq = 1)))
   and
     (((w.kgllkmod = 0) or (w.kgllkmod= 1))
     and ((w.kgllkreq != 0) and (w.kgllkreq != 1))))
  and  w.kgllktype       =  h.kgllktype
  and  w.kgllkhdl        =  h.kgllkhdl
  and  w.kgllkuse     =   w1.saddr
  and  h.kgllkuse     =   h1.saddr
/

2:分析语句的x$表
select view_definition from v$fixed_view_definition where view_name='DBA_KGLLOCK';

CREATE OR REPLACE FORCE VIEW SYS.dba_kgllock (kgllkuse,
                                              kgllkhdl,
                                              kgllkmod,
                                              kgllkreq,
                                              kgllktype
                                             )
AS
   SELECT kgllkuse, kgllkhdl, kgllkmod, kgllkreq, 'Lock' kgllktype
     FROM x$kgllk
   UNION ALL
   SELECT kglpnuse, kglpnhdl, kglpnmod, kglpnreq, 'Pin' kgllktype
     FROM x$kglpn;
    
x$kgllk;
ADDR RAW(4)
INDX NUMBER
INST_ID NUMBER
KGLLKADR RAW(4)
KGLLKUSE RAW(4) ---(v$session.saddr)
KGLLKSES RAW(4) ---owner地址
KGLLKSNM NUMBER ---SID
KGLLKHDL RAW(4) ---handle address
KGLLKPNC RAW(4) ---the address of the call pin
KGLLKPNS RAW(4) ---trace中的session pin值
KGLLKCNT NUMBER
KGLLKMOD NUMBER ---持有lock的模式(0为nolock/pin held﹐1为null,2为share﹐3为exclusive)
KGLLKREQ NUMBER ---请求lock的模式(0为nolock/pin held﹐1为null,2为share﹐3为exclusive)
KGLLKFLG NUMBER ---cursor的状态
KGLLKSPN NUMBER ---trace中的savepoint的值
KGLLKHTB RAW(4)
KGLNAHSH NUMBER ---(v$session.sql_hash_value)
KGLLKSQLID VARCHAR2(13) ---(v$session.sql_id)
KGLHDPAR RAW(4) ---(v$session.sql_address)
KGLHDNSP NUMBER
USER_NAME VARCHAR2(30) ---(v$session.username)
KGLNAOBJ VARCHAR2(60)

x$kglpn;
ADDR RAW(4)
INDX NUMBER
INST_ID NUMBER
KGLPNADR RAW(4)
KGLPNUSE RAW(4) ---(v$session.saddr)
KGLPNSES RAW(4) ---owner地址
KGLPNHDL RAW(4) ---handle address (v$session.p1)
KGLPNLCK RAW(4)
KGLPNCNT NUMBER
KGLPNMOD NUMBER ---持有pin的模式(0为no lock/pin held﹐1为null,2为share﹐3为exclusive)
KGLPNREQ NUMBER ---请求pin的模式(0为no lock/pin held﹐1为null,2为share﹐3为exclusive)
KGLPNDMK NUMBER
KGLPNSPN NUMBER ---trace中的savepoint的值

rac实例有自己的shared pool,handle地址不同,用handle地址去查找要注意。
但是x$kglob中被pin住的对象是不变的,所以handle地址可以从x$kglob中去查找。
x$kglob:
addr:
kglnaown:对象属主
kglnaobj:对象名
kglhdpar:父游标地址
kglhdadr:游标地址,kglhdpar=kglhdadr就是父游标(v$session.p1 lc pin)
kglnahsh:(v$sql.hash_value lc pin)(v$session.p1 lc mutex x)
kglhdobj:
kglobtyd:
kglobt23:
kglobt24:
kglhdexc:
kglhdnsp:

3:库缓存常见等待事件
3.1:library cache pin:
v$session.event--v$session.p1--x$kglpn.kglpnhdl--x$kglob.kglhdadr--kglnaown, kglnaobj
v$session.event--v$session.saddr--x$kglpn.kglpnuse--x$kglpn.kglpnhdl--x$kglob.kglhdadr--kglnaown, kglnaobj
v$session.event--v$session.p1--x$kglob.kglhdadr--kglnaown, kglnaobj

select addr,kglhdadr,kglhdpar,kglnaown,kglnaobj,kglnahsh,kglhdobj from x$kglob
where kglhdadr=v$session.p1(lc pin kglnahsh=v$sql.hash_value)

select a.sid,a.username,a.program,b.addr,b.kglpnadr,b.kglpnuse,b.kglpnses,b.kglpnhdl,b.kglpnlck,b.kglpnmod,kglpnreq
from v$session a,x$kglpn b
where a.saddr=b.kglpnuse and b.kglpnhdl=v$session.p1(lc pin) and b.kglpnmod<>0;

select namespace,reloads,invalidations from v$librarycache;
reloads means cursor heaps were kicked out implying shared pool too small

3.2:library cache lock:
同上x$kglpn换为x$kgllk

3.3:library cache: mutex X:
select p1,count(1) from v$session where event='library cache: mutex X' group by p1;
select kglhdadr address,kglnaown,substr(kglnaobj,1,20) name,kglnahsh hash_value,kglobtyd type,
kglobt23 locked_total,kglobt24 pinned_total,kglhdexc executions,kglhdnsp namespace from x$kglob where kglnahsh=v$session.p1(lc mutex x )

3.4:cursor: pin S wait on X 查找holder
SELECT decode(trunc(&P2/4294967296),0,trunc(&P2/65536),trunc(&P2/4294967296)) SID_HOLDING_MUTEX FROM dual;

阅读(5053) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~