诊断Oracle数据库Hanging问题 联系客服

发布时间 : 星期一 文章诊断Oracle数据库Hanging问题更新完毕开始阅读319158bcfac75fbfc77da26925c52cc58bd6908e

诊断Oracle数据库Hanging问题

Completed: ALTER DATABASE OPEN

如果正常的关闭或者immediate关闭挂起,那么意味着Oracle正在等待激活的会话退出。 在Unix系统上,还可以寻找正在挂起的启动或者关闭操作,然后trace pid。 寻找错误:

1) 检查AlertSID.log告警日志文件看看是否存在错误信息,此告警日志文件的具体路径位置可以由初始化参数中的background_dump_dest中获得或者在sqlplus中执行show parameter dest获得。 2) 检查上述目录中的在数据库挂起时间生成的跟踪文件。查看里面的错误信息,不用搜索整个跟踪文件,相关的错误信息一般都是在文件的最开始出现。

3) 如果是远程访问的问题,那么还需要检查sql*net跟踪目录下的跟踪文件。 4) 检查系统信息的错误日志,在大多数的Unix下都是在/var/adm目录下。 输出查看相关的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:

5 / 10

诊断Oracle数据库Hanging问题

SELECT s.sid, p.spid FROM v$session s, v$process p

WHERE s.paddr = p.addr

AND ... < p.spid = or perhaps

s.sid = >

然后通过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 = 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= order by sid;

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

SELECT lockwait FROM v$session WHERE 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

6 / 10

诊断Oracle数据库Hanging问题

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 = ;SELECT latchwait

FROM v$process WHERE spid = ;

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 ''

如果会话没有被挂起而只是运行缓慢,那么需要查看会话的具体信息:

SELECT s.sid, s.value, t.name FROM v$sesstat s, v$statname t WHERE s.statistic# = t.statistic#

AND s.sid = ;

如果会话极度的缓慢或者是被挂起了,那么需要查看会话的等待信息:

SELECT *

FROM v$session_wait

7 / 10

诊断Oracle数据库Hanging问题

where sid = ;

如果是个分布式事务,那么需要在各个节点上都运行如下SQL语句:

SELECT * FROM dba_2pc_pending; SELECT * FROM pending_sessions$; SELECT * FROM pending_sub_sessions$; SELECT * FROM dba_2pc_neighbors;

如果是MTS服务器,那么可以查看一下当前的dispatcher的繁忙程度:

select name,network,status,

(busy /(busy + idle)) * 100 \

from v$dispatchers;

还可以查看V$SHARED_SERVERS视图获取相应的信息:

select name,status,requests, (busy /(busy + idle)) * 100 \

from v$shared_servers

收集操作系统的相关信息:

1) 简短的描述你的架构,包括CPU的数量,磁盘的数量。是否使用了裸设备,使用了NFS文件系统,共享磁盘。。。。是否镜像了这些?

2) 测量不同操作系统级别的活动:过量的CPU或者I/O,页面,交换区等。有许多的工具可以监测这些,例如TOP。

Unix上的工具:SAR,VMSTAT,NETSTAT,TOP,TRUSS等 Vms上的工具:MONITOR,ANALYZE,PROCESS等

Windows上的工具:Performance Monitor, Event Monitor, Dr. Watson,qslice等 3) 检查系统的日志文件,在大多数Unix平台上日志文件都存在于/var/adm目录下。 获取SYSTEMSTATE和HANGANALYZE的dump

这两个命令将在user_dump_dest目录下创建一个非常大的跟踪文件,初始化参数文件中的

MAX_DUMP_参数确定了能够容纳的最大跟踪文件的大小。使用Oradebug命令设置unlimit将能允许执行一个完全的dump。请确认整个数据库已经挂起或者即将挂起,并且在Alert告警日志文件中没有任何归档的错误的时候才可以做此操作。

8 / 10