sql语句

查看SID
select sid,serial#,username,program,terminal
from v$session

查看锁住的sid
SELECTp.spid,
      c.object_name,
      b.session_id,
      a.serial#,
      b.oracle_username,
      b.os_user_name
 FROMv$process p, v$session a, v$locked_object b, all_objects c
 WHEREp.addr = a.paddr
  ANDa.process = b.process
  ANDc.object_id = b.object_id;

alter system kill session'b.session_id,a.serial#';

查看锁住的表

select q.sql_text

   from v$session s, v$sqltext q
   where s.sql_address = q.address
   and s.sid in (select b.sid
                       from v$lock a, v$lock b
                       where a.id1 = b.id1
                        and b.lmode = 0
                        and a.type = 'TX'
                        and a.block = 1);


查找异常session的方法一:
OEM—> performance—> Blocking Sessions


查找异常session的方法二:
select r.root_sid, s.serial#,
       r.blocked_num, r.avg_wait_seconds,
       s.username,s.status,s.event,s.MACHINE,
       s.PROGRAM,s.sql_id,s.prev_sql_id
  from (select root_sid, avg(seconds_in_wait) as avg_wait_seconds,
               count(*) - 1 as blocked_num
          from (select CONNECT_BY_ROOT sid as root_sid, seconds_in_wait
                  from v$session
                 start with blocking_session is null
                connect by prior sid = blocking_session)
         group by root_sid
        having count(*) > 1) r,
       v$session s
 where r.root_sid = s.sid
 order by r.blocked_num desc, r.avg_wait_seconds desc;


该SQL语句即是根据v$session的字段blocking_session统计阻塞树根阻塞session的计数以及平均阻塞时间、并进行排序,排名最前的往往是异常session。
另外需要注意的是,持有锁时间最长、或等待时间最长的session都不一定是造成阻塞的根源session!


数据库阻塞检查处理方法
数据库阻塞检查处理方法
当应用服务器发生阻塞时(特别是集群1),应先按下面方法检查数据库,以判明应用服务器阻塞是否由数据库阻塞引起。
如果 select * from dba_waiters 有输出,转 阻塞情形A ;
如果 SELECT * FROM v$session_wait WHERE event LIKE 'library%' 有输出,转 阻塞情形B ;
ELSE 马上联系DBA。
阻塞情形A:
1、查看dba_waiters
select * from dba_waiters
发现有大量的等待session。如果无输出,数据库应没有问题。
2、查看等待事件情况
select p.spid pid,
s.sid,
s.SERIAL#,
s.username,
event,
w.p1,
w.P1TEXT,
w.p2,
w.P2TEXT,
w.p3,
w.P3TEXT,
sq.SQL_TEXT,
w.WAIT_TIME,
w.SECONDS_IN_WAIT,
w.STATE
from v$session_wait w, v$session s, v$process p, v$sql sq
where event not like 'SQL%' and w.sid = s.sid and s.paddr = p.addr and
s.SQL_ADDRESS = sq.ADDRESS and s.SQL_HASH_VALUE = sq.HASH_VALUE
发现有大量EVENT列的值是enqueue的记录。
3、查看锁等待情况
SELECT lpad(' ', DECODE(request, 0, 0, 1)) || sid sess,
id1,
id2,
lmode,
request,
type
FROM V$LOCK
WHERE id1 IN (SELECT id1 FROM V$LOCK WHERE lmode = 0)
ORDER BY id1, request
检查是否存在lmode为3的记录,发现session 441把持着一个个DML级的三级锁(存在一条sess=441,lmode=3的记录)
4、查看sid 为441的session情况,记录以下输出并发出到公告版:
select p.SPID, s.*
from v$session s, v$process p
where sid in (441) and p.ADDR = s.PADDR
SPID SID SERIAL#
26358 441 47439
查看该session的用户名、机器名、程序名、执行的sql等信息:
SELECT a.username,
a.machine,
a.program,
a.sid,
a.serial#,
a.status,
c.piece,
c.sql_text
FROM v$session a,
v$sqltext c
WHERE a.sid = <SID>
and a.sql_address=c.address(+)
ORDER BY c.piece
查看该session锁住的对象:
select b.object_name, a.* from v$locked_object a, dba_objects b
where session_id = <SID> and a.object_id = b.object_id
and a.locked_mode = 3
--查看是否有其他进程block这些进程
select * from dba_waiters WHERE waiting_session IN (XXX)
--查看这些session在等待什么事件
SELECT * FROM v$session_wait WHERE sid IN (XXX)
SQL*Net message from client 为 等待和客户端的通讯
5、杀掉sid为441的session
alter system kill session '441,47439';(其中441,47439分别是第四步查出的SID和SERIAL#的值)
6、如果第五步不成功,就需要在操作系统下终止进程。
kill -9 26358 (其中26358 是第四步查出SPID的值)
处理完成后,select * from dba_waiters无记录返回,数据库恢复正常。
阻塞情形B:
[一、分析解决过程]
1。查询发现数据库中有大量的library cache pin等待
SELECT * FROM v$session_wait WHERE event LIKE 'library%'
SID SEQ# EVENT P1TEXT P1
49 10781 library cache pin
75 60508 library cache pin
71 56470 library cache pin
...
2。分析library cache pin在等待的对象,发现是p_zs_bdsp_gb
SELECT kglnaown "Owner", kglnaobj "Object",sw.P1RAW
FROM x$kglob p,v$session_wait sw
WHERE p.kglhdadr=sw.P1RAW and sw.SID=987
db_zgxt p_zs_bdsp_gb 00000008E9AC7710
3。随便选等待中的一个session,查找引起library cache pin等待的session。发现其他session都在等待173
SELECT s.sid, kglpnmod "Mode", kglpnreq "Req"
FROM x$kglpn p, v$session s,V$SESSION_WAIT SW
WHERE p.kglpnuse=s.saddr
AND P.kglpnhdl=sw.P1RAW AND Sw.SID=987 order by mode desc
SID Mode Req
173 3 0
1224 0 2
1322 0 2
692 0 2
...
4。查找173的等待情况,发现它也是在等待library cache pin。
SELECT * FROM v$session_wait WHERE sid= 173
173 5502 library cache pin handle address 38280132368 00000008E9AC7710
5。继续查找是哪个session引起173的等待,发现是121
SELECT s.sid, kglpnmod "Mode", kglpnreq "Req"
FROM x$kglpn p, v$session s,V$SESSION_WAIT SW
WHERE p.kglpnuse=s.saddr
AND P.kglpnhdl=sw.P1RAW AND Sw.SID=173
121 2 0
173 0 3
6。查找121的session等待情况,发现它是在等待SQL*Net message from client,这是客户端和服务器之间
的通讯。因此可判定121是引起一系列等待的原因。
SID SEQ# EVENT P1TEXT P1 P1RAW
121 22946 SQL*Net message from client
7。查看121session的情况
select p.spid,s.* from v$session s ,v$process p where s.paddr=p.addr and S.sid in (121)
25645 00000008D5364860 121 89 3844244 00000008D438D518 40 DB_ZGXT 2 2147483644 00000008E130CDA0 ACTIVE DEDICATED 40 DB_ZGXT weblogic app02
8。在操作系统中发现25645进程(也即是121session)已经运行了6个多小时。
[db2:oracle2]prstat
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
25645 oracle2 24G 13G cpu194 0 0 6:16:02 2.3% oracle/2
9946 oracle2 24G 13G sleep 60 0 0:24:33 2.1% oracle/2
9。杀掉session 121后,应用恢复正常。
SQL> alter system kill session '121,89';
alter system kill session '121,89'
*
ERROR at line 1:
ORA-00031: session marked for kill
[db2:oracle2]kill -9 25645
------------------------
----------------------------------------------------------
-- 查找使用了什么语句,这个不一定有用(对于等待commit/rollback)
-- 的操作失效
select st.SQL_TEXT
from v$sqltext st,
v$session si
where st.ADDRESS = si.SQL_ADDRESS
and st.HASH_VALUE = si.SQL_HASH_VALUE
and si.SID in ()
order by st.PIECE
----------------------------------------------------------
-- 查找锁的类型、锁住的对象
select distinct lk.TYPE,lk.LMODE,do.owner || '.' || do.object_name
from v$lock lk,
v$locked_object lo,
dba_objects do
where do.object_id = lo.OBJECT_ID
and lo.SESSION_ID = lk.SID
and lk.SID in ()

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值