月结保障:回滚慢、行锁频发
问题背景
3.1号月结现场保障,到场了先让kill了一个账务的会话,回滚了20min+,巡检的时候发现报表库有几条行锁:enq: TX - row lock contention,sql:delete from table_name 语句已经失败,正在回滚。
观察会话事务,发现改事务回滚块最大的时候有 3204496,3百万,那就是3204496*16/1024/1024 = 55G,速度很慢。
@transSID SERIAL# USERNAME TADDR SES_ADDR USED_UBLK USED_UREC 0xFLAG STATUS START_DATE XIDUSN XIDSLOT XIDSQN XID PRV_XID PTX_XID
------- ---------- ---------- ---------------- ---------------- ---------- ---------- --------- ----------------------------- ------------------- ---------- ---------- ---------- ---------------- ---------------- ----------------5956 36122 owner 0000000A93924120 0000000B841007F0 3204496 134656835 1E83 ACTIVE ROLLING BACK 2025-03-01 05:30:01 3560 30 253045118 E80D1E007E29150F 0000000000000000 0000000000000000SQL> /SID SERIAL# USERNAME TADDR SES_ADDR USED_UBLK USED_UREC 0xFLAG STATUS START_DATE XIDUSN XIDSLOT XIDSQN XID PRV_XID PTX_XID
------- ---------- ---------- ---------------- ---------------- ---------- ---------- --------- ----------------------------- ------------------- ---------- ---------- ---------- ---------------- ---------------- ----------------5956 36122 owner 0000000A93924120 0000000B841007F0 3158778 132735745 1E83 ACTIVE ROLLING BACK 2025-03-01 05:30:01 3560 30 253045118 E80D1E007E29150F 0000000000000000 0000000000000000SQL> /SID SERIAL# USERNAME TADDR SES_ADDR USED_UBLK USED_UREC 0xFLAG STATUS START_DATE XIDUSN XIDSLOT XIDSQN XID PRV_XID PTX_XID
------- ---------- ---------- ---------------- ---------------- ---------- ---------- --------- ----------------------------- ------------------- ---------- ---------- ---------- ---------------- ---------------- ----------------5956 36122 owner 0000000A93924120 0000000B841007F0 2301035 96692545 1E83 ACTIVE ROLLING BACK 2025-03-01 05:30:01 3560 30 253045118 E80D1E007E29150F 0000000000000000 0000000000000000
回滚的很慢,早上kill了一个5G的回滚块都20min。有没有快一点的办法?大神说可以杀了会话,做实例级并行恢复更快,我不会操作啊,和甲方沟通一下有Oracle原厂的人保障,让他们来?和局方沟通了一下,还是等着慢慢回滚了。
这有一个风险就是回滚块过大,再加上月结有大量的insert语句,可能导致undo空间不多,200G的undo表空间EXPIRED 只有 722MB 了。在一个就是ora-01555.
SQL> select tablespace_name,status,sum(bytes)/1024/1024 mb from DBA_UNDO_EXTENTS group by tablespace_name,status; TABLESPACE_NAME STATUS MB
------------------------------ --------- ----------
UNDOTBS1 ACTIVE 75294.9375
UNDOTBS1 EXPIRED 722.6875
UNDOTBS1 UNEXPIRED 169733.75
UNDOTBS2 EXPIRED 62278.4375
UNDOTBS2 UNEXPIRED 110715.25

临近下午下班的时候行锁又多了,回滚完一个又来一个。这业务到底是想删这个表呢还是想留着呢?2亿数据的表,列的选择性不是很好,没有索引。
SQL> select a.column_name,2 b.num_rows,3 a.num_distinct Cardinality,4 round(a.num_distinct / b.num_rows * 100, 2) selectivity5 from dba_tab_col_statistics a, dba_tables b6 where a.owner = b.owner7 and a.table_name = b.table_name8 and a.owner = 'owner'9 and a.table_name = 'table_name';COLUMN_NAME NUM_ROWS CARDINALITY SELECTIVITY
------------------- ---------- ----------- -----------
API_ID 233051892 0 0
ERROR_XXXXXXXXX 233051892 7 0
ERROR_XXXX 233051892 3 0
ERROR_XXXX 233051892 3 0
PROCESXXXX 233051892 18588 .01
ROW_NUM 233051892 6172 06 rows selected.
看程序是python连接过来的,记录一下客户端发给业务,业务说试试解决一下,当时有点惊讶,通常能跑就是好代码,一般是不会动的。
select osuser,machine,module,program ,CLIENT_IDENTIFIER,count(*) from v$session where sql_id='6mp492ha74kbx' group by machine,module,program,osuser,CLIENT_IDENTIFIER
但是,后面的得到的解释是“进程启的多,现在只留一个了。”。。。。。
那为什么不想想为什么起那么多进程, 这次杀了,下次还有啊 ,严重吐槽业务这边的日志,异常处理做的太差了,应用好几次抛出了几个错误信息都没封装直接给数据库了,都是ORA—XXX,出了问题没有接口文档,没有任何信息直接抛给数据库,业务是我们写的吗???
思考
为什么会出现这种情况呢?删了回滚再删,还是删全部,可能这个表放的是一些临时缓存的数据。
我猜测可能是业务逻辑写错了,在执行完这条sql之后,事务没有成功,导致回滚,回滚时间很长,期间再次调用此函数,导致了行锁,怎么解决呢?
- 最彻底的是修改业务,缩小事务,一个事务一个原子性,此函数中可能有一个位置导致未满足原子性导致的事务失败回滚,要想清楚什么时候删数据一定可以删,再删之前 if 语句判断一下。
- 可以在执行删除操作前加一个锁,再次执行到这的时候发现没有执行完也就拿不到锁,可以避免数据库中的行锁,但是不能解决undo一直回滚。
- 做正确的异常处理,执行失败一定要做异常处理,抛出异常日志,都留到数据库处理怎么行。
- 如果确定是要删表的数据可以直接 truncate ,不产生undo。
- 做并行恢复
FAST_START_PARALLEL_ROLLBACK。 - 增加
UNDO_RETENTION。
环境模拟
创建测试表 tab_roll
create tablespace rollspace datafile '/u01/oradata/rollspace01.dbf' size 2G autoextend off;create user PANDAS IDENTIFIED by "oracle" default tablespace rollspace ;create table tab_roll as select * from dba_objects where 1=0;
conn pandas/oracle
beginfor i in 1..20 LOOPinsert into /*+ append */ tab_roll nologing select * from dba_objects;commit;end LOOP;
end;
/ PANDAS@orcl> exec DBMS_STATS.GATHER_TABLE_STATS (ownname => '&TOWN' , tabname => '&TNAME' , cascade => true, estimate_percent => dbms_stats.auto_sample_size,method_opt=>'FOR TABLE FOR ALL COLUMNS SIZE REPEAT', degree => 8,no_invalidate=>false);
Enter value for town: PANDAS
Enter value for tname: tab_rollPL/SQL procedure successfully completed.PANDAS@orcl> @seg pandas.tab_rollSEG_MB OWNER SEGMENT_NAME SEG_PART_NAME SEGMENT_TYPE SEG_TABLESPACE_NAME BLOCKS HDRFIL HDRBLK
---------- ------ ------------ ------------- ------------- -------------------------- ---------- ----------200 PANDAS TAB_ROLL TABLE ROLLSPACE 25600 7 130
测试
1、并行回滚
业务的事管不着,来看看数据库层面怎么解决?
FAST_START_PARALLEL_ROLLBACK指定恢复终止的事务时使用的并行度。
| 财产 | 描述 |
| 参数类型 |
|
| 句法 |
|
| 默认值 |
|
| 可修改 |
|
| 在 PDB 中修改 | 从版本 19.17 开始,此参数可以在 Oracle Database 19c 中的 PDB 中修改。 |
| 基本的 | 不 |
终止事务是系统故障前处于活动状态的事务。如果系统在有未提交的并行 DML 或 DDL 事务时发生故障,则可以使用此参数加快启动期间的事务恢复。
Database Reference
测试FAST_START_PARALLEL_ROLLBACK各个值回滚速度
FAST_START_PARALLEL_ROLLBACK = FALSE;
SYS@orcl> ALTER SYSTEM SET FAST_START_PARALLEL_ROLLBACK = FALSE;System altered.SYS@orcl> @p FAST_START_PARALLEL_ROLLBACKNAME VALUE
---------------------------------------- ----------------------------------------
fast_start_parallel_rollback FALSE
SYS@orcl> set timing on;
SYS@orcl> delete from PANDAS.tab_roll;1744280 rows deleted.Elapsed: 00:00:18.80
SYS@orcl> rollback;Rollback complete.Elapsed: 00:00:14.56
FAST_START_PARALLEL_ROLLBACK = LOW;
SYS@orcl> ALTER SYSTEM SET FAST_START_PARALLEL_ROLLBACK = LOW;System altered.SYS@orcl> @p FAST_START_PARALLEL_ROLLBACKNAME VALUE
---------------------------------------- ----------------------------------------
fast_start_parallel_rollback LOWSYS@orcl> set timing on;
SYS@orcl> delete from PANDAS.tab_roll;1744280 rows deleted.Elapsed: 00:00:16.75
SYS@orcl> rollback;Rollback complete.Elapsed: 00:00:17.65
FAST_START_PARALLEL_ROLLBACK = HIGH;
SYS@orcl> ALTER SYSTEM SET FAST_START_PARALLEL_ROLLBACK = HIGH;System altered.
SYS@orcl> @p FAST_START_PARALLEL_ROLLBACKNAME VALUE
---------------------------------------- ----------------------------------------
fast_start_parallel_rollback HIGH
SYS@orcl> set timing on;
SYS@orcl> delete from PANDAS.tab_roll;1744280 rows deleted.Elapsed: 00:00:19.17
SYS@orcl> rollback;Rollback complete.Elapsed: 00:00:15.63
FAST_START_PARALLEL_ROLLBACK 在不同设置下的影响:
|
|
|
|
| FALSE(禁用并行回滚) | 18.80s | 14.56s |
| LOW(10g默认值,最大的rollback进程为2*cpu_count个) | 16.75s | 17.65s |
| HIGH(最大的rollback进程为4*cpu_count个) | 19.17s | 15.63s |
测试结果并不符合想象。
为什么 FALSE 反而比 LOW/HIGH 更快?
idle很高说明CPU不是限制,测试环境两核CPU,可能是多个进程在访问undo的时候发生了死锁,注意iowait再次测试一下
[root@orcl:/u01]$ cat /proc/cpuinfo |grep pro
processor : 0
processor : 1
[root@orcl:/u01]$ sar
Linux 3.10.0-957.el7.x86_64 (orcl) 2025年03月04日 _x86_64_ (2 CPU)23时00分01秒 CPU %user %nice %system %iowait %steal %idle
23时10分01秒 all 0.17 0.00 0.58 0.05 0.00 99.19
23时20分01秒 all 3.19 0.00 4.07 1.14 0.00 91.59
平均时间: all 1.68 0.00 2.32 0.59 0.00 95.41[root@orcl:/u01]$ sar -d -f /var/log/sa/sa04
Linux 3.10.0-957.el7.x86_64 (orcl) 2025年03月04日 _x86_64_ (2 CPU)23时00分01秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
23时10分01秒 dev8-0 17.10 234.08 7049.70 426.04 0.08 4.56 0.32 0.55
23时10分01秒 dev11-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
23时10分01秒 dev253-0 1.96 24.09 40.89 33.13 0.00 0.55 0.44 0.09
23时10分01秒 dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
23时10分01秒 dev253-2 16.16 209.99 7008.64 446.70 0.15 8.86 0.29 0.46
23时10分01秒 dev253-3 0.02 0.00 0.16 8.82 0.00 0.64 0.27 0.00
23时20分01秒 dev8-0 492.28 675.44 41397.50 85.47 0.10 0.20 0.16 7.75
23时20分01秒 dev11-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
23时20分01秒 dev253-0 356.29 161.71 37309.07 105.17 0.08 0.22 0.17 5.99
23时20分01秒 dev253-1 31.03 13.44 234.78 8.00 0.04 1.40 0.05 0.15
23时20分01秒 dev253-2 134.72 500.29 3853.50 32.32 0.02 0.16 0.12 1.65
23时20分01秒 dev253-3 0.02 0.00 0.15 9.20 0.00 0.20 0.20 0.00
平均时间: dev8-0 254.69 454.76 24223.74 96.90 0.09 0.35 0.16 4.15
平均时间: dev11-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
平均时间: dev253-0 179.13 92.90 18675.14 104.77 0.04 0.22 0.17 3.04
平均时间: dev253-1 15.51 6.72 117.39 8.00 0.02 1.40 0.05 0.07
平均时间: dev253-2 75.44 355.14 5431.06 76.70 0.09 1.09 0.14 1.06
平均时间: dev253-3 0.02 0.00 0.16 9.00 0.00 0.43 0.24 0.00
再次测试并行回滚时间比false长
|
|
|
|
| FALSE(禁用并行回滚) | 16.48s | 18.21s |
| HIGH(最大的rollback进程为4*cpu_count个) | 22.37s | 15.07s |
同时发现开并行时候 r_await 等待时间(ms) 比较长。

2、杀死后台进程
未测试
select 'ho kill -9 '||spid from v$process where addr in(select paddr from v$session where sid=);
文中实验不对,导师帮我指出了错误:FAST_START_PARALLEL_ROLLBACK 参数并行回滚针对的是死事务,也就是杀了该会话的进程才会做并行回滚。另外还有一个隐藏参数:_cleanup_rollback_entries
相关文章:
月结保障:回滚慢、行锁频发
问题背景 3.1号月结现场保障,到场了先让kill了一个账务的会话,回滚了20min,巡检的时候发现报表库有几条行锁:enq: TX - row lock contention,sql:delete from table_name 语句已经失败,正在回滚…...
Golang的微服务服务发现机制
## 1. Golang微服务服务发现机制 微服务架构已经成为当今软件开发的主流趋势,它能将复杂的单体应用拆分成小而独立的服务单元,实现更快的开发、部署和扩展。在微服务架构中,服务发现是非常重要的一环,它能够实现服务之间的自动发现…...
Keepalived 入门详解:高可用集群部署最佳实践!
1. 什么是 Keepalived? 在分布式集群中,单点故障(SPOF) 是影响系统稳定性的重要问题。Keepalived 作为一款高可用服务软件,可以有效防止集群单点故障,保障系统的高可用性。 Keepalived 最初是为 LVS&#…...
SparkStreaming之04:调优
SparkStreaming调优 一 、要点 4.1 SparkStreaming运行原理 深入理解 4.2 调优策略 4.2.1 调整BlockReceiver的数量 案例演示: object MultiReceiverNetworkWordCount {def main(args: Array[String]) {val sparkConf new SparkConf().setAppName("Networ…...
开发博客系统
前言 准备工作 数据库表分为实体表和关系表 第一,建数据库表 然后导入前端页面 创建公共模块 就是统一返回值,异常那些东西 自己造一个自定义异常 普通类 mapper 获取全部博客 我们只需要返回id,title,content,us…...
微信小程序上如何使用图形验证码
1、php服务器生成图片验证码的代码片段如下: 注意红框部分的代码,生成的是ArrayBuffer类型的二进制图片 2、显示验证码 显示验证码,不要直接image组件加上src显示,那样拿不到cookie,没有办法做图形验证码的验证&…...
IntelliJ IDEA 构建项目时内存溢出问题
问题现象 在使用 IntelliJ IDEA 构建 Java 项目时,遇到了以下错误: java: java.lang.OutOfMemoryError: Java heap space java.lang.RuntimeException: java.lang.OutOfMemoryError: Java heap space这是一个典型的 Java 堆内存不足错误,表…...
大模型微调与RAG检索增强技术深度解析
一、引言 随着人工智能技术的飞速发展,大模型(如BERT、GPT等)在自然语言处理、计算机视觉等领域取得了显著成效。然而,这些预训练好的大模型往往难以直接应用于特定业务场景,因此,大模型微调(F…...
[liorf_localization_imuPreintegration-2] process has died
使用liorf,编译没报错,但是roslaunch报错如下: 解决方法: step1: 如果你之前没有安装 GTSAM,可以尝试安装它 step2: 检查是否缺少依赖库 ldd /home/zz/1210/devel/lib/liorf_localization/liorf_localization_imuPr…...
2024 年 MySQL 8.0.40 安装配置、Workbench汉化教程最简易(保姆级)
首先到官网上下载安装包:http://www.mysql.com 点击下载,拉到最下面,点击社区版下载 windows用户点击下面适用于windows的安装程序 点击下载,网络条件好可以点第一个,怕下着下着断了点第二个离线下载 双击下载好的安装…...
数列极限入门习题
数列极限入门习题 lim n → ∞ ( 1 1 2 1 3 ⋯ 1 n ) 1 n \lim\limits_{n\rightarrow\infty}(1 \frac{1}{2}\frac{1}{3}\cdots\frac{1}{n})^{\frac{1}{n}} n→∞lim(12131⋯n1)n1 lim n → ∞ ( 1 n 1 1 n 2 ⋯ 1 n n ) \lim\limits_{n\rightarrow\…...
【Python/Pytorch】-- 创建3090Ti显卡所需环境
文章目录 文章目录 01 服务器上,存在三个anaconda,如何选择合适的,创建python环境?02 conda、anaconda、cuda、cudnn区别03 用到一些指令04 如何指定cuda的版本?05 conda跟pip的区别?06 pycharm控制台07 服…...
如何在无图形化界面的服务器上下载百度网盘的超大文件(10GB以上)?
目录 登录百度网盘账号 进入特定的文件夹 下载 完整教程 登录百度网盘账号 第一次登录的时候会展示: Please visit: https://openapi.baidu.com/oauth/2.0/authorize?client_idxxx And authorize this app Paste the Authorization Code here within 10 minut…...
AI应用测试:遇到类ChatGPT的流式接口要如何压测?
先说结论: 使用最普遍的JMeter 就能支持类 OpenAI 的流式接口(如 ChatGPT 的流式聊天接口)的测试 总体设置 JMeter 支持测试 OpenAI 的流式接口,但需要额外配置(如启用 KeepAlive 和调整超时)。如果需要实时处理流式响应,使用 Regular Expression Extractor 或自定义脚…...
Linux磁盘情况查询
一、查询系统整体磁盘使用情况 1、基本语法 df -h 2、示例 二、查询指定目录的磁盘占用情况 1、基本语法 du -h 查询指定目录的磁盘占用情况,默认为当前目录 2、常用选项 选项 说明 -h 以人类可读的格式显示磁盘使用情况(例如,KB、…...
数据库原理3
1.在SQL中,外模式对应于试图(VIEW)和部分基本表;模式对应于基本表;内模式对应于存储文件。 2.FETCH:实施游标推进 3.数据操纵:insert,update,delete 数据控制:grant,revoke 数据定义:create,drop,alter 4.物理结构…...
【3D格式转换SDK】HOOPS Exchange技术概览(二):3D数据处理高级功能
在当今数字化工程领域,HOOPS Exchange作为一款强大的SDK,为3D工程应用程序的开发提供了关键支持。本文将深入剖析其基本组件、特定功能以及数据结构,带您全面了解这一驱动3D数据处理的核心工具。 一、概述 HOOPS Exchange专注于访问和重…...
利用Adobe Acrobat 实现PPT中图片分辨率的提升
1. 下载适用于 Windows 的 64 位 Acrobat 注册方式参考:https://ca.whu.edu.cn/knowledge.html?type1 2. 将ppt中需要提高分辨率的图片复制粘贴到新建的pptx问价中,然后执行“文件—>导出---->创建PDF、XPS文档” 3. 我们会发现保存下来的distrib…...
Python frozenset介绍
在 Python 中,frozenset 是一种不可变(immutable)的集合类型,它是 set 的不可变版本。与普通的 set 类型不同,frozenset 的内容一旦创建就不能被修改,这使得它在某些场景下非常有用。 1. 特点 不可变性&am…...
docer swarm集群部署springboot项目
1.准备两台服务器,安装好docker、docker-compose 因为用到了docker仓库,安装harbor,可以从github下载离线安装包 2. 我这边用到了gitlab-ci,整体流程也都差不多 1)打包mvn clean install 2)打镜像 docker-compose -f docker-compo…...
Elasticsearch:解锁深度匹配,运用Elasticsearch DSL构建闪电般的高效模糊搜索体验
目录 Elasticsearch查询分类 叶子查询 全文检索查询 match查询 multi_match查询 精确查询 term查询 range查询 复杂查询 bool查询简单应用 bool查询实现排序和分页 bool查询实现高亮 场景分析 问题思考 解决方案 search_after方案(推荐) point in time方案 方案…...
解决局域网访问Dify却仅显示nginx页面的问题
为什么dify在本机可以正常访问,局域网通过ip访问却只看到欢迎使用nginx的提示,如果访问服务器ip/apps则直接提示404 Not Found。这是怎么回事该如何解决呢?文章中将一步步解决这些问题。 前言 之前在服务器部署了dify,也在服务器…...
deepseek思考,谁是下一个deepseek?
这两天连续看了两篇某B站up关于AI的分析,也是感触很多 讲得内容咱先不说,讲得是真好。怎么说呢,就“活该人家能赚到钱”就对了。 第一篇,他说了一个事儿,就是AI未来的趋势,1000天内,代替世界上…...
从小米汽车召回看智驾“命门”:智能化时代 — 时间就是安全
2025年1月,小米因车辆“授时同步异常”召回3万余辆小米SU7,成为其造车历程中的首个重大安全事件。 从小米SU7召回事件剖析,授时同步何以成为智能驾驶的命门? 2024年11月,多名车主反馈SU7标准版的智能泊车辅助功能出现…...
OpenAI 最后一代非推理模型:OpenAI 发布 GPT-4.5预览版
最后一代非推理大模型 在人工智能领域,OpenAI 一直以其创新的技术和卓越的产品引领着行业的发展。近期,OpenAI 正式发布了 GPT-4.5 研究预览版。不仅如此,官方还宣称 GPT-4.5 被定位为 “最后一代非推理模型”,这一消息再次引起了…...
React Native国际化实践(react-i18next)
React Native国际化实践 一、主流国际化方案选择 react-i18next react-native-localize react-i18next:功能强大的国际化框架,支持复数、插值、嵌套等复杂语法,且与React无缝集成。react-native-localize:用于获取设备语言和地区…...
ioday2----->标准io函数
思维导图: 练习: 1将当前的时间写入到time. txt的文件中,如果ctrlc退出之后,在再次执行支持断点续写 1.2022-04-26 19:10:20 2.2022-04-26 19:10:21 3.2022-04-26 19:10:22 //按下ctrlc停止,再次执行程序 4.2022…...
竞争只属于失败者
“竞争只属于失败者”这一观点源自知名投资人、PayPal联合创始人彼得蒂尔(Peter Thiel)。他在斯坦福大学的创业课程中提出,成功的企业应追求垄断地位,而非陷入激烈的市场竞争。蒂尔认为,垄断使企业能够专注于长期发展和…...
【代码分享】基于IRM和RRT*的无人机路径规划方法详解与Matlab实现
基于IRM和RRT*的无人机路径规划方法详解与Matlab实现 1. IRM与RRT*的概述及优势 IRM(Influence Region Map)通过建模障碍物的影响区域,量化环境中的安全风险,为RRT算法提供启发式引导。RRT(Rapidly-exploring Random…...
深度学习代码解读——自用
代码来自:GitHub - ChuHan89/WSSS-Tissue 借助了一些人工智能 2_generate_PM.py 功能总结 该代码用于 生成弱监督语义分割(WSSS)所需的伪掩码(Pseudo-Masks),是 Stage2 训练的前置步骤。其核心流程为&a…...
