首页 > 数据库 >Oracle update语句引起大量业务卡顿

Oracle update语句引起大量业务卡顿

时间:2024-05-16 08:59:29浏览次数:20  
标签:语句 数据库 update current gc Oracle 等待 卡顿

记一次update语句引起大量业务卡顿分析处理过程,聊聊我的思路。技术人人都可以磨炼,但处理问题的思路和角度各有不同,希望这篇文章可以抛砖引玉。

以一个例子为切入点


一、问题背景

某业务模块反馈最近出现过几次业务卡顿,数据库中定位到有几个 insert into 语句的gc等待比较严重,虽然过一会就恢复了,还是想排查一下具体原因,消除潜在隐患。

基础环境:

  • 主机类型:x3850 X6
  • 操作系统:DB:CentOS Linux release 7.4.1708、APP:CentOS Linux release 7.2.1511 (Core)
  • 存储:IBM存储,2TB,MULTIPATH
  • 内存:64 G
  • CPU型号:E7-4830 v3 @ 2.10GHz ( 4 U * 12 core)
  • CPU核数:32CORE
  • 数据库环境:11.2.0.4(RAC)

问题现象:

业务卡顿,数据库层面gc等待严重。

简单说明:

在很多应用场景中,数据库的稳定性直接决定了系统的稳定性。本文介绍一些通用的数据库问题处理技巧,健壮的数据库不能解决所有的问题,但是却能增加数据库运行的稳定性。

二、分析说明

  • 通过分析日志定位、分析故障原因;
  • 追溯历史数据,分析关键指标的历史波动,这些关键指标可以用来做为数据库健康度参考指标。
  • 用实际数据来验证推断,排除掉其它干扰因素,定位数据库问题的根本原因,帮助快速修复。

三、疑问点排查及分析思路

1、分析最近一次异常期间数据库日志

根据业务模块反馈,最近一次异常八点三十分左右。

AWR信息:

gc等待严重,等待次数高。

 

通过报告来看主要是三个insert语句引起的等待。

ASH信息:

查询各实例节点等待次数趋势情况,发现实例1并没有等待暴增的情况,而实例2在8:30时等待暴示,

 

进一步查询gc等待严重的sql语句是哪些:

 

可以看到这三个gc等待严重的SQL语句都是insert into语句,且是插入同一个表。这里和AWR的分析相吻合。

2、分析gc buffer busy acquire等待按块类型分类情况:

 (select *
    from (select /*+ materialize */
           inst_id,
           event,
           current_obj#,
           current_file#,
           current_block#,
           count(*) cnt
            from gv$active_session_history
           where event = 'gc buffer busy acquire'
           group by inst_id,
                    event,
                    current_obj#,
                    current_file#,
                    current_block#
          having count(*) > 5)
   where rownum < 101)
select *
  from (select inst_id,
               owner,
               object_name,
               object_type,
               current_file#,
               current_block#,
               cnt
          from ash_gc a, dba_objects o
         where (a.current_obj# = o.object_id(+))
           and a.current_obj# >= 1
        union
        select inst_id,
               '',
               '',
               'Undo Header/Undo block',
               current_file#,
               current_block#,
               cnt
          from ash_gc a
         where a.current_obj# = 0
        union
        select inst_id,
               '',
               '',
               'Undo Block',
               current_file#,
               current_block#,
               cnt
          from ash_gc a
         where a.current_obj# = -1)
 order by 7 desc

 

可以看到Undo Header/Undo block的统计次数最大,最严重的GC等待来自undo上的数据块,都是同一个表的gc传输。

3、跑批任务引起的卡顿?

根据开发反馈,昨晚有业务跑批,但一直没有执行玩所以kill了没提交,跑批的表正好是之前定位的问题表,写入表慢是否跟这个有关?

看了下跑批SQL,更新一张表,表中有六亿条数据,且没有分区。

另外实例2的lgwr写入存在写入延迟的问题,lgwr写入抖动很严重,2KB都要写516ms,lgwr写入慢,如果碰上大量的gc块获取,就会产生大量的gc等待,这里lgwr刷新需求和lgwr写入慢相应验证插入业务卡顿的故障现象。

继续查log file parallel write直方图:

 

同样验证log写入有比较严重的抖动现象。

四、结论

总结

综合以上的分析,可以确认本次故障是由于开发一条update语句条件错误导致大量的undo事务回滚,使在另一实例上的相同表的几个业务上insert into语句产生大量的gc buffer busy acquire等待,加上lgwr写入抖动加剧了等待时长,最终引起了前台业务卡顿。

针对本次故障,给予以下几个建议:

  1. 应用上要尽量避免这样的操作异常造成的大量回滚,针对大表的DML/DDL操作需要更加慎重。
  2. 为尽量避免GC等待,可以考虑进行应用划分,某个业务功能限制在一个节点中执行。
  3. log file parallel write日志写入有严重的延迟,需要存储厂商配合进一步分析。
  4. 当前大表创建成全局HASH分区表可能较合适的,索引也相应创建成分区索引,需要根据业务再讨论设计。

标签:语句,数据库,update,current,gc,Oracle,等待,卡顿
From: https://www.cnblogs.com/gdjgs/p/18195231

相关文章

  • gorm实现MySQL的INSERT INTO ... ON DUPLICATE KEY UPDATE差异化插入和更新
    比如插入f_create_uid,更新时忽略f_create_uid,只更新f_update_uid。可使用gorm的BeforeCreate和BeforeUpdate钩子,这两个钩子分别在创建和更新记录之前被调用。//BeforeCreate在创建记录之前调用func(dob*MyStruct)BeforeCreate(tx*gorm.DB)(errerror){dob......
  • 根据某个查询条件的前50条数据来决定UPDATE语句的更新范围
    在MySQL中,如果你想要根据某个查询条件的前50条数据来决定UPDATE语句的更新范围,你可以使用子查询与LIMIT子句来实现。但是,直接在一个UPDATE语句中使用LIMIT可能会引发一些问题,因为LIMIT在UPDATE语句中的行为可能与在SELECT语句中的行为不完全相同,并且不是所有的数据库系统都支持在U......
  • Oracle数据库给某个PDB下面的用户设置密码永不过期
    切换到PDB:使用ALTERSESSIONSETCONTAINER语句切换到PDB,如下所示:ALTERSESSIONSETCONTAINER=PDB;确保密码策略允许永不过期:ALTERPROFILEDEFAULTLIMITPASSWORD_LIFE_TIMEUNLIMITED;这个命令会将默认配置修改为密码永不过期。然后,将用户的密码设为过期并立即修......
  • Mybatis-Plus中 updateById 无法将已有值的字段更新为 null
    在MyBatis-Plus中,使用updateById,null字段并不会更新,其实是和更新的策略有关,当然,也有插入策略。1、调整全局策略(会对所有的字段都忽略判断,如果一些字段不想要修改,但是传值的时候没有传递过来,就会被更新为null)mybatis-plus:global-config:db-config:insert-stra......
  • oracle rac 增加asm盘
    扫描新增设备echo"---">/sys/class/scsi_host/host0/scanecho"---">/sys/class/scsi_host/host1/scanecho"---">/sys/class/scsi_host/host2/scanecho"---">/sys/class/scsi_host/host3/scanecho"-......
  • Oracle Linux 9.4 正式版发布 - Oracle 提供支持 RHEL 兼容发行版
    OracleLinux9.4正式版发布-Oracle提供支持RHEL兼容发行版OracleLinuxwithUnbreakableEnterpriseKernel(UEK)&RedHatcompatiblekernel(RHCK)请访问原文链接:OracleLinux9.4正式版发布-Oracle提供支持RHEL兼容发行版,查看最新版。原创作品,转载请保留出......
  • openGauss 相同表的并发UPDATE
    相同表的并发UPDATE事务T1:STARTTRANSACTION;UPDATEtestSETaddress='test1234'WHEREname='test1';COMMIT;事务T2:STARTTRANSACTION;UPDATEtestSETaddress='test1234'WHEREname='test2';COMMIT;事务T3:STARTTRANSACTION;......
  • oracle 备份与恢复常见的七大问题
    为了最大限度保障数据的安全性,同时能在不可预计灾难的情况下保证数据的快速恢复,需要根据数据的类型和重要程度制定相应的备份和恢复方案。在这个过程中,DBA的职责就是要保证数据库(其它数据由其它岗位负责)的高可用和高性能,以下典型问题及解答可供参考。1、Oracle的几种备份方式简介......
  • Oracle RAC备库启动service报"ORA-16000: database open for read-only access"
     OracleRAC备库启动service报"ORA-16000:databaseopenforread-onlyaccess" 还是2019.03.01那天的事了,当时在KFT客户就遇到这个问题,最近在规整一些资料看到当时待整理的文档,就抽空做做实验整理下。报错信息如下,ADG备库:[oracle@xxxprdoradb01~]$srvctlstartservic......
  • libbbb update
    2024年5月7日更新https://zh.zlibrary-be.se/懂的都懂2024年5月7日更新见:https://zhuanlan.zhihu.com/p/645998294......