我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Systemstate Dump分析经典案例(下)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Systemstate Dump分析经典案例(下)

前言


接上一期:(上一期的阅读方法:关注“中亦安图”公众号后回复‘007’)


4.3.4

SSD中library cache lock的分析


接上一期:

分析到这步,前边看似毫无头绪的问题似乎理清了,大量cursor:pin S wait on X已经理清楚,所有的矛头走指向了sid 859


离真相只差一步了,我们只需要分析library cache lock的源头就能解释整个谜团了,前面老K已经提到了分析library cache lock等待事件的方法了,现在我们就来结合trace文件看看如何定位library cache lock的阻塞关系。


那好,我们就来看sid 859:


Systemstate Dump分析经典案例(下)

这个会话信息中我们能看到:

>> 会话在等待library cache lock等待事件,等待时间4429秒

>> 会话以S模式请求句柄为700000209bb9d80的library cache对象(request=S)

>> 句柄为700000209bb9d80的library cache对象是SYS.C_OBJ#_INTCOL#,是一个cluster(簇聚)对象。


我们就看到,会话859正在以S模式请求700000209bb9d80上的library cache lock而产生了等待,那么我们就可以确认系统中一定有另一个会话以X模式持有了700000209bb9d80上的library cache lock;同样,我们在trace文件中搜索关键字”700000209bb9d80”再过滤后能看到下面的条目:

Systemstate Dump分析经典案例(下)


我们定位到该条信息后,再确认该条信息所属的会话,确认其会话信息如下:


Systemstate Dump分析经典案例(下)


看到这里,大家有没有柳暗花明的感觉呢,我们看到持有700000209bb9d80上library cache lock的会话是624,而会话624正在等待”cursor:pin S wait on X”事件,等待的对象正是bbcee4f7;现在我们再来完善上面的等待链图:

Systemstate Dump分析经典案例(下)


到最后,我们发现在会话859和会话624之间,形成了死锁,具体的情况就是:

>> 会话859持有bbcee4f7上的mutex,请求700000209bb9d80上的library cache lock

>> 会话624持有700000209bb9d80上的library cache lock,请求bbcee4f7上的mutex

>> 其他会话产生大量的cursor:pin S wait on X等待事件,都是由于859长时间持有bbcee4f7上的mutex未释放导致的


到了这一步,是不是一切谜团都解开了?我们的分析是不是就完成了呢?

答案是:NO


Part 5

根因分析

5.1 第三次头脑风暴


经常做根因分析的老K此时还有疑惑:

>> 如果当时不重启,而kill掉死锁链上的会话,问题是否会解决?

>> 会话859和会话624都在做什么,为什么会死锁?

>> 单个会话持有一个cursor的mutex,怎么会让系统处于夯住的状态?


5.2 柳暗花明之会话859


现在老K重点关注的就是如何解开上面的两个疑惑了,继续分析trace。

先看会话859,截取trace文件中的信息,如下:

Systemstate Dump分析经典案例(下)

从标黄处的信息我们知道,这是一个数据库的后台进程;我们可以通过查看trace中这个会话所属的进程信息如下:

Systemstate Dump分析经典案例(下)

先回答第二个问题:会话859在做什么?

后台进程是CJQ0,这个进程是ORACLE用来调度job的;我们知道,如果某个会话以S模式请求某个对象上的library cache lock,这个会话通常是在解析某个语句或者编译某个package时需要从library cache中查找该语句涉及对象的信息;在PROCESS 24的trace文件中查找“oper EXCL”关键字,我们查到以下三条记录


在PROCESS 24的trace文件中查找“oper EXCL”关键字,我们查到以下三条记录: 

Mutex 7000001e7d04898(859, 0) idn bbcee4f7 oper EXCL

Mutex 7000001e5fbe4e0(859, 0) idn fb52493f oper EXCL

Mutex 7000001e8faa990(859, 0) idn a8bbc174 oper EXCL


可能有人会问?一个会话怎么同时有三个cursor?

大家不要忘了ORACLE数据库中有递归调用的说法,也就是说前端发起一条简单的sql,ORACLE后台实际上产生了一系列的递归调用,那些调用实际上也是一些sql的集合。通过idn值继续查找,提炼一下,当前正在解析的三条sql语句分别是:

Systemstate Dump分析经典案例(下)

这里说明一下:其实,SSD中对sql的递归调用关系是不体现的,不过从上面的三条sql语句老K还是能推断出其调用关系的;


CJQ0进程是用来调度oracle job的,从三条语句能大致的看到:a8bbc174是用来查询系统中job相关信息的sql, fb52493f是通过对象号用来查询某个对象的信息的sql,而bbcee4f7则是用来查询直方图信息的sql。


a8bbc174调用fb52493f,fb52493f调用bbcee4f7,如果这是bbcee4f7出问题,另外两个肯定无法正常执行。这里正是因为bbcee4f7无法完成解析,而导致其上层的fb52493f和a8bbc174阻塞;


新的疑点:三条SQL和C_OBJ#_INTCOL#有什么内在联系?


会话正在请求C_OBJ#_INTCOL#上的library cache lock而产生等待,而从这三条sql的文本来看,似乎都跟C_OBJ#_INTCOL#这个对象扯不上关系,这又怎么解释呢?有细心的读者可能已经注意到了,前面老K特意指出了C_OBJ#_INTCOL#是一个cluster(簇聚)对象,cluster对象不是表,而是用来存储多个表的共同列的,那这里我们就可以注意最底层调用的sql中的histgrm$对象是否与C_OBJ#_INTCOL#有关,我们来看看histgm$的定义:

Systemstate Dump分析经典案例(下)

又解开了一个谜题,histgrm$确实使用了C_OBJ#_INTCOL#这个cluster对象,所以在解析使用了histgrm$表的sql语句时,需要获取C_OBJ#_INTCOL#上的library cache lock。


5.3 柳暗花明之会话624


接下来,再来看看会话624,像分析会话859一样,把单个进程的trace摘出来,我们来截取部分信息如下:

Systemstate Dump分析经典案例(下)

从这里看,这是一个被调起的job进程,PROCESS号为42;

Systemstate Dump分析经典案例(下)

这不是一个数据库的后台进程,所以,相比于之前看到的859进程,我们能看到更多的信息,我们大致知道,这个进程是数据库调起的收集统计信息的job任务,在等待”cursor:pin S wait on X”事件,等待的解析对象是bbcee4f7;

因为它以X模式持有C_OBJ#_INTCOL#这个对象的library cache lock而阻塞了关键的会话859,那么我们来看看它为什么会持有这个library cache lock;我们到PROCESS 42的进程信息中搜索oper EXCL的关键字,搜索到两条相关信息如下:

Systemstate Dump分析经典案例(下)

同样,我们也能从sql语句的语义上猜到两者的递归调用关系;

Systemstate Dump分析经典案例(下)

Systemstate Dump分析经典案例(下)

会话624持有了C_OBJ#_INTCOL#和I_OBJ#_INTCOL#的library cache lock,其中I_OBJ#_INTCOL#是CLUSTER的索引。现在所有疑团都解开了。可以放松一下,从头捋顺思路了。


Part 6

情景再现


终于看到了全景,看看数据库故障时刻在做什么。


Systemstate Dump分析经典案例(下)

在本场景中,t1时刻,数据库自动收集统计信息任务调度J000进程收集整个数据库统计信息,在收集cluster对象时,数据库只能使用analyze的方式分析;


t2时刻,因为C_OBJ#_INTCOL#对象的统计信息被更新,因为histgrm$与C_OBJ#_INTCOL#的关联关系,与histgrm$相关的sql(包括bbcee4f7)也就需要重新解析;


t3时刻,J000先收集C_OBJ#_INTCOL#统计信息,接着继续使用analyze的方式收集其索引I_OBJ#_INTCOL#的统计信息;


t4时刻,这时CJQ0进程定时查询系统JOB时,需要硬解析,递归调用bbcee4f7时对其进行解析;

解析的过程中需要以S模式请求持有histgrm$及其相关对象(也就包括C_OBJ#_INTCOL#及其索引I_OBJ#_INTCOL#)的library cache lock;


t4时刻,J000进程正在analyze索引I_OBJ#_INTCOL#,也就以X模式持有了I_OBJ#_INTCOL#上的library cache lock;


在J000使用analyze的过程中,同样需要执行相关递归sql,需要进行硬解析,也就调用了上面说到的关键sql bbcee4f7;

所以最后造成了死锁。


Part 7

问题定位


其实在上述分析的过程中,我们基本可以判断为bug,(MOS):1628214.1 Database Appears to Hang with Deadlock Involving SYS.C_COBJ# or C_OBJ#_INTCOL# While Statistics Maintenance Job is Running


Part 8

写在最后


到上面为止,我们已经定位bug,也获得了事中和事后的解决方案,不过老K更关注的是大家是否能从这个CASE中获得一些收获,这里不妨问问自己:

>> Systemstatedump中的cursor:pin S wait on X 我会查了吗?

>> Systemstatedump中的library cache lock 我会查了吗?

>> 如果我要模拟让我的数据库夯我会做吗?

>> 还有一个没有回答的问题?如果下次再遇到同样的问题,我能通过杀掉死锁链条里的进程解决这个问题么?


如果你的答案都是肯定的,那么老K觉得这篇分享很有价值。

如果以上问题你还有疑问,可以通过微信或者QQ共同交流讨论


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Systemstate Dump分析经典案例(下)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Go语言中for循环的经典案例分析

for循环问题,在面试中经常都会被问到,并且在实际业务项目中也经常用到for循环,要是没用好,一不下心就掉坑。本文为大家挑选了几个经典的案例,一块来探讨下,看看如何避免掉坑,多积累积累采坑经验
2023-02-09

慢SQL治理的经典案例分享

菜鸟供应链金融慢sql治理已经有一段时间,自己负责的应用持续很长时间没有慢sql告警,现阶段在推进组内其他成员治理应用慢sql。这里把治理过程中的一些实践拿出来分享下。
sql分页查询2024-12-02

经典系统架构设计案例分析:票务系统深度解析

持有该预订的服务器向所有持有该场次等待用户的服务器发送消息,以便这些服务器可以使所有需要的座位数多于可用座位数的等待用户过期。

Android Zxing生成二维码经典案例分享

本文实例为大家解析了Zxing生成二维码的经典案例,供大家参考,具体内容如下 1、首先呢,先编译 compile ‘com.google.zxing:core:3.2.1' 2、实战public class QRCode { private
2022-06-06

C语言经典顺序表实例分析

这篇“C语言经典顺序表实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言经典顺序表实例分析”文章吧。1、移除元素题
2023-06-30

Python 中15个递归函数经典案例解析

在本文中,我们将探索15个递归函数的经典案例,从基础到进阶,帮助你理解和掌握递归编程。

AWK的10个经典案例分别是怎么样的

本篇文章给大家分享的是有关AWK的10个经典案例分别是怎么样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。awk是Linux系统下一个处理文本的编程语言工具,能用简短的程序处
2023-06-05

Python经典案例之图像漫水填充分割详解

图像分割是将图像分成若干具有独特性质的区域并提取感兴趣目标的技术和过程,这篇文章将详细讲解漫水填充分割应用,感兴趣的小伙伴可以了解一下
2023-01-28

Python实现四个经典小游戏的示例分析

本篇文章给大家分享的是有关Python实现四个经典小游戏的示例分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 一、效果展示1、俄罗斯方块这个应该是玩起来最最简单的了…2、扫
2023-06-22

Python中文分词工具之结巴分词用法实例总结【经典案例】

本文实例讲述了Python中文分词工具之结巴分词用法。分享给大家供大家参考,具体如下: 结巴分词工具的安装及基本用法,前面的文章《Python结巴中文分词工具使用过程中遇到的问题及解决方法》中已经有所描述。这里要说的内容与实际应用更贴近——
2022-06-04

Pytorch深度学习经典卷积神经网络resnet模块实例分析

这篇文章主要介绍“Pytorch深度学习经典卷积神经网络resnet模块实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Pytorch深度学习经典卷积神经网络resnet模块实例分析”文章能帮
2023-06-30

C/C++经典算法之约瑟夫问题的示例分析

这篇文章给大家分享的是有关C/C++经典算法之约瑟夫问题的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是约瑟夫问题? 约瑟夫问题:n个人围成一圈,初始编号从1~n排列,从约定编号为x的人开始报数,数
2023-06-20

2022年系统分析师下午案例分析真题及答案解析

  参加2022年系统分析师考试的考生都很关注真题答案,编程学习网小编将在考后为大家整理2022年系统分析师下午案例分析真题及答案解析,敬请关注!  系统分析师案例分析科目在下午考试,编程学习网小编在考后为大家整理了2022年系统分析师下午案例分析真题及答案解析,编程学习网软考学院老师也将在考后进行真题答案解析,想知道答案和解析的
2022年系统分析师下午案例分析真题及答案解析
2024-04-19

编程热搜

目录