ORA-01555错误

来源:互联网 发布:ps2017cc磨皮软件mac 编辑:程序博客网 时间:2024/06/15 08:42
ORA-1555错误简单的说就是针对一个数据块产生一致读时发生了错误。一致读就是指ORACLE利用回滚段来临时重构一个和事务或查询开始时的块状态相同的快照块的过程。如果一个块改变了多次,可能就会有多个快照块的。

一个事务或查询开始执行时,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,这样对表记录的修改就不会影响到查询,但该表不能是太大的表

原创粉丝点击