Systemstate Dump分析经典案例(上)

前言

本期我们邀请中亦科技的另外一位Oracle专家老K来给大家分享systemstate dump分析的经典案例。后续我们还会有更多技术专家带来更多诚意分享。

老K作为一个长期在数据中心奋战的数据库工程师,看到小y前期的分享,有种跃跃欲试的感觉,也想把我日常遇到的一些有意思的案例拿出来分享讨论,希望我们都能从中获得些许收获,少走弯路。同时本文涉及到很多基础知识,又涉及看似枯燥的trace分析,但老K还是建议大家耐心看完本文。

精彩预告

  • 如何分析cursor:pin S wait on X?
  • 如何分析library cache lock?
  • 如何分析解读systemstate dump?
  • 如何快速应急处理以及收集信息?

温馨提示

温馨提示:该篇为老K诚意之作,篇幅略长,如微信阅读有所不适,可以移步QQ群:227189100下载文本阅读,并同时关注我们的微信号“中亦安图”与我们交流。

Systemstate Dump我们暂且叫SSD

Part 1

问题来了

一个周末的早上,客户来电,两节点RAC数据库其中一个节点夯死。

现象描述:

>> 节点hang死,SYS和普通用户均无法登陆

>> 受影响范围只在其中一个节点,其他节点能正常对外提供服务

>> hang死节点有大量异常等待事件cursor:pin S wait on X以及少量library cache lock。

Part 2

故障处理及信息收集

老K第一反应是让客户快速收集数据库hanganalyze 和SSD,马上通过杀进程的方式重启问题节点数据库,优先恢复数据库服务。

最终,客户在收集完信息发给老K后,重启了问题节点数据库,一切又恢复了正常。

Part 3

知识点扫盲

cursor:pin S wait on X

什么时候会产生这个等待事件?

当一个会话以X模式持有某个cursor(如sql/procedure/function/package body等)的mutex时,如果另一个会话需要以S模式请求该cursor的mutex;一般来说,对cursor进行硬解析时,会以X模式持有cursor的mutex,而对cursor进行软解析时,则会以S模式持有cursor的mutex;

举一个简单的例子,一个会话(SESSION_A)正在解析(硬解析)某一个sql语句(SQL_A),当另一个会话(SESSION_B)同时执行这条sql语句(SQL_A)时(执行前需要对该语句进行软解析),SESSION_B就会等待cursor:pin S wait on X 事件。

如何定位其等待的对象?

该等待事件的P1参数idn,实际上就是sql语句的hash_value,也就是说通过该等待事件的P1参数即可定位等待的实际对象。

如何查找该事件的源头?

在定位了该等待事件所等待的对象后,该对象MUTEX的持有者即为该等待事件的源头。

在trace文件中,可以通过oper EXCL关键字查找到持有者。

library cache lock

什么时候会产生这个等待事件?

当一个会话对library cache中的对象(主要是TABLE /INDEX/CLUSTER/PROCEDURE等)进行修改(通常是指DDL操作)时,会以X模式持有该对象的library cache lock;当一个会话在解析sql需要用到某个对象时,会以S模式请求该对象的library cache lock;

举一个简单的例子,一个会话(SESSION_A)正在对表TAB_A进行DDL操作,另一会话(SESSION_B)开始执行与TAB_A相关的sql语句,那么此时SESSION_B此时会等待library cache lock事件。

如何定位其等待的对象?

该等待事件的P1为handle address即为等待对象在library cache 中的句柄地址,可唯一标示该内存对象。

如何产生该事件的源头?

在定位了该等待事件所等待的对象后,持有该对象的X模式library cache lock的会话即为等待事件的源头。

在trace文件中,可以通过对象的地址关键字和mode=X关键字查找到该等待事件的源头。

那么数据库异常时间内到底发生了什么,我们通过trace入手,还原现场。

Part 4

故障分析

环境介绍:

操作系统 AIX 5.3

数据库 ORACLE 10.2.0.5 两节点RAC

4.1 第一次头脑风暴

现有“情报”

>> RAC系统一个节点夯

>> 数据库中存在大量cursor:pin S wait on X 等待事件和少量library cache lock等待事件

>> 有收集的hanganalyze 信息和SSD  trace文件

这两个等待事件的原理是什么?

出现上述等待事件后系统的表现是什么?

当一个系统出现大量cursor:pin S wait on X 等待事件时,通常原因是由于一个会话的sql硬解析异常,阻塞了这条SQL的软解析,这种情况下,可能的源头就只有一个,只要把源头找到,问题就迎刃而解了。

4.2 入手分析

4.2.1

SSD入手分析

常规处理方法:对于cursor:pin S wait on X等待事件,只需关注其等待对象,是同一个对象还是多个不同对象,如果都是等待在一个对象上,情况相对简单,要找到这个等待的对象,那就需要到SSD的trace中查找关键字’waiting for ‘cursor:pin S wait on X’,结果见下图:

出乎老K的意料,这些等待” cursor:pin S wait on X”的会话并不都在同一个idn上,而是分布在几个不同的idn上。

看起来问题比老K开始想象的要复杂,但是没有关系,以老K处理各种问题的经验来看,复杂问题只不过是多个简单问题的集合而已,需要的只是多一点耐心。

接下来,老K做的就是找到这些cursor对象mutex的持有者,以82d61778为例,选取其中一个正在等待这个对象的会话(sid:598)来分析,见下图

这里需要解释一下

idn 82d61778:表明cursor对象

oper GET_SHRD:表明该会话正在以shared模式请求该mutex

(858, 0):表明该mutex的持有者sid为858

找到了持有者,我们接着来看看sid为858的会话(858会话)在做什么:

上图可以看出858会话也在等待”cursor:pin S wait on X”,而且从等待历史看,858会话的等待也持续了非常长的时间了;同样的方法,我们再来看看858会话请求的mutex又被谁持有了:

我们看到了会话859持有了bbcee4f7的mutex,然后它又在等待”library cache lock”事件。

问题查到这,我们停下来想一想。

4.3.2

第二次头脑风暴

>> 会话598在等待cursor:pin S wait on X,阻塞者sid为 858

>> 会话858在等待cursor:pin S wait on X事件,阻塞者sid为859

>> 会话859在等待library cache lock事件,阻塞者待查

>> library cache lock的阻塞者是谁,很有可能是一个“元凶之一”

>>是不是大量的cursor:pin S wait on X都被library cache lock阻塞,如果是的话问题就变得简单了

如果看到这里你还晕晕的,那么老K建议读者不妨拿出笔画个图,我们就暂且称之为等待链图吧:

4.3.3

继续分析SSD

这里我们暂且先不查“首要嫌疑人”,而是继续梳理等待事件关系,同上分析方法,我们找到trace中各IDN对象的持有者信息,如下:

我们看到,859/858/815等会话目前持有mutex,并且阻塞了其他会话以shared模式获取其持有的mutex;其中859会话为我们刚刚找的等待链的源头,858会话为我们刚刚找到的等待链的中间部分,作为一个mutex的持有者,同时又在等待另一个mutex,那我们再来看看其他会话都在等什么:

老K这里就不把上述所有会话的信息都列出来了,经过确认,各会话的均是在等待”cursor:pin S wait on X”等待事件,这时,我们再来更新一下我们的等待链图:

分析到了这里是不是已经柳暗花明了?前面理不清的大量cursor:pin S wait on X已经理清楚,所有的矛头走指向了sid 859

离真相只差一步了,我们只需要分析library cache lock的源头就能解释整个谜团了,前面老K已经提到了分析library cache lock等待事件的方法了,

下一步只要结合trace文件定位library cache lock的阻塞关系,就能很快定位原因了。

由于篇幅有限,本期分享到这里先告一段落,下期分享继续,看老K如何一步一步由浅入深,分析问题,看看高大上的SSD分析是什么样的。敬请关注下期(未完待续...)

时间: 2024-10-08 09:40:20

Systemstate Dump分析经典案例(上)的相关文章

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

Hadoop经典案例Spark实现(七)——日志分析:分析非结构化文件

相关文章推荐 Hadoop经典案例Spark实现(一)--通过采集的气象数据分析每年的最高温度 Hadoop经典案例Spark实现(二)--数据去重问题 Hadoop经典案例Spark实现(三)--数据排序 Hadoop经典案例Spark实现(四)--平均成绩 Hadoop经典案例Spark实现(五)--求最大最小值问题 Hadoop经典案例Spark实现(六)--求最大的K个值并排序 Hadoop经典案例Spark实现(七)--日志分析:分析非结构化文件 1.需求:根据tomcat日志计算ur

多线程十大经典案例之一 双线程读写队列数据

本文配套程序下载地址为:http://download.csdn.net/detail/morewindows/5136035 转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/8646902 欢迎关注微博:http://weibo.com/MoreWindows 在<秒杀多线程系列>的前十五篇中介绍多线程的相关概念,多线程同步互斥问题<秒杀多线程第四篇一个经典的多线程同步问题>及解决多线程同步互斥的常用方法

秒杀多线程第十六篇 多线程十大经典案例之一 双线程读写队列数据

版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 本文配套程序下载地址为:http://download.csdn.net/detail/morewindows/5136035 转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/8646902 欢迎关注微博:http://weibo.com/MoreWindows 在<秒杀多线程系列>的前十五篇中介绍多线程的相关概念,多线程同步互斥问题<秒杀多

oracle systemstate dump介绍

当数据库出现严重的性能问题或者hang了的时候,服务器端sqlplus也无法连接时,此时如果想获取数据库当前的状态信息,以便事后诊断,那么我们非常需要通过systemstate dump来知道进程在做什么,在等待什么,谁是资源的持有者,谁阻塞了别人.在出现上述问题时,及时收集systemstate dump非常有助于问题原因的分析.ORACLE 10g 开始,sqlplus提供了这么一个功能参数-prelim,在sqlplus无法连接的情况下,连接登录到数据库.下面关于这些知识点的一个总结 Th

网络机器人的识别与攻防的经典案例

本文我们介绍一个网络机器人的识别与攻防的经典案例.使用到的代码见本人的superword项目: https://github.com/ysc/superword/blob/master/src/main/java/org/apdplat/superword/tools/ProxyIp.java 我们的目的是要使用机器人自动获取站点http://ip.qiaodm.com/ 和站点http://proxy.goubanjia.com/ 的免费高速HTTP代理IP和端口号. 不过他们未对机器人进行识

性能分析之-- JAVA Thread Dump 分析综述

性能分析之-- JAVA Thread Dump 分析综述 一.Thread Dump介绍 1.1什么是Thread Dump? Thread Dump是非常有用的诊断Java应用问题的工具.每一个Java虚拟机都有及时生成所有线程在某一点状态的thread-dump的能力,虽然各个 Java虚拟机打印的thread dump略有不同,但是大多都提供了当前活动线程的快照,及JVM中所有Java线程的堆栈跟踪信息,堆栈信息一般包含完整的类名及所执行的方法,如果可能的话还有源代码的行数. 1.2 T

(Mirage系列之七)Mirage经典案例之管理和发布应用层

在(Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析中我们介绍过,Mirage从逻辑上把终端桌面分层了三层:系统层(包括驱动和基础层),应用层,以及用户数据层.在(Mirage系列之五)Mirage经典案例之桌面驱动和基础层管理中我们讲到Mirage可以灵活方便的管理终端的驱动并且发布基础层.本文将介绍Mirage如何管理终端的应用层. 一个公司往往有很多部门,各部门所需要的工作软件也不尽相同.Mirage通过分层这个核心技术,将应用层剥离出来,使得管

多线程面试题系列(16):多线程十大经典案例之一 双线程读写队列数据

前十五篇中介绍多线程的相关概念,多线程同步互斥问题(第四篇)及解决多线程同步互斥的常用方法--关键段.事件.互斥量.信号量.读写锁.为了让大家更加熟练运用多线程,将会有十篇文章来讲解十个多线程使用案例,相信看完这十篇后会让你能更加游刃有余的使用多线程. 首先来看第一篇--第十六篇 多线程十大经典案例之一 双线程读写队列数据 <多线程十大经典案例之一双线程读写队列数据>案例描述: MFC对话框中一个按钮的响应函数实现两个功能:显示数据同时处理数据,因此开两个线程,一个线程显示数据(开了一个定时器