设为首页 收藏本站
查看: 599|回复: 0

[经验分享] ORACLE死锁故障排查的一般性手法的备忘录

[复制链接]

尚未签到

发表于 2015-6-16 10:46:58 | 显示全部楼层 |阅读模式
  故障现象:
  两个Java写的后台批处理同时执行时,发生了死锁现象。
  
  排查手法:
  通过查询视图,找到被锁住的对象v$locked_object,根据其locked_mode,判断其锁类型
  查询SQL语句:



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
  判断查询结果,发现两个Session对同一个表的数据行进行了排他。
  
  用以下的语句对视图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程序中导致问题的代码。
  
  问题原因分析:
  对Java代码进行分析后,发现有一个按照数据行主键,逐行循环处理的操作。
  不幸的是,循环前,从KeySet()生成的主键列表没有进行排序,导致每次循环的执行顺序都是随机的。
  例如,假设两个session都想要对数据行A,B,C,D进行处理,很有可能session1先处理了A,B,
  而此时session2刚好处理完了C,D。这样,session1想要继续处理的C,D由于正被session2给锁住,所以无法继续执行。
  session2想要处理的A,B也被session1给锁着,session2也无法继续,两个session最终都没有办法终止。
  
  借助于ORACLE的TRACE文件
  Oracle发现死锁后,会在alert_[SID].log文件中输出如下的警告信息:ORA-00060: Deadlock detected.
  并提示去查看相应的*.trc文件。通过分析*.trc文件可以看到死锁的详细情况,
  下面是一个*.trc文件的例子:
  
  *** 2012-01-09 20:11:22.379
DEADLOCK DETECTED ( ORA-00060 )
[Transaction Deadlock]
The following deadlock is not an ORACLE error. It is a
deadlock due to user error in the design of an application
or from issuing incorrect ad-hoc SQL. The following
information may aid in determining the deadlock:
Deadlock graph:
                       ---------Blocker(s)--------  ---------Waiter(s)---------
Resource Name          process session holds waits  process session holds waits
TX-000a0006-0000f48f        65     101     X             64     102           X
TX-0007000f-0000d8a3        64     102     X             65     101           X
session 101: DID 0001-0041-00000002 session 102: DID 0001-0040-00000002
session 102: DID 0001-0040-00000002 session 101: DID 0001-0041-00000002
这里明确指出了发生死锁的两个session的ID
Rows waited on:
  Session 101: obj - rowid = 0008915A - AACJFaAAFAAEwq1AAA
  (dictionary objn - 561498, file - 5, block - 1247925, slot - 0)
  Session 102: obj - rowid = 0008915A - AACJFaAAFAAEwq1AAI
  (dictionary objn - 561498, file - 5, block - 1247925, slot - 8)
----- Information for the OTHER waiting sessions -----
Session 102:
  sid: 102 ser: 2 audsid: 25260645 user: 87/USR_BAT flags: 0x41
  pid: 64 O/S info: user: ora_1, term: UNKNOWN, ospid: 5915
    image: oracle@pcXX
  client details:
    O/S info: user: root, term: unknown, ospid: 1234
    machine: pcXX program: JDBC Thin Client
    application name: JDBC Thin Client, hash value=2546894660
  current SQL:

UPDATE XXXX SET XXXX  这里是导致死锁的SQL语句1
  ----- End of information for the OTHER waiting sessions -----
Information for THIS session:

  *** 2012-01-09 20:11:22.530
----- Current SQL Statement for this session (sql_id=b0qn65w78t10b) -----
UPDATE XXXX SET XXXX 这里是导致死锁的SQL语句2
  ===================================================
  
  ※ log文件和trc文件的存放路径,取决于Oracle的安装路径,可以借助于文件检索功能。
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-77880-1-1.html 上篇帖子: PL/SQL报错:无法解析指定的连接标识符 下篇帖子: oracle block
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表