好文分享 | 记一次Oracle12c数据库SQL短暂缓慢问题分析
本文为墨天轮社区作者 张sir 原创作品,记录了日常运维Oracle数据库过程中遇到的一个慢SQL问题的解决、优化过程,文章内容全面具体、分析到位,且含有经验总结,分享给各位。
问题现象
这次出问题的数据库比较特殊,承接的系统交易要求很高,SQL基本都是短平快,响应时间基本不能超过50ms,某天凌晨的01:12-01:14在进行压力测试的时候,突然出现短暂的交易延迟变长的情况,有部分交易超时。应用定位到是数据库返回慢了,要求我们排查问题。
问题分析:
步骤一:come on v$ASH
分析这种问题,我是特别喜欢用v$active_session_history视图的,虽然oracle也提供了ASH报告的功能,但是总感觉报告提供的内容太多,没法抓住重点。直接查视图,想看什么信息都可以。首先先看看问题时段整体的数据库sql的执行情况,SQL执行时间最长已经到40s左右了,这个时间肯定是无法接受的,而且基本上都是两条SQL:cuw23huyg926x和84m7xzxz0181g。
既然找到了慢SQL,那就看看他们的主要的等待事件吧, 通过下面的查询可以看出84m7xzxz0181g主要等待事件是enq: US - contention和row cache lock,cuw23huyg926x的主要等待事件是enq: US - contention。
84m7xzxz0181g:
步骤二:等待事件分析
1) 先简单看下这两个等待事件哈:
row cache lock等待事件是一个共享池相关的等待事件,是由于对字典缓冲的访问造成的。每一个行缓冲队列锁都对应一个特定的数据字典对象,这被叫做队列锁类型,并可以在V$ROWCACHE视图中找到。在AWR中需要查看Dictionary Cache Stats部分用以确定问题。常见的原因有如下几点:
① 序列没有设置CACHE属性,导致序列争用。
② 表空间不足引起 表空间的扩展速度跟不上表空间的使用速度会发生该等待事件。
③ Shared Pool不足,需要增加共享池。
④ 用户密码错误或给出了空密码并且频繁登录。
enq: US - contention:这个event说明事务在队列中等待UNDO Segment,通常是由于UNDO空间不足导致的。
在对此事件说明之前,需要理解在使用AUM(atuomatic undo management)时,回滚段在何时联机或脱机。AUM与RBU(rollback segment management)不同,回滚段的管理是Oracle自动完成的。使用AUM时,回滚段的联机或脱机的时刻如下:
1)在执行alter database open的时候将回滚段联机
2)通过alter system set undo_tablespace=xxx 修改撤销表空间时,将原来的回滚段脱机后,再将新的回滚段联机。
3)通过SMON,自动脱机或者联机回滚段,如果一段时间内,事务量增加,联机状态的回滚段也会增加,一段时间内若是没有实物或事务减少,回滚段就会被smon进程脱机。
为了同步将回滚段联机或脱机的过程,执行该工作的服务器进程或后台进程应获得US锁,每个回滚段非配一个US锁,ID1=Undo segment#。若在获得US锁的过程中发生争用,则等待enq:US-contention事件。服务器进程应该在开始事务时分配到回滚段,但如果不存在可用的回滚段时,应该创建新的回滚段或将脱机状态的回滚段联机。在实现此项工作期间,服务器进程为了获得US锁而等待,等待占有可用回滚段。
2)第一个等待事件是跟共享池相关的等待事件,我们可以通过v$ash看看具体等待的字典缓冲类型
3)看一下等待事件row cahce lock等待的对象是什么,row cache lock 等待事件的P1参数为cache id,根据cache id找到dc,可以看到大部分是等待获取dc_rollback_segments,这个等待时间也是在等待获取undo信息。
4)第一个等待事件是字典缓冲的争用,争用的对象是rollback segments,第二个等待事件enq: US - contention也是关于undo segment的等待。根据以上情况可以看出,row cache lock和enq:U - contention是有相关性的,都是由于获取undo的时候产生的争用。但是这个系统其实是采用的分库分表的架构,有多个对等角色的数据库,每套数据库交易量基本一致,那为什么这套库有问题,而别的库没问题呢?
步骤三、继续AWR+v$ASH
以上问题也是我自己的疑问,多套配置相同的数据库,交易量一致,如果说是由于undo引发的,那为啥其他库没问题,单单这套库有问题? 感觉问题的根源还不在这里。继续仔细查看
awr报告,发现问题库的rac节点2的等待事件中有log file sync等待,按理说这是一个正常等待,但是其等待时间超过了2ms,而其他几套库的该等待事件时间都是几百us。
再看下log file parallel write事件,平均等待时间是1.09ms,其他对等数据库的等待时间只有几百us。
去V$ASH里查看这个等待事件的时间分布情况,发现在01:12:16s的时候,log file parallel write执行超过了1s。
到这里,基本上可以把证据链梳理下了:
压力测试期间,交易量突然上升-----》online的undo segment不足-----》数据库online undo segment-----》发生US锁争用
而IO突然的堵塞,事务无法正常提交,加剧了undo的争用。针对这个问题,我们设置了_rollback_segment_count 参数,表示有多少rollback segment要处于online的状态;可以将该数值设置为数据库最繁忙的时候的回滚段数目。
总结:
1、 如果这个系统只有一套数据库,分析到第二步可能就结案了,有同样分库发表的兄弟库做对比,别人都没问题,就你有问题,那说明还有更深层次的原因。
2、 这种IO瞬时的延迟,基本上无解,尤其对于高并发系统,一个IO抖动就可能导致数据库堵塞。整个存储链路也不可能百分之百的一直处于高质量的状态。
3、 对于从v$ash中查到log file parallel write有1s的延迟,这个值的准确性我持怀疑态度,从底层的os、虚拟化、光纤交换机、存储都没看到这么高的延迟。有对这个有研究的老铁,可以讨论下。
阅读原文:https://www.modb.pro/db/486407
本文为【墨力原创作者计划】征文活动投稿作品,活动收录了数百篇Oracle、MySQL、PostgreSQL以及国产数据库相关的文章,包含数据库安装配置、性能调优、故障处理、高可用搭建等主题,此外也有K8s、Java、VUE等优质稿件。大家点击此处可查看有所技术文章。更多数据库故障处理文章可以点击此处查看。
【墨力原创作者计划】活动长期进行中,首次参与活动即有机会获得定制护腰靠枕;参与月更挑战,还可以获得定制U盘、罗技鼠标、华为手环、100-300元现金奖励等奖品,期待您的参与!
具体活动规则可以查看:https://www.modb.pro/db/513210
好文分享 | 记一次Oracle12c数据库SQL短暂缓慢问题分析的更多相关文章
- 性能测试 | 记一次生产数据库sql由451s优化为0.4s的过程
概述 最近开发说某个接口跑的很慢,排查了下发现其中一条sql,数据量不大,但居然要跑451s,下面简单记录一下优化的过程. 问题sql SELECT l.location_gid ENUMVALUE, ...
- 记一次mysql数据库被勒索(下)
背景: nextcloud的mysql数据库被黑,删库勒索.参考:记一次mysql数据库被勒索(上) mysql数据库恢复成功,nextcloud还是无法连接.参考:记一次mysql数据库被勒索(中) ...
- (喷血分享)利用.NET生成数据库表的创建脚本,类似SqlServer编写表的CREATE语句
(喷血分享)利用.NET生成数据库表的创建脚本,类似SqlServer编写表的CREATE语句 在我们RDIFramework.NET代码生成器中,有这样一个应用,就是通过数据库表自动生成表的CREA ...
- 老李分享:loadrunner操作mysql数据库
老李分享:loadrunner操作mysql数据库 在poptest测试开发工程师就业培训的课程中,针对一套商业系统进行性能测试,目标是mysql后台数据库的负载能力,在这里我把测试代码 ...
- 趣文分享:有人将Android开发环境比作女人
(一个移动开发者大会活动推荐:http://www.eoeandroid.com/thread-303943-1-1.html) 趣文分享:有人将Android开发环境比作女人 在日常开发工作中,我们 ...
- (转)PLSQL Developer 12.0.7连接Oracle12c数据库
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/sl1992/article/details/80489413 1.下载安装PL/SQL Develo ...
- Oracle12c 数据库找到Scott账户的方法
因为Oracle12c数据库中引入了CDB与PDB的概念(具体介绍请参考潇湘隐者的文章http://www.cnblogs.com/kerrycode/p/3386917.html),我们之前常用的练 ...
- 记一次mysql数据库被勒索(中)
背景在上一篇文章里面已经提过了. 现在面临的问题是nextcloud没有mysql数据库,用不起来了. 因为文件没丢,一种方法是启动新的mysql数据库,把文件重新提交一次. 为了程序员的面子,没有选 ...
- [好文分享]MySQL 加锁处理分析
原文转自:http://hedengcheng.com/?p=771 背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题.我在工作过程中,经常会有同事咨询这方面的问题.同时,微博上也经 ...
- 阿里云资深DBA专家罗龙九:云数据库十大经典案例分析【转载】
阿里云资深DBA专家罗龙九:云数据库十大经典案例分析 2016-07-21 06:33 本文已获阿里云授权发布,转载具体要求见文末 摘要:本文根据阿里云资深DBA专家罗龙九在首届阿里巴巴在线峰会的&l ...
随机推荐
- Fiddler使用界面介绍-工具栏
Fiddler工具栏介绍 1.备注 选择一个或多个请求后点击[备注]图标,可批量给请求添加备注显示在"Comments"一列 2.Replay 选择一个或多个请求后点击[Repla ...
- 【DataBase】MySQL 28 流程控制
一.分支结构 1.IF函数 语法: IF(表达式1, 表达式2, 表达式3) 类似三元运算符,表达式1返回True Or False True执行表达式2,False执行表达式3 IF实现多分枝结构 ...
- 如果一个windows主机上插两个蓝牙适配器会如何???——由于 Windows 无法加载这个设备所需的驱动程序,导致这个设备工作异常。 (代码 31)——windows主机蓝牙适配器驱动错误排查
事情是这样的,在某鱼上挂了一个蓝牙适配器,是自己多年前买的,给自己的老电脑用的,那一台老电脑主板上没有自带蓝牙,于是就在某东上买了一个蓝牙适配器: 但是这几年新买的电脑都自带蓝牙,于是准备把这个适配器 ...
- pytorch中神经网络的多线程数设置:torch.set_num_threads(N)
实验室的同学一直都是在服务器上既用CPU训练神经网络也有使用GPU的,最近才发现原来在pytorch中可以通过设置 torch.set_num_threads(args.thread) 来限制CP ...
- 洛谷P1226 【模板】快速幂
1.快速幂模板 前置知识 一个数字n,它的二进制位数一定是log2n向下取整+1: 快速幂模板代码 这段代码实现了快速幂算法(Exponentiation by squaring),用来计算 ( an ...
- PLC开发没有前景想转行嵌入式,找个培训机构还是自学?
0. 粉丝提问 把粉丝的情况和问题总结起来,主要以下几点: 这位粉丝19年毕业,25岁,专业是是自动化,之前从事plc开发,现在在自学单片机,想转行做Linux相关开发 犹豫是自学还是报线下培训班? ...
- CentOS 进入救援模式
因某些修改操作,导致系统重启后无法正常启动,此时需要进入救援模式,修复错误配置即可. 1.重启系统后,进入grup引导页面,选中第一项然后按"e" 进入编辑模式: 2.通过↓键找到 ...
- [学习笔记]在不同项目中切换Node.js版本
@ 目录 使用 Node Version Manager (NVM) 安装 NVM 使用 NVM 安装和切换 Node.js 版本 为项目指定 Node.js 版本 使用环境变量指定 Node.js ...
- 推荐7款美观且功能强大的WPF UI库
前言 经常看到有小伙伴在DotNetGuide技术社区交流群里提问:WPF有什么好用或者好看的UI组件库推荐的?,今天大姚给大家分享7款开源.美观.功能强大.简单易用的WPF UI组件库. WPF介绍 ...
- 连续因子一个正整数 N
一个正整数 N 的因子中可能存在若干连续的数字.例如 630 可以分解为 3×5×6×7,其中 5.6.7 就是 3 个连续的数字.给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的 ...