ora-01555错误浅析

ora-01555错误浅析

ID:16294966

大小:165.50 KB

页数:21页

时间:2018-08-09

ora-01555错误浅析_第1页
ora-01555错误浅析_第2页
ora-01555错误浅析_第3页
ora-01555错误浅析_第4页
ora-01555错误浅析_第5页
资源描述:

《ora-01555错误浅析》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、ORA-01555错误浅析ORA-01555(快照过旧)问题让很多人感到十分头痛。最近我们的生产系统上也报出了ORA-01555错误。就结合这次案例将ORA-1555问题作个案例分析,并浅析产生原因和各种解决办法。如果要了解1555错误产生的原因,就需要知道ORACLE的两个特性:一致性读(ConsistentGet)和延迟块清除(DelayedBlockCleanout)。此外,还要知道关于回滚段的一些配置参数。相关参数先看下Oracle中关于UNDO有哪些配置参数:SQL>showparameterundoNAMETYPEVALUE---------------

2、-------------------------------------------------undo_managementstringMANUALundo_retentioninteger900undo_suppress_errorsbooleanFALSEundo_tablespacestringUNDOTBS1undo_management回滚段的管理方式。值可以为MANUAL/AUTO。9i中默认是MANUAL,10g中默认是AUTO。从9i后,回滚段就以表空间的形式管理,并且支持系统自动管理回滚段。一个回滚表空间上可以创建多个回滚段,一个数据库可以创建

3、多个回滚表空间。但是,一个实例(Instance)只能使用一个回滚表空间。如果undo_management设置为MANUAL,就是手动创建回滚段:SQL>createrollbacksegmentundo1tablespaceUNDOTBS1;如果设置为AUTO,Oracle就自动管理回滚段的创建,而手工创建就会失败。undo_retention这个参数设置回滚段中的被提交或回滚的数据强制保留时间,单位是秒。请注意,这个参数和1555错误有非常大的关系。但是,需要提醒的是,并不是回滚段中的数据超过这个时间以后就会被清除掉,而是等到后面事务产生的回滚数据覆盖掉“超期

4、”数据。所以这就是为什么我们往往看到系统的回滚表空间占有率始终是100%的原因了。undo_suppress_errors是否报与回滚段有关的错误。如果为FALSE,就不会产生与回滚段有关的错误。但是,请注意,并不是不会发生回滚段错误,而只是屏蔽错误信息,错误发生了就会存在滴。在10g中,这个参数是隐含参数。undo_tablespace为每个实例制定的唯一当前使用的回滚段表空间。一致性读(ConsistentGet)一致性读(ConsistentGet)可以说是产生1555错误的主要原因。但它的确是Oracle一个非常优秀的特性。既然这个特性会产生这么烦人的错误,

5、我为什么还说它是ORACLE十分优秀的特性呢?下面就先了解一下这个特性:并发事务和脏读需要先了解一下这一特性的产生的背景原因。看下以下这个例子。在一个银行系统中(一般涉及到钱的问题对并发事务要求是最严格的^_^),会计正在统计当月某地区的个人存款总额,她的这个操作,在后台肯定要产生一条SQL语句,对这一地区的所有用户的存款额作SUM(),我们假设这一操作产生的语句为A,时间点是T1。由于存款用户非常多,再加上会有一些对其他表的JOIN条件,语句A的执行时间可能比较长。这时,在A的执行过程中,A已经统计了账户X的钱,但还没有统计到账户Y的钱的时候,正好有一个客户通过A

6、TM机从账户X中转250元钱到帐户Y,他的操作也产生了一条语句B,对存款表进行更新。开始时间点是T2,结束时间是T3。因为只更新两条记录,这个过程非常短。A结束时的时间点是T4。让我们看下过程图,看看会产生什么结果:从图中,我们可以看到,T2时刻A已经统计过帐户X中的钱,但在这时B从X中转了250元到帐户Y中,在B结束的时刻T3,A还没有统计到Y,但Y已经多出了250元了,所以到T4,统计结束时,A实际上多统计出250元。这就是并发事务中的“脏读(dirtyread)”问题。在标准SQL中,为了防止并发事务中产生脏读,就需要通过加锁来控制。这样就会带来死锁、阻塞的问

7、题,即时是粒度最小的行级锁,也无法避免这些问题。再看下上面这个例子。为了防止脏读,A在开始时就需要对表加锁,防止其他事务更新表。这样,B就会被阻塞,假如A事务要执行1个小时,B可能最长就要被阻塞1个小时(如果你是那个倒霉的客户,可能早就***骂出来了)。再看下图,从图中,可以看到,B开始时,存款表被加锁了,所以B被A阻塞,只有等A释放锁以后,B才能更新表。所以B被阻塞了很长时间。在大量并发事务系统中,可能会使整个系统慢得不可想象。一致性读为了解决这一矛盾。Oracle充分利用的回归段,通过会滚段进行一致性读取,即避免了脏读,又大大减少了系统的阻塞、死锁问题。下面

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。