ORA-01555 原因与解决:

前面提到了ORA-01555错误,那么现在来看一下ORA-01555错误是怎样产生的。由于回滚段是循环使用的,当事务提交以后,该事务占用的回滚段事务会被标记为非活动,回滚段空间可以被覆盖重用。那么一个问题就出现了,如果一个查询需要使用被覆盖的回滚段构造前镜像实现一致性读,那么此时就会出现Oracle著名的ORA-01555错误。

ORA-01555错误的另外一个原因是因为延迟块清除(Delayed Block Cleanout)。当一个查询触发延迟块清除时,Oracle需要去查询回滚段获得该事务的提交SCN,如果事务的前镜像信息已经被覆盖,并且查询SCN也小于回滚段中记录的最小提交SCN,那么Oracle将无从判断查询SCN和事务提交SCN的大小,此时出现延迟块清除导致的ORA-01555错误。

另外一种导致ORA-01555错误的情况出现在使用sqlldr直接方式加载(direct=true)数据时。当通过sqlldr direct=true 方式加载数据时,由于不产生重做和回滚信息,Oracle直接指定Cached Commit SCN 给加载数据,在访问这些数据时,有时会产生ORA-01555错误。

看下图的描述:假定在时间T用户A发出一条更新语句,更新SCOTT用户的SAL;用户B在Ty时间发出查询语句,查询SCOTT用户的SAL;用户A的更新在Tx时间提交,提交可能为快速提交块清除,也可能是延迟块清除;用户B的查询在Tz时间输出。

来看一下数据库在不同情况下的内部处理:

·如果 Ty < T < Tz < Tx ,那么查询需要构造一致性读,由于事务尚未提交,可以通过回滚段构造前镜像,完成一致性读取。
·如果 Ty < T < Tx < Tz ,由于Ty查询时间小于T事务更新时间,那么数据库需要构造一致性读取,而Tz查询完成时间大于Tx提交时间,那么前镜像就有可能被覆盖,不可获取。

如果Tx的提交方式为Fast Block Cleanout,那么回滚段信息不可用时就会出现一致性读ORA-01555错误。

如果Tx的提交方式为Delayed Block Cleanout,那么回滚段信息不可用时Oracle将无法判断Ty和Tx的时间先后关系。如果 Ty > Tx ,那么Oracle可以正常进行块清除,并将块清除后的数据返回给用户B;如果 Ty < T ,那么Oracle需要继续构造一致性读返回给用户B;Oracle无法判断这两种情况,就会出现延迟块清除ORA-01555错误。

ORA-01555的直观解释是“snapshot too old”,也就是快照太旧,其根本含义就是查询需要的前镜像过于“久远”,已经无法找到了。可以想象,如果一个历时数个小时或十几个小时的查询,如果最后遭遇ORA-01555错误而失败,会是多么令人沮丧的一件事。一直以来,ORA-01555都是ORACLE最为头痛的问题之一。

在Oracle 9i的文档中这样描述ORA-01555错误:

01555, 00000, "snapshot too old: rollback segment number %s with name \"%s\" too small"
// *Cause: rollback records needed by a reader for consistent read are
//         overwritten by other writers
// *Action: If in Automatic Undo Management mode, increase undo_retention
//          setting. Otherwise, use larger rollback segments

可以看到,在Oracle 9i自动管理UNDO表空间模式下,UNDO_RETENTION参数的引入正是为了减少ORA-01555错误的出现。这个参数设置当事务提交之后(回滚段变得非活跃),回滚段中的前镜像数据在被覆盖前保留的时间,该参数以秒为单位,9iR1初始值为900秒,在Oracle 9iR2增加为10800秒。

显然该参数设置的越高就越能减少ORA-01555错误的出现,但是保留时间和存储空间是紧密相关的,如果UNDO表空间的存储空间有限,那么Oracle就会选择回收已提交事务占用的空间,置UNDO_RETENTION参数于不顾。

在Oracle 9i的AUM模式下,UNDO_RETENTION实际上是一个非担保(NO Guaranteed)限制。也就是说,如果有其他事务需要回滚空间,而空间出现不足时,这些信息仍然会被覆盖;从Oracle 10g开始,Oracle对于UNDO增加了Guarantee控制,也就是说,可以指定UNDO表空间必须满足UNDO_RETENTION的限制。当UNDO表空间设置为Guarantee,那么提交事务的回滚空间必须被保留足够的时间,如果UNDO表空间的空间不足,那么新的事务会因空间不足而失败,而不是选择之前的覆盖。

从各个不同版本回滚段的管理变迁,我们可以看出Oracle一直在进步。

Oracle提供了一个内部事件(10203事件)可以用来跟踪数据库的块清除操作,10203事件可以通过以下命令设置,设置后需要重新启动数据库该参数方能生效:

alter system set event="10203 trace name context forever" scope=spfile;

需要注意的是,可能存在另外一种情况,就是当执行延迟块清除时,回滚段或原回滚表空间已经被删除,此时Oracle仍然可以通过字典表UNDO$来获得SCN信息,执行块清除。

关于Oracle的提交处理及块清除机制是一个极其复杂的过程,本文对这部分内容进行了适当简化说明,旨在使大家能够对Oracle的回滚机制、块清除机制有所了解。

转载于:https://blog.51cto.com/netmantgq/1187047

ORA-01555 原因与解决相关推荐

  1. ORA-00911错误及解决方法(另附所有ora错误原因及解决方法 网址)

    今天在项目中遇到一个头疼的问题,Oracle数据库报告:ORA-00911错误.问题如下: 但是我在PL/SQL Developer中执行明明没有问题!!! 问题出在哪里??? 纠结了我很久,后来发现 ...

  2. oracle错误号大全(查询ora错误号以及解决方法技巧)

    oracle 查询ora错误号以及解决方法技巧 racle 错误号以及解决方法技巧 经常有朋友问我ORACLE 类似ora-00109 错误的信息,其实我们的ORACLE系统本身已经为我们详细的说明了 ...

  3. oracle服务没有了 原因,一例oracle服务无法启动的原因及解决方法

    摘要 腾兴网为您分享:一例oracle服务无法启动的原因及解决方法,智慧农业,月星家居,余额宝,万达普惠等软件知识,以及企鹅精灵,滴滴专车司机版,c4d导入3dmax,阿纯优品,小飞兔,我没有表情包, ...

  4. 计算机的网络端口管理器,Win7设备管理器没有端口选项的三大原因及解决措施...

    最近有朋友反应Win7系统中的设备管理器中没有端口选项,也就是COM和LPT都没有,导致一些设备无法连接,这时候该怎么办呢?如何解决Win7没有端口选项的问题?下面小编告诉大家三种导致设备管理器没有端 ...

  5. 内存溢出和内存泄漏的定义,产生原因以及解决方法(面试经验总结)

    一.定义(概念与区别) 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请 了一个integer,但给它存了long才能存 ...

  6. oracle library cache lock,【案例】Oracle等待事件library cache lock产生原因和解决办法...

    [案例]Oracle等待事件library cache lock产生原因和解决办法 时间:2016-12-07 18:56   来源:Oracle研究中心   作者:网络   点击: 次 天萃荷净 O ...

  7. 服务器越来越慢的原因及解决办法

    随着各种主机产品的推出,服务器出现的问题各式各样,由于虚拟主机都是同时运行,便会对服务器产生过大的压力,从而导致服务器的速度越来越缓慢,下面和大家分享一下服务器越来越慢的原因及解决办法. 1.虚拟主机 ...

  8. dos系统不能安装python模块,无法使用pip命令安装python第三方库的原因及解决方法...

    再dos中无法使用pip,命令主要是没有发现这个命令.我们先找到这个命令的位置,一般是在python里面的scripts文件夹里面.我们可以把dos切换到对应的文件夹,再使用pip命令就可以了. 如果 ...

  9. iis 无法连接mysql_远程无法连接SQL2000及MySQL的原因和解决办法

    远程无法连接SQL2000及MySQL的原因和解决办法 时间:2019-11-10 11:06 1. 没有在数据库管理面板中设置远程连接IP造成的. 说明:为了提高操作系统的安全性,所有使用了星外安全 ...

最新文章

  1. 百度嵌入式深度学习框架Paddle-Mobile介绍
  2. linux中double大小,linux 下 float 和 double 精度计算差别
  3. python的用途实例-python中类方法,实例方法,静态方法的作用和区别
  4. delete,drop,truncate 区别
  5. 中国航空航天产业创新发展态势及市场规模分析报告2021-2027年版
  6. Spark1.3.0安装
  7. toolchain安装教程支持_树莓派安装ESP8266_SDK开发环境
  8. .net core 不启用 https_.NET 应用如何优雅的做功能开关(Feature Flag)
  9. Ubuntu12.04 内核树建立
  10. html的表单图形验证码怎么做,django中简单图形验证码实现
  11. kb4023057安装失败_微软重发Win10 KB4023057 补丁,推动Win10更新
  12. 我选择的是一种生活态度
  13. linux之awk使用技巧
  14. Uva - 816 - Abbott's Revenge
  15. 安卓手机解锁密码忘了如何解锁
  16. 【mediasoup 带宽估计】aimd算法2 : AimdRateControl
  17. 手里有的资料,百度云连接在最前面,拿走记得点赞
  18. 京东首页之nav导航栏、banner广告部分、footer备案号
  19. 智己汽车,兼顾豪华舒适和操控性能
  20. 计算机上无线网络开关在哪里,笔记本电脑的无线网开关在哪里打开

热门文章

  1. hdu 5783——Divide the Sequence
  2. Redis源码分析(零)学习路径笔记
  3. 【剑指offer】_10二叉树和为某一路径值
  4. 括号匹配问题(c和c++版本实现)
  5. C++继承详解三 ----菱形继承、虚继承
  6. 内核的Makefile与Kconfig关系解析
  7. Linux进程通信之文件
  8. timerfd API使用总结
  9. 【第十六章】模板实参推断
  10. community 计算模块度_光模块深度:国内光模块企业快速崛起