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

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

时间:2024-05-08 09:00:11浏览次数:24  
标签:语句 数据库 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/shujuyr/p/18178905

相关文章

  • oracle表导出mysql适用的脚本方法
    oracle表导出mysql适用的脚本方法1.在对应的oracle数据库plsql中执行下面代码,建F_LIMS_GET_SQL_FOR_MYSQL函数CREATEORREPLACEFUNCTIONF_LIMS_GET_SQL_FOR_MYSQL(PI_TABLENAMEINVARCHAR2,PI_ISDROPININTEGER:=1......
  • C#/C++ 通过ODBC连接OceanBase Oracle租户
    概述近期我们项目正处于将Oracle数据库迁移到OceanBaseOracle租户模式的阶段。考虑到我们项目采用了C++和C#混合开发,并且使用了多种技术,因此存在多种数据库连接方式。然而,针对C#连接OceanBase的案例相对较少,因此我特意记录下这一过程。开放数据库互连(ODBC)是微软公司开放服务结......
  • 存储故障后oracle报—ORA-01122/ORA-01207故障处理---惜分飞
    联系:手机/微信(+8617813235971)QQ(107644445)标题:存储故障后oracle报—ORA-01122/ORA-01207故障处理作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]客户存储异常,通过硬件恢复解决存储故障之后,oracle数据库无法正常启动(存储cache......
  • EXP-00056: ORACLE error 12154 encountered
    使用如下命令:--exp用户名/密码@数据库实例名file=导出文件名[参数]expscott/scott@orclfile=/expdat.dmpfull=y--正确方式expscott/scott@CONN_orclfile=/expdat.dmpfull=y出现了如下错误:EXP-00056:ORACLEerror12154encounteredORA-12154:TNS:couldnotr......
  • PostgreSQL和Oracle两种数据库区别
    PostgreSQL和Oracle是两个备受欢迎的关系型数据库管理系统(RDBMS)。它们都提供了强大的功能和广泛的应用领域。然而,在选择使用哪个数据库管理系统时,需要考虑各自的特点和适用场景。本文将详细比较PostgreSQL和Oracle,并探讨在不同情况下应该选择哪个数据库管理系统。PostgreSQLPos......
  • 3分钟部署单服务器oracle12c
    dockerpulldocker.io/truevoly/oracle-12cmkdir-p/usr/local/oracle/data_tempchmod777/usr/local/oracle/data_tempdockerrun--restartalways-d-p8080:8080-p1521:1521-v/usr/local/oracle/data_temp:/home/oracle/data_temp-v/etc/localtime:/etc/loca......
  • Oracle 给用户授权访问视图
    Oracle给用户授权访问视图createuserc##hrpidentifiedby123456;grantresource,connecttoc##hrp;grantconnecttoc##hrp;grantselectonC##BSKJ.sch_sc_schedulinfotoc##hrp;grantselectonC##BSKJ.sch_sc_classestoc##hrp;grantselectonC##BSKJ.sys_usert......
  • [转帖]Oracle Exadata 学习笔记之核心特性Part1
    https://www.cnblogs.com/jyzhao/p/12257649.html#2 近年来,国内众多厂商都有一体机的产品,不过更多都是围绕硬件本身的堆砌和优化,那么这些产品和Oracle一体机最大的区别在哪里呢?最近读了李亚的《OracleExadata技术详解》,系统的了解了Exadata的一些核心特性,我个人认为这些特......
  • Dockerfile.oracle-注释学习
    innovation/Dockerfile.oracle##NOTE:THISDOCKERFILEISGENERATEDVIA"apply-templates.sh"##PLEASEDONOTEDITITDIRECTLY.##使用oraclelinux:8-slim基础镜像FROMoraclelinux:8-slim#set-eux也就是以调试的方式执行shell,只识别定义过的变量,同时脚......
  • 修改oracle 字符集
    [oracle@prdb19~]$sqlplus/assysdbaSQL*Plus:Release19.0.0.0.0-ProductiononMonMay611:50:262024Version19.23.0.0.0Copyright(c)1982,2023,Oracle.Allrightsreserved.Connectedtoanidleinstance.SQL>startupRESTRICT;ORACLEinst......