一 什么是数据库hang
1 用户不能登录数据库
2 数据库不能正常工作
3 select 1 from dual 不出结果
4 不能正常完成建表操作
二 数据库被锁住
1 一个或多个会话停止工作
三 如果得知数据库hang 或者被锁
1 测试
2 用户抱怨
3 systemstate 或者hanganalze 操作查看被阻塞的会话
4 一个查询hang 住不动
5 会话耗费了大量的cpu
6 ora-60 错误出现
四 上述现象可能会在以下操作之后:
1 schema 变动
2 数据库参数变动
3 应用程序的改动
4 数据库升级
五 理清 issue 发生的状况,你必须了解如下
1 受影响的用户
2 导致问题的事件的发生的顺序
3 问题是从哪里/如何被发现的
4 问题的表现
5 什么正在工作
6 最希望的或者最能够接受的结果是什么
7 你做了什么操作来解决这个问题
六 验证工作
必须对数据库是否hang 或者lock 进行验证 否则会导致采取错误的动作。也有可能是os 的性能问题导致数据库表现为hang 住的!!
select 1 from dual;
七 收集数据
1 使用 LTOM 收集数据
2 使用 OSW 收集系统性能数据
3 使用 EM
八 使用hanganalyze 和systemstate 收集数据
systemstate的用法http://space.itpub.net/464838/viewspace-664380
DUMP进程状态可以使用:
alter sessions set events 'immediate trace name processstate level ';
或者使用:
oradebug setmypid
oradebug ulimit
oradebug dump processstate
当诊断数据库挂起时,可以使用DUMP命令转储整个系统状态:
alter sessions set events 'immediate trace name systemstate level ';
或:
oradebug setmypid
oradebug ulimit
oradebug dump systemstate
如果为了获取全面一点的信息,可以使用Level 10。
SQL> oradebug setmypid
SQL> oradebug unlimit
SQL> oradebug dump systemstate 10
另外如果系统挂起,无法用SQL*Plus连接,从Oracle 10g开始,可以使用sqlplus -prelim选项强制登录,然后即可进行系统状态信息转储:
sqlplus -prelim '/ as sysdba'
oradebug setmypid
oradebug unlimit;
oradebug dump systemstate 10
====================================
--for 单实例
SQL>ORADEBUG hanganalyze
--for RAC 实例
SQL>ORADEBUG setmypid
SQL>ORADEBUG setinst all
SQL>ORADEBUG -g def hanganalyze
注意:如果Level过大的话会产生大量的跟踪文件并影响系统的I/O性能,Oracle建议不要采用3级以上的跟踪。
以sysdba 登录
oradebug setmypid
oradebug unlimit
oradebug -g all hanganalyze 3
oradebug -g all dump systemstate 266
--等待2min
oradebug -g all hanganalyze 3
oradebug -g all dump systemstate 266
默认搜集数据的步骤如下:
1 hanhanalyze level 3
2 systemstate level 266
3 wait 60 sec
4 hanhanalyze level 3
5 systemstate level 266
对于单实例 trace file 文件在 本地的user_dump_desttination
对于rac 环境 trace file 文件在每个节点的 backgroup_dump_destination
九 获取v$性能数据
SPOOL v_views.log;
/*set linesize 130
col "Parameter" form. a50
col "Session Value" form. a30
col "Instance Value" form. a30
*/
select a.ksppinm "Parameter",
b.ksppstvl "Session Value",
c.ksppstvl "Instance Value"
from x$ksppi a, x$ksppcv b, x$ksppsv c
where a.indx = b.indx
and a.indx = c.indx
order by 1 ;
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 ;
/* repeat last query 3 times - we want to see who's repeatedly waiting*/
SPOOL OFF;
获取了数据之后 就是分析了!!