【YashanDB数据库】大事务回滚导致其他操作无法执行,报错YAS-02016 no free undo blocks
问题现象
客户将一个100G的表的数据插入到另一个表中,使用insert into select插入数据。从第一天下午2点开始执行,到第二天上午10点,一直未执行完毕。
由于需要实施下一步操作,客户kill重启了数据库,之后数据库一直回滚中,导致后续执行其他操作都报错YAS-02016 no free undo blocks
问题单:大sql的undo回滚导致任何操作都无法执行,需要优化
问题的风险及影响
客户环境为准生产环境,影响业务执行。
问题影响的版本
YashanDB版本:22.2.11.100
问题发生原因
1、UNDO没有做调整,最大为64GB,insert单个表超过100GB,UNDO空间不足导致卡死。
2、由于kill导致重启对insert into select 做回退,rollback过程不能做truncate操作,UNDO空间需要rollback完成之后才能释放,由于索引导致rollback比较慢,UNDO一直不能释放,进而导致执行不了其他SQL。
解决方法及规避方式
1、删除索引,加快rollback
2、线上操作需要避免出现大事务,使用imp、yasldr等工具分批提交,或者在insert into select中添加where条件,分批提交。
3、执行数据迁移过程,规划好UNDO空间。
4、导入数据过程先去掉索引,待数据导入完之后重建索引。
问题分析和处理过程
核查相应参数:
机器配置为16核64g
UNDO_RETENTION为300
STARTUP_ROLLBACK_PARALLELISM 为2
V$ROLLBACK为空
UNDO文件为64G
user_segments中目标表的segment大小约100G
表一共493752518行,数据量大
CHECKPOINT_INTERVAL=100000、CHECKPOINT_TIMEOUT=300为默认值
尝试添加UNDO数据文件:不成功
返回报错,报错信息YAS-02042 cannot execute tablespace DDL when the database is rolling back。由于数据库被kill重启, 该报错是正常的。
分析是否需要调整回退线程数量:不需要
STARTUP_ROLLBACK_PARALLELISM可以在数据库启动的时候决定回退线程数量,并启动相应的回退线程。从CPU的情况看,消耗很低, 瓶颈不在rollback线程, 调整需要重启,决定不调整该参数。
尝试调整UNDO保留时间:效果不明显
已提交事务的UNDO会变为可回收,为了减少已提交事务占用较多空间,强制所有提交的事务立即写入数据文件,执行了如下操作:
alter system set UNDO_RETENTION = 3;
ALTER SYSTEM CHECKPOINT;
操作后,UNDO表空间使用没有明显减少
联系客户删除索引,待数据导入完成之后再重建索引,效果明显
查看IOSTAT,结果: 读20+M/s, 写400K/s。写入数据相对较慢, 检查表目标表DDL, 存在较多索引。
删除后IO读20+M/s, 写4M/s,写速度明显提升, 20分钟后客户反馈rollback完成。
分析执行其他操作报错原因
检查UNDO表空间大小,确认最大值是64G,这也解释了为什么一个事务rollback影响后续其他业务执行都报错YAS-02016 no free undo blocks, 是因为UNDO表空间满了,在rollback完成之前不会释放。
UNDO空间大小有默认安装参数,在没有修改的情况下最大值是64G, 虽然会自动扩展, 但是在到达最大值之后,不会再扩展。
和客户确认是没有做过修改, 核查V$datafile视图, 最大值确认是64G
https://doc.yashandb.com/yashandb/22.2/zh/工具手册/yasboot/建库参数.html

重新执行数据插入
客户在rollback之后添加多2个UNDO表空间文件, 扩大UNDO的空间扩展上限,同时修改插入语句,分批插入数据,避免大事务。
经验总结
1、数据写入、rollback过程,需要对索引做相应的修改,为了加快速度,可以先删除或把索引设置为UNUSABLE,待完成之后再建索引,或rebuild索引。
2、线上操作要避免出现大事务,使用imp、yasldr等工具分批提交,或者在insert into select 中添加where条件,分批提交。
3、执行数据迁移过程,规划好UNDO空间。UNDO空间大小默认最大值是64G,虽然会自动扩展,但是在到达最大值之后,不会再扩展,可以修改最大值限制,或添加数据文件。
【YashanDB数据库】大事务回滚导致其他操作无法执行,报错YAS-02016 no free undo blocks的更多相关文章
- Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
1. 添加一个新对象 前面介绍了映射到实体表的映射类User,如果我们想将其持久化(Persist),那么就需要将这个由User类建立的对象实例添加到我们先前创建的Session会话实例中: 复制代码 ...
- mysql分类和事务回滚
主要内容: ***数据定义语言DDL重点 ***数据操纵语言DML重点 数据查询语言DQL重点 ---事务控制语言TCL ---数据库控制语言DCL ---主键(primary key) ---数据冗 ...
- thinkphp curd的事务回滚 一看就会
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qq1355541448/article/details/32314403 /** ...
- Try-Catch包裹的代码异常后,竟然导致了产线事务回滚!
导读:一段被try-catch包裹后的代码在产线稳定运行了200天后忽然发生了异常,而这个异常竟然导致了产线事务回滚.这期间究竟发生了什么?日常在项目过程中该如何避免事务异常?就在这个时候,老板拿着 ...
- mysql数据库 索引 事务和事务回滚
mysql索引 索引相当于书的目录优点:加快数据的查询速度缺点:占物理存储空间,添加,删除,会减慢写的速度 查看表使用的索引 mysql> show index from 表名\G;(\G分行显 ...
- ThinkPHP 实现数据库事务回滚示例代码
ThinkPHP提供了数据库的事务支持,如果要在应用逻辑中使用事务,可以参考下面的方法: 启动事务: $User->startTrans(); 提交事务: $User->commit( ...
- 【Java EE 学习 19】【使用过滤器实现全站压缩】【使用ThreadLocal模式解决跨DAO事务回滚问题】
一.使用过滤器实现全站压缩 1.目标:对网站的所有JSP页面进行页面压缩,减少用户流量的使用.但是对图片和视频不进行压缩,因为图片和视频的压缩率很小,而且处理所需要的服务器资源很大. 2.实现原理: ...
- [转] C# mysql 事务回滚
什么是数据库事务 数据库事务是指作为单个逻辑工作单元执行的一系列操作. 设想网上购物的一次交易,其付款过程至少包括以下几步数据库操作: · 更新客户所购商品的库存信息 · 保存客户付款信息--可能包括 ...
- C#使用SqlTransaction事务回滚与SqlBulkCopy批量插入数据
C#中批量处理数据,有时候因为一条记录导致整个批量处理失败.这时候肯能会导致数据不全等问题,这时候我们可以使用SqlTransaction来进行事务回滚,即是要么全部成功要么全部不成功.如下代码 // ...
- Spring异常抛出触发事务回滚
Spring.EJB的声明式事务默认情况下都是在抛出unchecked exception后才会触发事务的回滚 /** * 如果在spring事务配置中不为切入点(如这里的切入点可以定义成test*) ...
随机推荐
- 基础篇:Stable Diffusion 基础原理详述
[基础篇]Stable Diffusion 基础原理详述 前言 我认为学习 ComfyUI 应该先从理论学起. 与传统绘图工具(如 Photoshop 或 Figma)相比,AI 绘图工具有着显著不同 ...
- tp6 uniapp跨越问题
自己写一个简单的中间件
- django 信号判断是新增、修改还是删除
在Django的信号处理器中,你可以使用一些方法来确定信号是关于新增(create).修改(update)还是删除(delete)的.这通常涉及到检查 created 和 instance 参数的值. ...
- [oeasy]python0135_变量名与下划线_dunder_声明与赋值
变量定义 回忆上次内容 变量 就是 能变的量 上次研究了 变量标识符的 规则 第一个字符 应该是 字母或下划线 合法的标识符可以包括 大小写字母 数字 下划线 还研究了字符串(str)的函数 ...
- oeasy教您玩转vim - 64- # 参数argument
参数argument 回忆上次 上次了解了 窗口 window 窗口是用来装缓冲buffer的 buffer是在内存里面加载的硬盘文件 窗口的切分 :sp[lit] 水平切分 :vsp[lit] ...
- 服务端渲染中的数据获取:结合 useRequestHeaders 与 useFetch
title: 服务端渲染中的数据获取:结合 useRequestHeaders 与 useFetch date: 2024/7/24 updated: 2024/7/24 author: cmdrag ...
- android常用布局基础学习
总结:可水平放置可垂直放置也可穿插使用,默认为水平 <!--我在第一次使用权重的时候忽视了本线性布局中的宽度与高度,如果要使用权重,请将线性布局的最初大小设置为match_parent,否则不会 ...
- 一文带你了解CAP的全部特性,你学会了吗?
目录 前言 消息发布 携带消息头 设置消息前缀 原生支持的延迟消息 并行发布消息 事务消息 事务消息发送 事务消息消费 事务补偿 消息处理 序列化 过滤器 消息重试 多线程处理 自动恢复/重连 分布式 ...
- 【IDEA】转大小写快速操作
需求场景: 快速修改一些字符全部变成大写,或者小写 例如修改SQL语句,部分字段大写,部分字段小写,需要统一 快捷键: [Ctrl + Shift + U] 演示案例: SELECT ( (SELEC ...
- 【Vue】07 Webpack Part3 Loader
Loader是Webpack的核心概念: 除了JS文件以外我们还有CSS,图片,包括一些ES6规范的代码 或者是TypeScript各种前端类型的文件 但是最终必须统一转换成JS文件,Webpack本 ...