好文分享 | 记一次Oracle12c数据库SQL短暂缓慢问题分析

这篇具有很好参考价值的文章主要介绍了好文分享 | 记一次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。

好文分享 | 记一次Oracle12c数据库SQL短暂缓慢问题分析

      既然找到了慢SQL,那就看看他们的主要的等待事件吧, 通过下面的查询可以看出84m7xzxz0181g主要等待事件是enq: US - contention和row cache lock,cuw23huyg926x的主要等待事件是enq: US - contention。

好文分享 | 记一次Oracle12c数据库SQL短暂缓慢问题分析

84m7xzxz0181g:

好文分享 | 记一次Oracle12c数据库SQL短暂缓慢问题分析

步骤二:等待事件分析
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看看具体等待的字典缓冲类型

好文分享 | 记一次Oracle12c数据库SQL短暂缓慢问题分析

3)看一下等待事件row cahce lock等待的对象是什么,row cache lock 等待事件的P1参数为cache id,根据cache id找到dc,可以看到大部分是等待获取dc\_rollback\_segments,这个等待时间也是在等待获取undo信息。

好文分享 | 记一次Oracle12c数据库SQL短暂缓慢问题分析

 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。

好文分享 | 记一次Oracle12c数据库SQL短暂缓慢问题分析

再看下log file parallel write事件,平均等待时间是1.09ms,其他对等数据库的等待时间只有几百us。

好文分享 | 记一次Oracle12c数据库SQL短暂缓慢问题分析

去V$ASH里查看这个等待事件的时间分布情况,发现在01:12:16s的时候,log file parallel write执行超过了1s。

好文分享 | 记一次Oracle12c数据库SQL短暂缓慢问题分析

到这里,基本上可以把证据链梳理下了:

压力测试期间,交易量突然上升-----》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文章来源地址https://www.toymoban.com/news/detail-446460.html

到了这里,关于好文分享 | 记一次Oracle12c数据库SQL短暂缓慢问题分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 手工升级到Oracle 12C

    10.2.0.5,11.1.0.7,11.2.0.2以上版本可以直接升级到12c。 10.2.0.5以前的版本和11.2.0.1版需要先升级到中间版本,再升级到12c。 操作系统:Red Hat 8 Linux 64位 源数据库版本:Oracle 11.2.0.3 目标数据库版本:Oracle 12.1.0.2 备份源数据库(RMan) 执行Pre-Upgrade Information Tool(preupgrd.sql) 准备新

    2024年02月08日
    浏览(48)
  • Oracle database 静默安装 oracle12c 一键安装 12.1.0.2

    注意此安装脚本基于12.1.0.2 安装包 原始安装包结构为两个压缩包 此脚本使用安装包为原始压缩包解压后、 重新封装为一个.zip压缩包 Linux :centerOS 7 oracle :12.1.0.2 runInstaller应答文件 /database/response/db_install.rsp netca应答文件 /database/response/netca.rsp dbca应答文件 /database/response/dbc

    2024年02月03日
    浏览(51)
  • 【Oracle】Linux——Centos7安装Oracle12c

    官方网站:https://www.oracle.com 历史版本下载地址:https://edelivery.oracle.com/ (需要登录) 如果官方下载有问题,使用百度网盘:链接: https://pan.baidu.com/s/101U3P3KYUQ5p_zsAP1aCfw?pwd=6666 提取码: 6666 添加oinstall、dba 组,创建oracle用户,设置oracle用户密码(练习的话,为了方便记忆,建议不

    2024年03月20日
    浏览(48)
  • Windows下 Oracle 12c 安装保姆级图文详解

    Windows下 Oracle 12c 安装步骤如下: 1、将压缩包“winx64_12c_database_1of2.zip“和“winx64_12c_database_2of2.zip”解压到同一目录“database”目录。 2、双击“database”目录下的“setup.exe\\\",软件会加载并初步校验系统是否可以达到了数据库安装的最低配置,如果达到要求,就会直接加载程序并

    2024年02月10日
    浏览(32)
  • Docker 安装oracle12c容器并创建新用户

    下载镜像 启动镜像 8080和22端口没有映射出来,有需要自己 正常日志 启动报错日志 原因 容器没有操作主机文件夹权限 主机内执行 进入容器内并以dba登录Oracle 创建表空间及用户和赋权

    2024年02月08日
    浏览(30)
  • docker快速部署oracle19c、oracle12c,测试环境问题复现demo快速搭建笔记

    (复制sql,替换表名执行完毕后,再修改自己想要的字段即可) (复制sql,替换自己的表名) 一个oracle表示一个实例,一个实例可以配置多个服务,独立维护的oracle服务 一个服务内可以有多个表空间,默认表空间就有很多,比如常见的SYSTEM、TEMP、USERS 常见的默认角色: 1、

    2024年02月04日
    浏览(43)
  • 【BUG】解决安装oracle11g或12C中无法访问临时位置的问题

    安装oracle时,到第二步出现oracle11g或12C中无法访问临时位置的问题。 针对客户端安装,在cmd中执行命令:前面加实际路径setup.exe -ignorePrereq -J\\\"-Doracle.install.client.validate.clientSupportedOSCheck=false\\\" 如: 针对服务端安装,在cmd中执行命令:前面加实际路径setup.exe -ignorePrereq -J\\\"-Doracl

    2024年02月11日
    浏览(27)
  • oracle 12c和plsql的详细安装和配置过程(超级详细,小白也能懂)

    oracle 12c和plsql的详细安装和配置过程 Oracle 12c 的压缩包连接如下: 链接:https://pan.baidu.com/s/1xTvjnXsKysmRb18-QUXRkA 提取码:4a9j 1解压,打开文件双击\\\"setup.exe\\\" 2去掉勾选,下一步 3点击”是” 4点击”下一步” 5点击”下一步” 6选择”单实例数据库安装”,点击”下一步” 7选择”高级安

    2023年04月10日
    浏览(35)
  • 记一次eclipse导入的JavaEE项目无法连接数据库的排查

    Eclipse导入了一个JavaEE项目 在虚拟机环境中新建了一个数据库 数据库可以使用本地客户端工具正常连接 导入的JavaEE项目修改了数据源配置后无法启动 相同的数据源配置通过在Idea新建的测试项目可以访问 具体报错如下: +++++++++++++++++++++++++++++分割线+++++++++++++++++++++++++++++ 修改

    2024年02月10日
    浏览(35)
  • 记一次由于操作失误致使数据库瘫痪的故障分析与解决方案

    2023年8月27日,随着新业务的接入,我们开始进行项目的灰度发布。然而,直到2023年8月31日下午,我们才发现一个新字段并没有进行字段刷新,导致所有数据都是默认值,从而无法继续进行灰度测试。在业务方的要求下,我们需要进行批量更新字段。鉴于我们已经知道了时间

    2024年02月09日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包