RAC中的死锁的判断机制跟单机很不相同,比单机要复杂的多,而且消耗的时间和资源也比单机要多的多,所以亚马逊的DBA

TEAM曾经在一份经验总结中指出如果是并发非常大的OLTP系统,如果锁的问题处理不好,那可能是个恶梦。这个测试其实很简单,找一个RAC的机器,自己模拟一个死锁,然后等到ORACLE自动检测并解开一个锁,大多数时候需要消耗1分钟甚至更长的时间,无论发生死锁的SESSION是在同一个节点还是在不同的节点(而单机的时候死锁检测是非常快的,基本上一发生资源相互等待,立马会报一个死锁出来)。如果事务非常频繁,而一个死锁检测需要消耗1分钟时间的话,那立马会引起后面的SESSION的锁等待,假如两个SESSION

LOCK住的资源上每秒钟有100个TRANSACTION发生,那等1分钟后锁自动解开的时候,已经有6000个SESSION堆积起来了,这会引起数据库端的SESSION数目急剧上升,也可能会超过数据库的最大SESSION数目的限制,也许这些会话会导致前端WEB或者AS连接池爆满从而导致后面的请求不能进来等等一堆问题,总之,这是个很可怕的事!

最根本的原因是在锁的检测机制上,在RAC环境下,是由LMD进程来统一管理各个节点的锁资源的,至于为什么检测一个死锁需要这么长时间不是这篇文章探讨的重点,这篇文章主要探讨的是如何来找到锁发生的原因并解决掉这个问题。而且发生死锁的情况不一定完全是因为资源的交叉,也有BITMAP死锁、ITL死锁、外键死锁等多种(这个可以参考http://zhang41082.itpub.net/post/7167/301109和http://zhang41082.itpub.net/post/7167/302927),这里只探讨资源交叉等待发生的死锁,以下提到的死锁专门指资源交叉等待的这种死锁。

单机情况下的死锁处理起来比较简单,一般都会生成_ORA_.TRC类似的TRACE文件,文件中会详细的记录发生死锁时的SESSION相关的情况,包括执行什么SQL,这个SQL如果是绑定变量的,那可以根据发生锁等待的资源的ROWID来找到具体等待哪一行的数据,从而根据业务逻辑,找到死锁在程序中发生的位置。但如果是RAC环境,那这个TRACE文件则是_LMD_.TRC这样的格式的,其中保留了发生死锁时DUMP出来的相关信息,但是这些信息没有单机时候那么详细。那么,可以根据发生死锁时的事务的XID来进行LOGMINER,找到当时整个事务发生时执行的所有相关SQL,从而进行分析和定位(LOGMINER的使用这里不作介绍)。

下面首先来看一个RAC下死锁发生时的TRACE文件:

Global Wait-For-Graph(WFG) at ddTS[0.1e9] :

BLOCKED 0xc5ab67540 5 [0x8002b][0x2bc9d9],[TX]

[119000-0003-000658C4] 2

BLOCKER 0xbc5fb5438 5 [0x8002b][0x2bc9d9],[TX]

[DB000-0001-00002720] 0

BLOCKED 0xc5ad5b040 5 [0x413000b][0xaf44b],[TX]

[DB000-0001-00002720] 0

BLOCKER 0xbd1873960 5 [0x413000b][0xaf44b],[TX]

[119000-0003-000658C4] 2

从METALINK上得到WFG的格式如下:

不过之前版本的确实是这个格式,虽然METALINK上说这个格式从8-11版本都适合的,但是搞不清除倒数第二列的数字是啥意思,那么我们这里需要用到的是4、5和最后一列,这4、5列定义了一个事务唯一的XID,最后一列表示这个事务是发生在哪个节点上的,其中这个是从0开始的,所以0表示第一个节点,2表示第三个节点。

从上面我们可以得到两串数字:

[0x8002b][0x2bc9d9]

[0x413000b][0xaf44b]

这两个就是两个事务的XID,那么根据根据TRACE产生的时间点,我们可以得到这个死锁发生的时候的日志是记录在哪个SEQUENCE的日志中,如果日志已经归档,则需要LOGMINER相应的归档日志,如果还没有归档,则需要LOGMINER当前日志,另外注意,因为死锁发生在1和3两个节点上,所以需要把两个节点上对应的日志同时LOGMINER。然后使用下面的SQL进行查询:

SELECT *

FROM V$LOGMNR_CONTENTS

WHERE (XIDUSN = TO_NUMBER(SUBSTR('040d002e', 1, 4), 'XXXX')

AND

XIDSLT = TO_NUMBER(SUBSTR('040d002e', 5, 8), 'XXXX') AND

XIDSQN = TO_NUMBER('9d0d8', 'XXXXXXXX'))

OR (XIDUSN = TO_NUMBER(SUBSTR('0008002b', 1, 4), 'XXXX') AND

XIDSLT = TO_NUMBER(SUBSTR('0008002b', 5, 8), 'XXXX') AND

XIDSQN = TO_NUMBER('2bc9d9', 'XXXXXXXX'))

ORDER BY 1, RS_ID, SSN;

得到的就是事务发生时执行的所有SQL,从而可以很容易的定位到程序中相应的模块。

其中SIDUSN和XIDSLT是由XID的前半部分转换而来的,不足8位的左边补0够8位;XIDSQN是由XID的后半部分转换得到的,这部分也是8位左补0的,因为这块是否补0对结果没有影响,所以这里简单期间不补0。

根据ORACLE

DOCUMENT,V$LOGMNR_CONTENTS中的每个记录是按照RS_ID和SSN组合来标识唯一的,翻了半天也没有找到哪个字段表示SQL执行的顺序,经过简单测试和猜测,如果是同一个节点的,则可以认为RS_ID和SSN排序就是SQL执行的顺序,如果是跨节点的,因为有不同的THREAD来写REDO

LOG,所以排序的时候需要加上第一列,也就是SCN列。

根据以上的分析和猜测,最终定位到了死锁发生的原因。那么解决很简单,所以涉及到交叉锁等待的地方,都对更新条件进行排序,使得所有的更新都按照相同的顺序来进行,从而避免交叉,也就避免了交叉等待的死锁。

update:

RAC环境下死锁发生的时候,在系统的BDUMP目录下的DIAG进程的TRACE文件中也会有相关的记录的。首先ps

-ef|grep

diag找到当前实例的DIAG进程的操作系统进程号,然后根据_diag_.trc来找到对应的TRACE文件,然后翻到死锁发生的时间点,开始搜索rowid,将会得到死锁发生时等待的记录的OBJECT_ID和ROWID,其中OBJECT_ID是16进制,转换成10进制后到DBA_OBJECT视图中根据OBJECT_ID进行查询,可以得到锁是加在哪个对象上的,然后根据ROWID就可以直接定位到死锁发生时的锁到底加在哪行记录上的,然后根据数据的业务特点来进行程序代码上的分析,将会更容易些(比如我时绑定变量的SQL,同样的SQL可能对应几十种类型的交易,那如果知道锁具体在哪条记录上,就可以知道交易的类型,在业务上和程序代码上就更容易定位了)。

另外补充一点,RAC环境下的死锁检测机制为什么这么慢呢?

因为RAC环境下是需要所有节点的进行互相通讯和判断才能完成死锁的检测,而这个任务是交给LMD进程来完成的,而系统默认情况下,这个进程60秒才出来干活一次,所以死锁的检测和解开至少要60秒以上了,这个也从理论上支持了之前的实验。

这个缺省值是通过_lm_dd_interval,一个隐含参数来控制的,可以调整这个值的大小来调整LMD干活的频率,但是经过测试,调整为120的时候,确实检测到死锁需要120秒;调整为10,则需要将近20秒;调整为1,则还是需要70多秒。可见ORACLE设置了这个值为60肯定是有道理的,如果设置的过小肯定也起不了多大的作用的(否则ORACLE为啥要让这个检测这么慢从而影响系统运营呢,那肯定有苦衷的),并且这个参数是隐含的,那最好还是不要随便修改,带来的后果可能是LMD进程通讯太频繁导致占用过多CPU,也可能LMD调度频率跟不上而出现系统不稳定等等。

生产系统,解决死锁才是王道,修改隐含参数是歪门邪道,要禁止。

死锁oracle rac,利用LOGMINER进行RAC环境下的死锁分析——转载相关推荐

  1. 丁丽萍:云计算环境下的隐蔽信道分析

    本文讲的是丁丽萍:云计算环境下的隐蔽信道分析,以"互联网安全新思维"为主题的OWASP2011亚洲峰会在11月8日-9日成功举办.本届大会以"网络安全产品测评" ...

  2. GIS空间分析(三)—— GIS环境下的空间分析

    GIS环境下的空间分析 A.GIS的发展特征 传统GIS与当代GIS的特征比较   数据 计算 服务 传统GIS 相对静止的量测数据为主体 组件式的功能计算 根据应用需求的软件发开 当代GIS 动态异 ...

  3. 【转载】linux环境下tcpdump源代码分析

    linux环境下tcpdump源代码分析 原文时间 2013-10-11 13:13:02  CSDN博客 原文链接  http://blog.csdn.net/han_dawei/article/d ...

  4. aix oracle集群日志,在AIX环境下实施Oracle 集群RAC的结构 文平

    <oracle大型数据库系统在AIX/unix上的实战详解>集中讨论34:在AIX环境下实施Oracle 集群RAC的结构   文平 看来能用的起IBM p服务器的用户,都能用的起RAC. ...

  5. oracle外键死锁,Oracle技术之和外键相关的阻塞和死锁问题总结(二)

    --========================= 外键引起的死锁: rollback掉上面session 1和session 2中的sql --========================= ...

  6. kali 创建php可执行文件_利用树莓派在kali环境下搭建Web环境(Apache+Php7.3+Mysql)...

    前言 在kali下我们来搭建web系统环境,在平时我们可在win系列的系统上用Phpstudys等集成环境来搭建,快捷 方便.今天来看看如何在kali下搭建环境.此中安装方法也适应Debian系列的系 ...

  7. 【Docker】利用docker在window环境下部署python开发环境

    这里写目录标题 1:打开window的一些设置 2:下载docker desktop 3:更改docker 下载源 4:拉取镜像,docker pull ubuntu 5:启动容器,安装ssh 6:把 ...

  8. 车载环境下的噪声分析

    想要降低汽车噪声,就要了解汽车室内噪声环境, 外部激励:风噪.路噪以及环境噪声等激励噪声 内部激励:悬架系统.变速箱系统.发动机等系统在行车时造成的 振动激励噪声 车腔噪声以非线性形式传导,通常将其传 ...

  9. 基于高通5G IOT平台LTE环境下拨号log分析

    拨号时长分析: 使用AT+COPS?查看是否驻网成功,驻网后使用AT$QCRMCALL=1,1,3进行GobiNet拨号 AT拨号返回成功后,在QXDM中过滤以下两种log: Linux Data/M ...

最新文章

  1. oracle 学习笔记 Flashback drop
  2. python开发web运维工具_【实战小项目】python开发自动化运维工具--批量操作主机...
  3. 软件设计中的具体问题
  4. HDU-1878 欧拉回路 判定是否存在欧拉回路
  5. ubuntu修改mysql的绑定端口
  6. python-packaging 命令行脚本
  7. 华为c语言中static的作用,C语言编程规范(华为、林锐、MISRAC).pdf
  8. ofo 退押金出新招;快手回应“弃拼多多联手阿里”;Julia 1.3 发布 | 极客头条...
  9. SQL Server打开数据表中的XML内容时报错的解决办法
  10. TIGER(泰格)胡东国老师带单有盈利吗?平台正规吗?
  11. 微信小程序(第二章)- 开发工具的下载和安装
  12. 视频编码中CBR和VBR的区别,CRF和CQP的区别
  13. 太阳能光伏自动跟踪追日逐日实训系统QY-PV20
  14. sql server返回是星期几的函数
  15. 最简单的生成ios证书的方法
  16. 【连载】线性代数笔记——第二章矩阵
  17. keep-alive包裹的el-tabs中有两个页面使用echart渲染空白问题
  18. 计算机专业专科可以进的国企,专科学这四个专业!考国企、事业编制会容易很多...
  19. 弘辽科技:拼多多关键词排名有什么用?有什么规则?
  20. Zero-shot knowledge distillation in deep networks

热门文章

  1. [响应式外贸灯具机械英文网站模板] 织梦模板+机械电子汽车外贸网站+自适应手机
  2. deepin系统引导_关于Windows和deepin双系统无法进入到引导界面
  3. 我国科技创新行业将迎来爆发式增长
  4. WordPress 简洁自适应博客杂志类CX-MULTI主题
  5. 生产制造行业中智邦国际ERP的五大应用
  6. IPTV用户今年或过亿 运营商转型+政策双驱动
  7. 组织级PMO的价值定位、组织架构及项目管理全景图
  8. windows C++开发工程师求职攻略
  9. vue3 父组件获取数据传值给子组件,子组件有值,但是不渲染
  10. 团队的秘密 - 笔记