oracle 死锁及锁的导致cpu高、内存高的排查详细过程

排查理由CPU高内存高

通过查询视图,找到被锁住的对象v$locked_object,根据其locked_mode,判断其锁类型

select l.xidusn, l.object_id, o.owner, o.object_name, l.session_id, l.oracle_username, l.os_user_name, l.process, decode(l.locked_mode, 0, '',        1, 'NULL',        2, '(SS)',        3, '(SX)',        4, '(S)',        5, '(SSX)',        6, '(X)',        '???') locked_mode from v$locked_object l, dba_objects o where l.object_id = o.object_id

判断查询结果是否存在锁

用以下的语句对视图v$sqltext进行查询,可以得到当前正在执行的SQL语句,以及执行SQL语句的session

select username, osuser, machine, terminal, program, 
sid, serial#, status, sql_address, sql_text
from v$session ss, v$sqltext sq
where type = 'USER'
and ss.sql_address = sq.address
order by ss.sid, ss.serial#, sq.piece

可以发现对同一表中的同一数据行进行更新的两条SQL语句。

通过这两条SQL语句,可以定位Java程序中导致问题的代码

借助于ORACLE的TRACE文件

Oracle发现死锁后,会在alert_[SID].log文件中输出如下的警告信息:ORA-00060: Deadlock detected.

并提示去查看相应的*.trc文件。通过分析*.trc文件可以看到死锁的详细情况

文件的位置在      select value from V$DIAG_INFO where name='Diag Trace';  

 cd /opt/app/BASE/oracle/diag/rdbms/data60/data601/trace/
 ls -lrt *.trc 

oracle 死锁及锁的导致cpu高、内存高的排查详细过程

查看死锁文件及原因

oracle 死锁及锁的导致cpu高、内存高的排查详细过程