科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道诊断Oracle数据库Hanging问题(3)

诊断Oracle数据库Hanging问题(3)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文具体讨论了如何诊断数据库的Hanging问题,步骤有:1、描述清楚出现的现象问题;2、寻找具体错误;3、收集操作系统级别上的数据;4、获取systemstate和hanganalyze的dump;5、获取STATPACK的输出报告;6、获取PROCESSSTATE的dump。

作者:叶梁 来源:IT168  2007年9月1日

关键字: ORACLE

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共4页)

输出查看相关的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>'


    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章