墨墨导读:在上个月的数据技术嘉年华里,我做了名为《另辟蹊径:从其他角度去解决数据库问题》的案例分享,讲述了通过时间规律来解决系统故障的思路。结果,这两天又出了类似的案例。和大家分享一下解决这个新问题的过程。

作者简介

罗海雄:Oracle ACE-A,ITPUB论坛数据库管理版版主,2012 ITPUB全国SQL大赛冠军得主;资深的架构师和性能优化专家,对 SQL 优化和理解尤其深入;作为业内知名的技术传播者之一,经常出席各类技术分享活动;从开发到性能管理,有着超过10年的企业级系统设计和优化经验;曾服务于甲骨文公司,组织和主讲过多次《甲骨文技术开发人员日》和《Oracle圆桌会议》,在任职甲骨文公司之前,还曾经服务于大型制造企业中芯国际,具备丰富的制造行业系统架构经验。

故障背景

某客户的7*24的系统,在12/25 01:45, 突然发生卡顿。

(通常情况下,分享案例不会给出特精确的时间,这次不同,精确时间正是解决问题的关键)

初探虎穴:原因分析

首先,检查数据库的ASH裸数据,看看那一段时间的活动回话情况

select trunc(sample_time,'mi'),count(*) from v$active_session_history where to_char(sample_time,'yyyymmdd-hh24mi') like '20201225-01%' ;

果然,1:45有很高的活动回话。检查具体的等待事件

select sample_time,event,count(*) from v$active_session_history where to_char(sample_time,'yyyymmdd-hh24mi') between '20201225-0144' and '20201225-0146' group by sample_time,event order by sample_time,count(*)

可以看到,01:44:58处,有大量的cursor: pins S wait on X等待。而接下来,则是大量的library cache lock 和 library cache:mutex X.这三个等待事件,多数情况都是发生在硬解析上。

继续检查,发现这些event 其实都是同一个SQL导致的。SQL很简单,单表查询。

同时检查该SQL的执行次数,发现非常高。

而且,可以看到,在12/25凌晨1点,总执行次数有个重置的过程,显然,这个SQL在1:44:58 之前被invalidate了,随后发生了硬解析,而且解析并发很高,所以导致了大量的cursor: pins S wait on X、library cache lock 和 library cache:mutex X.

扑朔迷离:为什么被挤出去?

至此,故障的直接原因已经找出来了,就是某个并发非常高的SQL, 在1:44:58前被invalidate,后续的高并发解析导致了大量的cursor: pins S wait on X、library cache lock 和 library cache:mutex X.

但是,为什么这个SQL跑的好好的,会被挤出去呢?

一个SQL被挤出去的原因,主要有几个:

  • 发生DDL

  • 统计信息改变

  • 手动purge shared pool

  • 内存不够

逐个去分析。

发生DDL

select last_ddl_time from dba_objects where object_name = '&tname';

发现是几个月前的last_ddl_time

统计信息改变

select last_analyzed from dba_tables where table_name = '&tname';select last_analyzed from dba_indexes where table_name = '&tname';

同样是几个月前

手动purge

通过alter system flush shared_pool 或者 dbms_shared_pool.purge可以把SQL手动挤出shared pool.
但是,大半夜的,而且和客户也确认过,没有做过类似操作。

shared pool内存不够

本身该SQL执行次数这么高,肯定排在LRU的前端,不大可能因为内存不足被挤出去。

至此,似乎陷入僵局。

独辟蹊径:挖掘时间规律

这时候,现场工程师说了一句,几个月前(7/22),发生过一次类似的故障,也是同样的SQL,时间也差不多就是 半夜1:40-1:50之间。

这句话提醒了我,会不会存在某个特殊的时间规律,导致该SQL会周期性的被挤出去呢?

虽然挤出去了,但是,有时候,并不会挤得特别干净,于是,尝试去检查一下 V$SQL里面有没有之前的信息。

select sql_plan_baseline,first_load_time, last_load_time,inst_id,plan_hash_value from gv$sql order last_load_time


其中,last_load_time代表SQL解析的时间。一眼看去,大量的44分的时间点,存在时间规律应该是没有疑问了。

但是,总共有不同的几个时间。

最多的是 01:44(或者45),有5条记录

13:44, 有3条记录

另外分别有1条 09:28和 01:49。

考虑到这里面记录的是解析时间而不是挤出去的时间,对于最后两条记录,可以有解释。

10/01 的 09:28这个,检查了一下数据库启动时间:

select to_char(startup_time,'yyyymmdd-hh24miss') from gv$instance;

数据库正好是在10/1上午9点多点启动的,所以应用连进来之后初次解析,没问题。

01:49, 可以认为是稍微延迟了几分钟重新解析,也可以认为没什么问题。

13:44 呢,习惯用24小时制可能不是第一眼看出来,但是13:44 不就是 中午 1:44吗?所以,规律也是很清晰的。

所以,时间规律变成:某天的 凌晨 01:44 或者 中午 01:44, 该SQL可能会被挤出去。

会是12小时的规律吗?如果是12小时,这些时间隔得似乎有些远。

我们逐条数据观察,从最近的开始。

最近一次,12/25 01:44
往前一次,12/18 13:44 间隔 6.5天
再往前一次,12/05 13:44, 和上一次间隔 13天
再往前一次,11/16 01:44, 和上一次间隔 19.5天
。。。

暂停一下,13天岂不是就是2个6.5天,19.5天岂不是就是 3个6.5天, 写个SQL验证一下

select sql_plan_baseline,first_load_time, last_load_time,(to_date(last_load_time,'yyyy-mm-dd/hh24:mi:ss') - lag(to_date(last_load_time,'yyyy-mm-dd/hh24:mi:ss'))    over (order by last_load_time)) pattern, inst_id,plan_hash_value from gv$sql order last_load_time

果然,另外几个分别是13 和 32.5, 也都是6.5天的倍数。(0.2天那个是10/1上午9点多重启导致)

也就是说,规律是:这个SQL, 每隔6.5天,就可能被挤出去!!!

于是,开始检查数据库的job, 操作系统的job, 应用的job。
但是,一无所获。

那么会不会是个数据库参数控制呢?
看看有没有哪个数据库隐含参数,值是 6.5天,或者 156小时,或者9360分钟,或者 561600秒,或者 561600000毫秒的。

select indx ,KSPPSTVL from x$ksppcv where KSPPSTVL in ('6.5','156','9360' ) or KSPPSTVL like '561600%' ;

同样一无所获。

峰回路转: 找到根因

这时候,我们注意到,这个SQL用了SQL Plan Baseline, 会不会和这个有关系?

检查一下这个SQL对应的SQL Plan Baseline的创建时间,以及这个时间是不是也存在与出现问题的时间是不是也存在6.5的规律。


SQL Plan Baseline2018年7/5 13:44创建的, 距离12/25 01:44正好是139个6.5天。看来,SQL Plan Baseline应该就是元凶了。

以6.5和SQL Plan Baseline 搜索support.oracle.com, 果然发现如下bug:

执行次数特高的SQL, 如果存在SQL Plan baseline, 就可能每 6.5天就被invalidate。

A frequently executing cursor that was built using a SQL plan baseline
is invalidated at every 6.5 days . If this cursor is heavily executed by a large number of concurrent users
then spikes of "cursor: pin S wait X" / "library cache: mutex X"
occur upon its invalidation every 6.5 days.Rediscovery Notes:  This may be suspected if all of the following apply:- The cursor has a plan baseline- The SQL is heavily concurrenly used- Spikes of "cursor: pin S wait X" / "library cache: mutex X" are seen on the cursor   at widely spaced intervals (approximately every 6.5 days)WorkaroundDisable SQL plan baseline used by the heavily executed cursor .

至此,真相大白。

结语

对于重复发生的故障,准确的识别其中的时间规律,找到准确的周期,可以有效帮助寻找问题的根因。

墨天轮原文链接:https://www.modb.pro/db/43139(复制到浏览器中打开或者点击“阅读原文”立即查看)

推荐阅读:267页!2020年度数据库技术年刊

推荐下载:2020数据技术嘉年华PPT下载

2020数据技术嘉年华近50个PPT下载、视频回放已上传墨天轮平台,可在“数据和云”公众号回复关键词“2020DTC”获得!

视频号,新的分享时代,关注我们,看看有什么新发现?

数据和云

ID:OraNews

如有收获,请划至底部,点击“在看”,谢谢!

点击下图查看更多 ↓

云和恩墨大讲堂 | 一个分享交流的地方

长按,识别二维码,加入万人交流社群

请备注:云和恩墨大讲堂

  点个“在看”

你的喜欢会被看到❤

另辟蹊径第二弹,时间规律里的秘密相关推荐

  1. 浅谈Hybrid技术的设计与实现第二弹

    前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹--落地篇 接上文:浅谈Hybrid技术的设计与实现(阅读本文前,建议阅读这个先) ...

  2. 每日三道前端面试题--vue 第二弹

    每日三道前端面试题--vue 第二弹 简述框架和函数库的区别? 1. 库(Library) , 代表 : jquery 2. 框架 (Framework), 代表:vue 3. 主要区别 : 控制反转 ...

  3. 【转载】byvoid阿里第二弹:不是技术牛人,如何拿到国内IT巨头的Offer

    [转载]byvoid阿里第二弹:不是技术牛人,如何拿到国内IT巨头的Offer 不久前,byvoid面阿里星计划的面试结果截图泄漏,引起无数IT屌丝的羡慕敬仰.看看这些牛人,NOI金牌,开源社区名人, ...

  4. 【第二弹】经典移植至IOS端、经典合集

    上传的都是中文版,且都是免费,亲测,如有版本变化收费,请卸载,在通知下我,后续更新在补充新版本.总之请大家放心下载体验哈! (一般不会,都是亲测)如果某些软件需要验证ID才能开始玩的话,(本身是提供I ...

  5. 2023年春节祝福第二弹——送你一只守护兔,让它温暖每一个你【html5 css3】画会动的小兔子,炫酷充电,字体特效

    2023年春节祝福第二弹 送你一只守护兔,让它温暖每一个你! [html5 css3]画一只会动的兔子 目录 一.送你一只守护兔,效果图 二.前言 三.代码解释及部分特效教程 (1).css3 立体字 ...

  6. 开源 | 蚂蚁金服分布式中间件开源第二弹:丰富微服务架构体系

    小蚂蚁说: 数据.消息.微服务是蚂蚁金服自主研发的金融级分布式中间件 SOFA (Scalable Open Financial Architecture)的三大方向. 一个多月前,蚂蚁金服开源了 S ...

  7. 李飞飞AI100报告第二弹,提出14大AI机遇与挑战,82页pdf

    来源:Stanford 编辑:好困 David 「AI100」报告第二弹! 本次报告评估了2016年至2021年间人工智能的发展,涵盖14大问题,探讨了人工智能发展的关键领域. 主题是「人工智能在日常 ...

  8. MaxCompute - ODPS重装上阵 第二弹 - 新的基本数据类型与内建函数

    MaxCompute(原ODPS)是阿里云自主研发的具有业界领先水平的分布式大数据处理平台, 尤其在集团内部得到广泛应用,支撑了多个BU的核心业务. MaxCompute除了持续优化性能外,也致力于提 ...

  9. Linux入门第二弹!Xshell、Xftp、tomcat的Linux版本、双X的教学资源!

    Linux入门第二弹!Xshell.Xftp.tomcat的Linux版本.双X的教学资源! 我们可以通过Xshell和Xftp进行简单的,远程连接Linux系统.并且可以使用图形化界面快捷的进行文件 ...

最新文章

  1. 如何生成动态库 .dll 的符号 .lib 文件?
  2. webpack从入门到精通(一)初体验
  3. les物流执行系统_【精益运营】立足智慧物流 推进仓储智能化稳步升级
  4. 树莓派Raspberry 操作GPIO--LED
  5. 至强cpu型号列表_装机必看——CPU型号参数详解
  6. 为何需要搭建大数据平台
  7. rhel linux 自动 fsck,red hat as 4 启动报错:checking filesystems fsck.ext3: bad magic number ......
  8. 如何进入BIOS设置?
  9. Centos7.6环境使用kubeadm部署kubernetes1.18.4
  10. M5311模组烤机测试装置(Arduino)
  11. 数据分析-傅里叶变换
  12. 【01】什么是概率图模型?
  13. Nginx高级优化(2): shell脚本日志切割,连接超时,进程数,网页压缩,防盗链,FPM 参数优化!!
  14. 笔记本电脑周边双屏显示方案
  15. 优秀产品经理所需具备的7种能力
  16. NAT代理服务器技术调研
  17. 成为高级黑客需要的技能
  18. mysql分页分表_mysql分表后 如何分页 (总共160个表1500万数据)
  19. 智能手环功能模块设计_智能手环设计方案
  20. 用SamInside破解Windows登录密码

热门文章

  1. 虚拟机fedora共享_开源虚拟现实,用于电子测试的新电路板,Fedora 25,以及更多新闻
  2. SxSW小组成员讨论了Valley调查中的Elephant
  3. 前端:JS/25/DOM官方定义,DOM分类,HTML节点树(节点关系,节点类型,),核心DOM中公共的属性和方法(节点访问,查找DOM节点,节点属性,节点的创建,追加和删除)
  4. 第二十八章:化学学校
  5. verp中的redundantRobot的逆运动学注意事项
  6. 2019长江课堂作业答案_“绝户网”捕捞长江鳗鱼苗 检察机关:“全链条”担责...
  7. mysql硬盘安装方法_Mysql安装教程
  8. kakfa怎么看消息是否堆积_不停的打开微信,只为看你是否更新了消息
  9. efi引导文件_你们心心念念的oc通用EFI来了!
  10. Luogu P2055 [ZJOI2009]假期的宿舍