【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*) ...
随机推荐
- Java开发常见问题分析和处理方案
程序Bug的产生,通常分为三种类型 逻辑漏洞: 低级错误,程序执行后无法达到想要效果. 越界访问: 访问了非法区域,造成程序崩溃. 条件考虑不全面: 你以为你万无一失,但你永远都不知道输入参数究竟是什 ...
- idea 提交代码到GitHub
配置账户 配置Git安装目录 一般默认识别,其他参数不变 配置GitHub账户 提交到GitHub 1.VCS->import into version control -> share ...
- mysql大数据表添加字段
方案一.老表数据迁移四部曲方案1.新建老表t_order_goods的备份表t_order_goods_bak,同时加一个字段:isVirtual 并给默认值2.迁移老表t_order_goods数据 ...
- Python 基于win32com客户端实现Excel操作
测试环境 Python 3.6.2 代码实现 非多线程场景下使用 新建并保存EXCEL import win32com.client from win32api import RGB def save ...
- Aug. 2024 杭二训练游记
\(\text{前言}\) 我在 \(\text{Aug. 6th}\) 到 \(\text{Aug. 25th}\) 在杭州某知名中学集训,但是我亲爱的母亲却在一开始告诉我是 \(\text{Aug ...
- 怎么使用github action定时运行js脚本?
github action是使用yaml文件来做到CI/CD的,文件位置存放在 .github/workflows,yaml文件内容如下: name: ncatest.cx.js on: push: ...
- 2023/4/16 SCRUM个人博客
1.我昨天的任务 大体学习并了解初始化pyqt5的一些可视化问题 2.遇到了什么困难 对于py的字典使用 3.我今天的任务 学习了easydict库的基本操作
- Codeforces Round 953 (Div. 2)
Codeforces Round 953 (Div. 2) 闲来无事水题解. A . B . C 显然 \(k\) 是偶数.考虑 \(k\) 的上界,\(p_{1}=n,p_{n}=1\),产生 \( ...
- browsermob-proxy-2.1.4启动失败,报错ProxyServerError: The Browsermob-Proxy server process failed to start
报错信息:ProxyServerError: The Browsermob-Proxy server process failed to start. Check <_io.TextIOWrap ...
- 修复ERROR 1045 (28000): Access denied for user 'root'@'%' (using password: YES)
修复ERROR 1045 (28000): Access denied for user 'root'@'%' (using password: YES) 直接修改 mysql.user 表中的权限字 ...