龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 数据库类 > Oracle 技术 >

诊断Oraacle数据库Hanging问题(1)(3)

时间:2011-04-12 23:18来源:未知 作者:admin 点击:
分享到:
输出查看相关的V$视图 当数据库挂起的时候,执行下面的查询: SPOOL v_views.log; SELECT * FROM v$parameter; SELECT class, value, name FROM v$sysstat; SELECT sid, id1, id2, type,

输出查看相关的V$视图

当数据库挂起的时候,执行下面的查询:

SPOOL v_views.log;
SELECT *
FROM v$parameter;
SELECT class, value, name
FROM v$sysstat;
SELECT sid, id1, id2, type, lmode, request
FROM v$lock;
SELECT l.latch#, n.name, h.pid, l.gets, l.misses,
l.immediate_gets, l.immediate_misses, l.sleeps
FROM v$latchname n, v$latchholder h, v$latch l
WHERE l.latch# = n.latch#
AND l.addr = h.laddr(+);
SELECT *
FROM v$session_wait
ORDER BY sid;

/* 重复最后一个查询最少三遍,以确定哪个在重复等待*/
SPOOL OFF;


如果是指定的查询被挂起了,可以使用下面的查询找出相应的查询SQL语句:

通过操作系统上的PID找出相应的SQL语句的SID:

SELECT s.sid, p.spid
FROM v$session s, v$process p
WHERE s.paddr = p.addr
AND ... < p.spid = <os pid> or perhaps
s.sid = <sid from v$session> >
然后通过SID找出相应的SQL语句的具体内容:
SELECT s.sid, s.status, q.sql_text
FROM v$session s, v$sqltext q
WHERE s.sql_hash_value = q.hash_value
AND s.sql_address = q.address
AND s.sid = <sid>
order by q.piece;


查询V$SESSION_WAIT视图看看当前的等待事件

column sid format 990
column seq# format 99990
column wait_time heading 'WTime' format 99990
column event format a30
column p1 format 9999999990
column p2 format 9999999990
column p3 format 9990
select sid,event,seq#,p1,p2,p3,wait_time from V$session_wait
where sid=<SID>
order by sid;

查询当前挂起数据库的SQL语句中的lockwait设置的是多少,如果非空,那么看看什么锁住了当前对象,是什么类型的锁。 

SELECT lockwait
FROM v$session
WHERE sid = <sid>;
col Username format A15
col Sid format 9990 heading SID
col Type format A4
col Lmode format 990 heading 'HELD'
col Request format 990 heading 'REQ'
col Id1 format 9999990
col Id2 format 9999990
select SN.Username, M.Sid, M.Type,
DECODE(M.Lmode, 0, 'None', 1, 'Null', 2, 'Row Share', 3, 'Row
Excl.', 4, 'Share', 5, 'S/Row Excl.', 6, 'Exclusive',
LTRIM(TO_CHAR(Lmode,'990'))) Lmode,
DECODE(M.Request, 0, 'None', 1, 'Null', 2, 'Row Share', 3, 'Row
Excl.', 4, 'Share', 5, 'S/Row Excl.', 6, 'Exclusive',
LTRIM(TO_CHAR(M.Request, '990'))) Request,
M.Id1, M.Id2 from V$SESSION SN, V$LOCK M
WHERE (SN.Sid = M.Sid and M.Request ! = 0)
or (SN.Sid = M.Sid and M.Request = 0 and Lmode != 4 and (id1, id2)
in (select S.Id1, S.Id2 from V$LOCK S where Request != 0 and S.Id1
= M.Id1 and S.Id2 = M.Id2) ) order by Id1, Id2, M.Request


查询v$process视图中的LATCHWAIT设置是多少?如果这个值非空,那么继续查是谁保存了这个latch。

SELECT latchwait
FROM v$process
WHERE spid = <pid>;SELECT latchwait
FROM v$process
WHERE spid = <pid>;
column name format a32 heading 'LATCH NAME'
column pid heading 'HOLDER PID'
select c.name,a.addr,a.gets,a.misses,a.sleeps,
a.immediate_gets,a.immediate_misses,b.pid
from v$latch a, v$latchholder b, v$latchname c
where a.addr = b.laddr(+) and a.latch# = c.latch#
and c.name like '&latch_name%' order by a.latch#;


上述这些保存了锁和latch的会话是否关闭了终端但是没有退出,这可能会导致一个影子进程继续保存那些资源,这样就需要杀掉相应的进程,可以使用如下语句:

alter system kill session '<sid, serial# from v$session>'

精彩图集

赞助商链接