ORACLE 死锁分析过程

ORACLE 死锁分析
关于死锁一般3种处理方式
1、事前预测
2、资源分级
3、事后检测释放


我知道的ORACLE MYSQL都是采用第三种在行锁级别上的话。
这里分析一个ORACLE死锁,首先一个死锁肯定会生成一个TRACE文件,这里会记录很多信息如:
Deadlock graph:
                       ---------Blocker(s)--------  ---------Waiter(s)---------
Resource Name          process session holds waits  process session holds waits
TX-0058000f-0000b473       649    1204     X            651    1252           X
TX-0019001c-0004e0b0       651    1252     X            649    1204           X


这里给出了进程和会话id
Rows waited on:
  Session 1204: obj - rowid = 0003D942 - AAA9lCAAEAADgaNAAI
  (dictionary objn - 252226, file - 4, block - 919181, slot - 8)
  Session 1252: obj - rowid = 0003D942 - AAA9lCAAEAADgaNAAa
  (dictionary objn - 252226, file - 4, block - 919181, slot - 26)
这里给出导致死锁的行


同时给出了最后触发死锁会话 1252的语句
----- Information for the OTHER waiting sessions -----
Session 1252:
  sid: 1252 ser: 35883 audsid: 7170593 user: 235/FEECORESV
    flags: (0x100045) USR/- flags_idl: (0x1) BSY/-/-/-/-/-
    flags2: (0x40009) -/-/INC
  pid: 651 O/S info: user: oracle, term: UNKNOWN, ospid: 13035
    image: oracle@oratest11
  client details:
    O/S info: user: sky, term: unknown, ospid: 1234
    machine: autobots program: JDBC Thin Client
    application name: JDBC Thin Client, hash value=2546894660
  current SQL:
  UPDATE *******
 
----- End of information for the OTHER waiting sessions -----
 
Information for THIS session:
 
----- Current SQL Statement for this session (sql_id=3vh5sc7pgtrjy) -----
UPDATE *******


那么到这里我们大概能够分析出
A:1204拿到AAA9lCAAEAADgaNAAa 行锁    B:1252 拿到 AAA9lCAAEAADgaNAAI 行锁
C:1204需要AAA9lCAAEAADgaNAAI 则等待   D:1252 需要  AAA9lCAAEAADgaNAAa 则触发死锁1204回滚


那么随后trace给出1204 C这一步等待时间和事物信息
SO: 0xee1fcd10, type: 4, owner: 0xf031e750, flag: INIT/-/-/0x00 if: 0x3 c: 0x3
     proc=0xf031e750, name=session, file=ksu.h LINE:12624, pg=0
    (session) sid: 1204 ser: 2443 trans: 0xe9221180, creator: 0xf031e750
              flags: (0x100045) USR/- flags_idl: (0x1) BSY/-/-/-/-/-
              flags2: (0x40009) -/-/INC
              DID: , short-term DID: 
              txn branch: (nil)
              oct: 6, prv: 0, sql: 0xf25d2278, psql: 0xc4346788, user: 235/FEECORESV
    ksuxds FALSE at location: 0
    service name: SYS$USERS
Current Wait Stack:
     0: waiting for 'enq: TX - row lock contention'
        name|mode=0x54580006, usn<<16 | slot=0x19001c, sequence=0x4e0b0
        wait_id=33 seq_num=34 snap_id=1
        wait times: snap=3.001739 sec, exc=3.001739 sec, total=3.001739 sec
        wait times: max=infinite, heur=3.001739 sec
        wait counts: calls=1 os=1
        in_wait=1 iflags=0x15a0
随后给出了导致他等待会话的等待信息,这里不给出。当然随后还有很多类容,但是关键就是如上
但是这里并没有一个显示的事物执行的过程,如果要看到完整的语句我们需要日志挖掘,我挖掘出来的如下:

1204:
set transaction read write;
select * from TEST.TEST where ROWID = 'AAA9lCAAEAADgaNAAa' for update;
commit;
1252:
set transaction read write;
select * from TEST.TEST where ROWID = 'AAA9lCAAEAADgaNAAI' for update;
update TEST.TEST set "STATUS" = 'SUCCESS', "DETAIL" = '执行成功', "RAW_UPDATE_TIME" = TO_TIMESTAMP('19-SEP-16 01.27.25.714715 PM') where "IDENTITY" = '39319' and "STATUS" = 'PROCESSING' and "DETAIL" IS NULL and "RAW_UPDATE_TIME" = TO_TIMESTAMP('19-SEP-16 01.27.24.611036 PM') and ROWID = 'AAA9lCAAEAADgaNAAa';
commit;

这样能够清楚的看到1204的update并没有执行,而由于触发了deadlock回滚掉了。

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
传输表空间综述: 不论是数据字典管理的表空间还是本地管理的表空间,都可以使用传输表空间技术;从9i开始传输表空间不需要在源数据库和目标数据库之间具有同样的DB_BLOCK_SIZE块大小;使用传输表空间迁移数据比使用数据导入导出工具迁移数据的速度要快,这是因为传输表空间只是复制包含实际数据的数据文件到目标数据库的指定位置,而使用数据导入导出工具将传输表空间对象的元数据到目标数据库。 我们知道oracle利用imp/impdp传输表空间transport_tablespace需要满足以下条件: 1.字符集相

在线重定义的补充测试 - 2016-09-22 17:09:04

    在很多时候,我们都是需要保持业务的可持续性,尽管说DDL的过程持续时间很短,但是在线业务出现,就会阻塞DML,导致业务访问中断,事务收到影响,所以在有些场景下,高可用的需求可能比性能的需求优先级还要高一些。     比如一个分区表,突然发现分区的规则存在一些问题,如果需要重新规划分区,部署,可能对于在线业务影响较大,能不能平滑的过渡到重新规划的分区模式下。     比如一个普通表,随着数据量的增加发现已经存在一些管理瓶颈,比如历史数据的清理比较麻烦,想改为分区表的方式     比如一个表需要添加若干

oracle手动删除数据库 - 2016-09-21 14:09:23

有时候,无法使用图形界面时,我们需要手动删除数据库,具体操作步骤如下: 一、手动删除文件系统数据库    1.停止监听,防止有新的连接产生,同时,在数据库配置了em的,也需要停止        $ lsnrctl stop listener_name        $ emctl stop dbconsole    2.获得数据文件,日志文件及控制文件的相关信息,包含归档              $ sqlplus /as sysdba        SQLshow parameter control
  【 技巧 】如何让普通用户可以杀掉自己用户的会话   1    BLOG 文档结构图     2    前言部分   2.1    导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识, ~O(∩_∩)O~ : ①  如何让普通用户可以杀掉自己用户的会话(重点)     Tips : ①  本文在 itpub ( http://blog.itpub.net/26736162 )、博客园 ( http://www.cnblogs.com/lhrbest )

聊聊Data Guard中的DG Broker - 2016-09-20 18:09:07

    DG Broker是Oracle为Data Guard维护提供的一个很不错的工具,从我的实际使用来看,早期的版本中似乎大家都还是存在一定的思维定式,认为手工维护已经足够了。这个工具就不那么需要了,我们完全可以脱离开这些工具来直观的使用命令行的方式来维护,这个观点也没错,不过从与时俱进的角度来看,本来能够让你更轻松的一个工具,如果不用实在是太可惜了。     DG Broker在数据库端需要启用一个后台进程dmon来维护,这个后台进程启动,需要设置dg_broker_start为true即可,如果要停
报名缘起   去年年底,崔老师发微信说12c OCM可以提上日程了。先不说那不菲的考试费用,单一个C(loud)就够我冷静一下了。最近几次参加线下分享活动,很多主题都离不开Cloud,听得云里雾里的。我问了一下自己,我可以吗?要不再等等吧。   过完年后,几个小伙伴蠢蠢欲动,看着朋友圈有朋友晒出的12c战袍还蛮帅的,走,报名去! 12c OCM考试号称“史上最难”   Oracle于2015年正式推出12c OCM升级考试,和以往的10g、11g OCM不同的是,12c OCM考试还要求考生每场达到最低分
  【 等待事件 】等待事件系列( 3+4 ) --System IO (控制文件) + 日志类等待   1    BLOG 文档结构图     2    前言部分   2.1    导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识, ~O(∩_∩)O~ : ①  控制文件类等待 ② 日志类等待   2.2    相关参考文章链接 【推荐】 等待事件系列(1)--User I/O类型(下) http://blog.itpub.net/26736162/v
今儿需要部署一个Oracle环境,为了简单些,选择了Oracle提供的Linux版本介质:OracleLinux-R6-U2-Server-x86_64-dvd.iso,在安装的过程中碰见了几个常见的问题,简要记录下,便于日后查找。 问题1:无法登陆图形界面   按照正常流程安装后,默认是没有安装图形界面的,因此进入的是命令行界面,若不用静默安装或克隆安装,则必须需要图形界面。于是按照常规做如下操作:  (1) 修改/etc/inittab中id:3:initdefault的3为5。  (2) start

【函数】wm_concat包的订制 - 2016-09-20 14:09:39

  【 函数 】 wm_concat 包的订制   1    BLOG 文档结构图     2    前言部分   2.1    导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识, ~O(∩_∩)O~ : ①  利用系统包创建 WM_CONCAT 函数 (重点) ② ORA-00904: "wm_concat":invalid identifier 错误解决 ③  订制自己的 WM_CONCAT 函数 ④  listagg 分析函数的使用 ⑤ ORA-0
数据迁移中有一种解决方案很有亮点,如果表的数据量大,迁移涉及的表不多,同时对于维护时间有要求的情况下,物化视图的prebuilt方式就是一种很不错的选择。 大体的步骤和方法如下: 假设源环境是test_source,目标环境是test_target 在源环境中test_source的操作如下: Create table test_mv as select *from all_objects  ; alter table test_mv modify(object_id primary key); creat