Ora-01555问题分析

Ora-01555产生原因:

 

1、一致性读导致的ora-01555

当一个较长的查询执行时,查询数据过程中数据块发生了修改,并且被commit后事物量较大,undo segment被覆盖,该查询检索到被修改数据块时,为了一致性读需要去undo中查询数据块前镜像,而该undo segment已经被覆盖所以无法找到数据,此时就会报出ora-01555错误。

2、延迟块清除导致的ora-01555

当数据块被修改后存放到buffer cache中,commit之前进行块清除时使用了延迟块清除(需要清除的数据块较多,超出了buffer_cache10%,或者在commit之前,已经有dbwr进程将buffer_cache中的数据写入dbwr,比如commit前刷新了buffer cache),被修改的数据块通过dbwr写入数据文件,而每个事务被commit之后会有一个commit scn记录在undo里,select语句发出时会有一个select scn,如果发现select检索的数据块是被延迟块清除的,会通过ITLl事物槽到undo里找对应的该数据库的commit scn,如果此时undo已经被刷新,找不到对应的该数据库的scn,会拿select scnundo里的最小的commit scn对比,一般来说select scn都会比undo 最小commit scn大,所以会把undo中最小commit scn作为被延迟块清除的数据库的commit scn,这样虽然有真正的该数据库的commit scn不一致,但数据是一直的,所以还是安全的。但是如果真出现比较极端的,select scnundo里最小的commit scn还要小,那就出现ora - 01555的错误了。

 

具体过程分析

为了方便演示过程,临时修改一下undo的参数:

 

SQL> create undo tablespace undotbs02 datafile '/u01/app/oracle/oradata/orcl_dup/undotbs002' size 5m autoextend off;

Tablespace created.

SQL> alter system set undo_tablespace=undotbs02 scope=spfile;

System altered.

 

SQL> alter system set undo_retention=3 ;

System altered.

undo_retention参数用来控制undo数据的保留时间,默认的是900s,此处改为3s只是为了方便测试,更加详细的讲解请参照http://blog.itpub.net/17203031/viewspace-774498

10203事件用来跟踪块的清除操作

SQL> alter system set event='10203 trace name context forever' scope=spfile;

System altered.

 

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

 

SQL> startup

ORACLE instance started.

Total System Global Area  1677721

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
kettle ora-01555是指在使用kettle工具进行数据抽取或转换时,出现了Oracle数据库的ORA-01555错误。ORA-01555错误是Oracle数据库的一个常见错误,也被称为Snapshot too old错误。 ORA-01555错误是由于事务回滚段中的数据被其他事务重用或者已经被覆盖而导致的。这种情况通常发生在并发事务环境下,当一个事务需要读取某些数据,但是在读取期间该数据已经被其他事务修改或删除,导致该事务无法读取到所需的数据而出现ORA-01555错误。 在kettle中,当进行数据抽取或转换时,kettle会同时执行多个SQL语句以读取或修改数据库中的数据。如果在执行这些SQL语句的过程中,有其他事务修改了这些数据,那么就有可能导致ORA-01555错误的发生。 为了解决ORA-01555错误,可以考虑以下几个方案: 1. 增加Rollback段的大小:可以通过增大回滚段的大小来解决ORA-01555错误。通过增加回滚段的大小,可以延长数据被重用的时间,从而减少ORA-01555错误的发生。 2. 设置合适的UNDO_RETENTION参数:可以通过设置UNDO_RETENTION参数来控制回滚段中数据的保留时间。增加UNDO_RETENTION的值可以延长数据被重用的时间,减少ORA-01555错误的发生。 3. 调整事务隔离级别:可以尝试调整事务的隔离级别,例如将隔离级别改为READ_COMMITTED,可以降低ORA-01555错误的发生概率。 此外,还可以根据具体情况进行其他的优化措施,例如优化SQL语句、调整并发事务的执行顺序等,以减少ORA-01555错误的发生。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值