【YashanDB知识库】存储过程报错snapshot too old

news/2024/12/28 5:03:56/文章来源:https://www.cnblogs.com/YashanDB/p/18305654

问题描述

20231127上午客户反馈绩效系统20231125、20231126出现2次YAS-02020 snapshot too old的问题,测试也有类似问题。

该过程是客户新增的存储过程,目的是通过PRO_RUN_JOB作为主控,调度其他存储过程,后续不用其他调度引擎。

原因分析

错误信息收集分析

分析存储过程报错日志,核查UNDO_RETENTION、undo表空间

看了相应的优化建议,可以增大参数UNDO_RETENTION的值,或者使用更大的undo表空间。

客户环境目前UNDO_RETENTION配置了600,该参数单位是秒。临时修改客户测试环境的配置为3000,试图规避问题。

正常理解,MVCC用于高并发的情形,会出现该错误,而该存储过程执行是串行的,不符合预期!需要继续分析。

UNDO、MVCC机制分析

了解背后机制,snapshot too old是由于db需要做多版本控制(mvcc),在数据commit之后,仍然会保留undo一段时间,在超过这段时间之后undo的空间会被复用,如果需要还原的数据超过了这个时间,则还原不了,触发该错误。

崖山db快照隔离级别的核心就是MVCC(Multi-Version Concurrency Control),多版本并发控制

快照本质上就是一个时间点。记录版本的时间点为事务提交的时间点。

可见性可分为2类情况:

1、事务内的语句可见性

2、事务间的可见性

由于老版本保留时间的限制,我们可能无法读取到某些很老的版本,这时就会有snapshot too old错误。

事务功能梳理 - YashanDB

可以确认:

  • 不同事务间,特别是长查询,容易出现该问题;

  • 另一个是专门的快照读,如Oracle的快照读select count(*) from tableA as of timestamp to_timestamp('2013-10-16 08:46:57','yyyy-mm-dd hh24:mi:ss');

疑点一

分析测试环境出现过类似的问题,看到报错的时间点:

2023/11/23 13:21:52执行的是PRO_DAILY_DPSIT

2023/11/23 12:04:00执行的是PRO_SYS_USER_POST_REL

有个共同点:

PRO_SYS_USER_POST_REL用的是merge,同时读和写同个表

PRO_DAILY_DPSIT用的是insert into select,insert 和select的表有相同的

开始怀疑这里有并发机制,读写自同个表,但是作为同个事务内的,undo不应该被释放掉,不符合预期!

确认问题

剩下的就是长查询的可能。只有在查询的时候才会报这个错误,update的时候是不会报这个错误的。

继续分析游标loop的结果,如果在游标读取的时候报错,则remark也是:更新跑数任务明细表:单个任务成功结束的相关信息

fetch在一开始就拿到scn(SCN即系统改变号(System Change Number)),每次fetch都用的open时的scn,由于loop过程中还是update RUN_JOB_DETA表更新了db存储的某一个block,commit之后undo的数据会保留undo_retention的时间,当超过这个时间undo的空间会别其他任务复用。

而一个block不止一条数据,在后续loop的过程,如果继续读取到这个block的数据,需要对这个block还原到scn对应的状态再读取,由于undo已经被复用,就会报snapshot too old的错误。

undo机制、MVCC机制,在Oracle、DB2中都是有的,该问题也会存在。崖山的数据块不会存2个表的数据,可以使用下面方法规避:

PRO_RUN_JOB这个存储过程使用游标读取RUN_JOB_DETA表做为配置表,loop过程中需要更新的结果数据放到历史表(主要更新任务状态,开始、结束时间,耗时),配置表和历史结果分开存储,彻底解决问题。

经验教训

  • Undo机制中,undo_retention是一个不容易理解的参数项。设置之后,Oracle会根据自动undo管理的原则进行调节,进行空间拓展,来适应实现用户的期间要求。而崖山db需要根据实际的业务频繁度和数量量、以及undo表空间设置情况进行综合评估。

  • 存储过程存在游标遍历,需要注意更新目标表不是fetch的表,否则存在类似问题。

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

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

相关文章

DeepVT论文阅读笔记

DeepVT: Deep View-Temporal Interaction Network for News Recommendation论文阅读笔记 Abstract 存在的问题: ​ 以往的研究大多只是直接应用新闻层面的表征进行用户建模,新闻的标题、摘要、分类等观点只是被隐含和压缩到新闻的单一向量中,这就使得不同新闻中的不同观点无…

直播预约丨《指标体系建设实战》第四期:如何构建全面的指标管理体系

指标是反映企业的各项核心业务活动、管理成效的数据体系,指标体系作为联结业务逻辑与数据实体的关键桥梁,是构建高质量数据统计的基础单元,并在量化业务绩效和效果评估中扮演着核心角色。 为了更好地服务于客户并提供切实可行的实践指导,自4月24日起,袋鼠云将推出全新《指…

shr不能创建出差单可能存在的问题

shr不能创建出差单可能存在的问题时间冲突 OTP设置问题​​

暑期集训shellcode5(手搓机器码)

拖进ida里面反汇编再让人工智能分析(我是废物)(后来给源码了,直接上源码) #include <string.h> #include <stdio.h> #include <stdlib.h> #include <inttypes.h> #include <capstone/capstone.h> #include <sys/mman.h>int upkeep() …

MySQL学习笔记——索引

索引 0.前言 本文是跟着网课学习的时候随手记录的一篇关于MySQL索引的学习笔记 1.索引概述 1.1.索引介绍 索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足 特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样…

快速部署 HBase 测试环境

快速部署 HBase 测试环境 第一步:下载软件,在HBase官网下载最新版, 找到 bin,点击下载,比如我这里下载的是 hbase-2.5.6-bin.tar.gz 第二步:解压软件 $ tar -zxvf hbase-2.5.6-bin.tar.gz $ cd hbase-2.5.6第三步:启动软件 $ ./bin/start-hbase.sh $ ./bin/hbase-daemon…

【YashanDB知识库】用户密码带@字符时exp和imp无法使用

【问题分类】数据导入导出 【关键字】YAS-00404、数据导入导出、密码、特殊字符@、exp、imp 【问题描述】 当用户密码带@字符时,使用exp和imp导入导出数据,使用转义符仍然出现报错且yasql可以使用相同的转义方式正常登录 【问题原因分析】exp和imp的密码没有适配特殊字符 【解…

写了一个json小工具,希望大家体验(Mac平台)

用rust写了一个json小工具“JSON PICKER”,欢迎大家试用:https://github.com/davelet/json-picker/releases/tag/V0.2动机是平常开发的时候,经常遇到大段json,里面的很多字段是不需要的。我所在的项目组在接口对接上出现了reponse达到数兆字节的情况市面上已经有不少json工…

Go微服务开发指南

在这篇深入探讨Go语言在微服务架构中的应用的文章中,我们介绍了选择Go构建微服务的优势、详细分析了主要的Go微服务框架,并探讨了服务发现与注册和API网关的实现及应用。关注TechLead,复旦博士,分享云服务领域全维度开发技术。拥有10+年互联网服务架构、AI产品研发经验、团…

共享库soname机制

介绍共享库soname命名机制目录前言共享库版本号共享库命名机制realnamesonamelinkname总结参考文章 前言 在使用第三方库时,我们会发现第三方库会提供一组文件,他们的后缀一般是.so(如libname.so),.so.x和.so.x.y.z。本文讨论他们之间的关系。 共享库版本号 共享库一般会由…

idea打开/导入maven项目 + 移除

——————如何导入 方法1———— 右侧maven——》点击加号找到要但如项目的pom.xml文件——》ok 方法2———— file——》project structure……modeles——》加号 import module 找到要导入项目的pom.xml文件——》ok 右下角apply——》ok 这两个方法都可以导入 ———…

抢占智能驾驶“智高点”,仿真测试或将是必备的“加速剂”

​在智能驾驶系统的开发中,参考V模型开发流程,仿真测试通常包含多个阶段:MIL(模型在环)—— 用于验证理论模型,软件在环(SIL)—— 测试软件组件,硬件在环(HIL)—— 集成硬件组件进行测试,车辆在环(VIL)—— 模拟车辆与环境的交互,以及实车道路测试(包括封闭场地…