oracle数据回滚导致业务性能问题排查

问题描述

数据库出现性能问题,应用响应超时持续长达10多分钟。由于每秒有大量insert,业务实时敏感性较高,而且每天凌晨会对前一天的数据进行归档也就是insert进历史表格,原表数据会进行delete清理(数据量每天300W左右)。平时这一步都能顺利完成。而故障当天业务部门由于某种原因异常终止了delete,这异常终止导致了后续出现了短暂的卡顿。 

分析过程

根据上面的信息:大表delete被异常终止后出现短暂性能卡顿。我们知道大型DML被终止后smon进程会做大事务回滚,对应的数据库等待事件为:wait for a undo record,其中fast_start_parallel_rollback参数决定了SMON在回滚事务时使用的并行度。当前参数值为LOW,也就是2*CPU_COUNT数目的并行度回滚。可想而知此CPU使用率会明显上升,监控平台印证了这一点,持续时间刚好覆盖了故障时间段。

获取故障时间段AWR报告:

从数据库Top events来看故障时间等待事件明显异常,数据库大部分等待都花在:latch:undo global data、enq: TX - index contention以及wait for a undo record争用上。其中wait for a undo record由于并行回滚所致。

知识扩展:

enq: TX - index contention:索引争用、索引块分裂直接相关,当一个事务需要向一个数据块插入数据时,该数据块正好发生了索引分裂,则插入事务需要等待分裂事务。通常发生在高并发的OLTP系统中。

latch:undo global data:对SGA中撤消(也称为回滚)段信息的访问,每次会话获取撤销段状态时,都必须获取此闩锁。

根据扩展知识enq: TX - index contention由于高并发的insert所致,这里不做过多阐述。

这里我们重点分析下latch:undo global data

从ASH统计来看,不同的会话在同一条INSERT SQL语句出现了较高的latch: undo global data 等待,latch miss是 ktudba: KSLBEGIN ,同时伴随着大量buffer busy waits等待(经确认insert都为该业务发起)。

AWR latch: undo global data 为数据库TOP 1 wait event, 同时确认了ASH是一条简单的insert values语句,由于该应用未使用绑定变量执行频率从AWR 无法获取,但从沟通中可以确认是执行频率相当高,但是为什么会这么多的latch undo 呢?

latch争用,并非insert单独引起,此时猜测相同表格上存在delete操作,进一步查看ASH统计部分,如下:

其中49vuyv41gxzyu引起了我的注意(delete from Cur_Flow_Search where substr(O360SEQ,5,8) <'20191218'),执行时间刚好故障发生前后,与应用确认后正是他们异常终止的delete操作。发现blocking_session为空没有被堵塞。进一步查询该语句是否阻塞了其他会话:

再进一步使用上图中的sid作为blocking_session排查:

省略部分……

现在已经明确了是sid=2845的会话做了一个delete 大表操作, 直接或间接堵塞了该业务大量insert操作。

总结:

本次性能故障主要原因是大表delete被异常终止,引起大事物回滚,系统资源开销上升,间接影响了相同表格上其他insert操作,引起latch:undo global data争用,导致该业务模块性能下降。

所以,对于大事物回滚建议将系统参数fast_start_parallel_rollback修改为false,关闭并行恢复,减小高峰期系统资源争用。

另外该业务表格存日期字段o360seq为varchar类型,而且此字段含有主键索引、联合索引多达3个,但实际上删除中条件使用了函数,索引并未产生作用。建议该字段建成data类型字段,减少条件字段使用函数。

大表删除数据时建议用存储过程或函数,批量提交,避免删除数据量过大导致undo暴涨及争用情况发生。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/444554.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言指针学习(1)

前言 指针是C语言中一个重要概念&#xff0c;也是C语言的一个重要特色&#xff0c;正确而灵活地运用指针可以使程序简洁、紧凑、高效。每一个学习和使用C语言的人都应当深入的学习和掌握指针&#xff0c;也可以说不掌握指针就没有掌握C语言的精华。 一、什么是指针 想弄清楚什…

11. UE5 RPG使用GameplayEffect修改角色属性(二)

上一篇写了一下GameplayEffect的基础操作&#xff0c;这一篇进阶一下&#xff0c;讲解一下GameplayEffect堆叠功能&#xff0c;以及能够基于这个堆叠能够实现一些怎样的效果。 经过几天的查看&#xff0c;发现新版的更新的真不错&#xff0c;而且最上面竟然直接显示编译的错误…

【SpringBoot】SpringBoot的自动配置原理

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;SpringBoot ⛺️稳重求进&#xff0c;晒太阳 自动配置 啥叫自动配置呢&#xff1f;简单说就是springboot根据我们开发者的行为猜测你要做什么事情&#xff0c;然后把你要用的bean都给你准备…

vue3使用is动态切换组件报错Vue received a Component which was made a reactive object.

vue3使用is动态切换组件&#xff0c;activeComponent用ref定义报错 Vue received a Component which was made a reactive object. This can lead to unnecessary performance overhead, and should be avoided by marking the component with markRaw or using shallowRef ins…

【Linux】初始进程地址空间

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 目录 一、再谈fork二、程序地址空间2.1代码验证 三、虚拟地址&am…

数据结构+算法(第05篇):数组和链表

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

前端工程化之:webpack1-8(loader)

一、loader webpack 做的事情&#xff0c;仅仅是分析出各种模块的依赖关系&#xff0c;然后形成资源列表&#xff0c;最终打包生成到指定的文件中。 更多的功能需要借助 webpack loaders (加载器)和 webpack plugins (插件)完成。 webpack loader &#xff1a; loader 本质上是…

数据结构哈希表(散列) 之Hash

声明: 此文章仅限于记录学习之用 , 受限于自身水平和理解能力 , 因此结论可能是不正确的. 如果您需要学习,建议参考其他文章 看了下网上一些大佬的教程, 写的云山雾绕的. 简单总结下吧. 以言简意赅为主. 介绍下hash hash 就是把任意输入通过算法生成一个int值. 这个值就是放…

如何使用 Supabase Auth 在您的应用程序中设置身份验证

在本文中&#xff0c;您将学习基本的关键概念&#xff0c;这些概念将帮助您掌握身份验证和授权的工作原理。 您将首先了解什么是身份验证和授权&#xff0c;然后了解如何使用 Supabase auth 在应用程序中实现身份验证。 &#xff08;本文内容参考&#xff1a;java567.com&…

Spark入门01-Spark简介

1 Spark是什么 Spark是用于大规模数据处理的统一分析引擎。对任意类型的数据进行自定义计算。 可以计算&#xff1a;结构化、非结构化&#xff0c;半结构化的数据结构&#xff0c;支持使用Python&#xff0c;Java&#xff0c;Scala、Sql语言开发应用程序计算数据。 计算框架&a…

微服务—Docker

目录 初识Docker Docker与虚拟机的区别 镜像与容器 Docker架构 常见Docker命令 镜像命令 容器命令 数据卷挂载 直接挂载 初识Docker 在项目部署的过程中&#xff0c;如果出现大型项目组件较多&#xff0c;运行环境也较为复杂的情况&#xff0c;部署时会碰到一些问题&…

【力扣经典面试题】189. 轮转数组

题目描述&#xff1a; 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 …