ORA-01555错误
来源:互联网 发布:ps2017cc磨皮软件mac 编辑:程序博客网 时间:2024/06/15 08:42
一个事务或查询开始执行时,ORACLE会产生一个SCN来记录这个开始时刻点,这个SCN也就叫做SNAPSHOTSCN。ORACLE仅仅看基于SNAPSHOT SCN的快照记录。如果块中有活动的事务或BLOCK SCN> SNAPSHOTSCN时,就产生了一致读。如果是没有活动的事务但没有产生COMMIT SCN的块 ,先产生DELAY BLOCKCLEANOUT,再比较COMMIT SCN与SNAPSHOT SCN的大小,如果COMMIT SCN小于SNAPSHOTSCN则直接使用该块,否则要产生一致读。
产生ORA-1555的可能情况:
1 一个长时间运行的查询,并同时针对查询需要的块有DML处理(主要是update和delete)
2 当查询和插入并发时
3 延迟块清除
4 交叉fetch和commit
5 回滚段发生错误
情况1一个长时间运行的查询,并同时针对查询需要的块有DML处理(主要是update和delete)
当一个查询开始之后,正好某一个update更改了其中的一个记录,当查询扫描到该记录时,就需要一致读,回滚空间中去查找原值。如果这个查询的时间非常长,而那条记录修改之后,很快就被提交了,导致回滚空间中的记录可以被清除,并且这个数据库事务本身也比较多,回滚空间的覆盖比较块,在查询结束之前,回滚段中的记录空间就被新的记录覆盖占用了,导致查询找不到原值,从而产生ORA-1555错误。
(比较临界的情况。当一个查询正好碰到了一个update更改了其中的一个记录,他会到UNDO里头找到原值,就正在UNDO寻找数据块,并且还没从数据块中读出数据,然后这个update事务提交了,然后因为这个UNDO表空间比较小,然后库里头事务比较多,而且没有启用保留保证,这个UNDO数据块被其他事务复写了,然后当查询没找到那个UNDO旧值的时候,发生的ORA-01555错误)
Solution:
1、业务控制,禁止对同一个表的长时间查询和更新处理同时进行,要分开执行
2、增大回滚段的大小
3、增加回滚段的个数
4、不使用OPTIMAL选项,已经被使用的空间就不会很快收缩回来,可以使commit之后的记录保持尽可能长的时间
5、推迟对DML语句的COMMIT
6、优化查询语句,比如并行查询,目的是减小查询的时间
7、为要查询的表建立只读SNAPSHOT,这样对表记录的修改就不会影响到查询,但该表不能是太大的表
- ORA-01555错误
- ORA-01555错误
- ORA-01555错误详解
- ORA-01555错误浅析
- 重现ORA-01555错误
- ORA-01555错误
- ORA-01555经典错误
- ORA-01555错误
- 【ORA错误】ORA-12528
- 模拟ORA-01555快照过旧 错误
- ORA-01555: snapshot too old错误
- ORA-01555错误总结(一)
- ORA-01555错误总结(二)
- ORA-01555错误总结(一)
- ORA-01555错误总结(二)
- ORA-01555错误总结(一)
- ORA-01555错误总结(二)
- 关于回滚段导致的ORA-01555错误
- Oracle基础 之 约束条件状态
- 完整性约束的状态
- The effects of the TRUNCATE command on a table
- 关于ORA-01720错误
- Oracle存储过程和程序包
- ORA-01555错误
- oracle 10G ASM_POWER_LIMIT与Rebalance
- 关于程序包:DBMS_RESOURCE_MANAGE…
- About Opening with the RESETLOGS Option
- Oracle工具——DBVERIFY
- rman备份出现ORA-19625
- TSPITR 基于表空间时间点恢复
- 关于Block Media Recovery
- oracle 重做日志组的三种状态:current,active,inactive