首页 > 其他 > 详细

模拟ora-01555错误

时间:2014-02-26 04:41:57      阅读:310      评论:0      收藏:0      [点我收藏+]
首先了解Oracle在什么情况下会产生ORA-01555错误:
 
假设有一张6000万行数据的testdb表,预计testdb全表扫描1次需要2个小时,参考过程如下:
1、在1点钟,用户A发出了select * from testdb;此时不管将来testdb怎么变化,正确的结果应该是用户A会看到在1点钟这个时刻的内容。
2、在1点30分,用户B执行了update命令,更新了testdb表中的第4100万行的这条记录,这时,用户A的全表扫描还没有到达第4100万条。毫无疑问,这个时候,第4100万行的这条记录是被写入了回滚段,假设是回滚段UNDOTS1,如果用户A的全表扫描到达了第4100万行,是应该会正确的从回滚段UNDOTS1中读取出1点钟时刻的内容的。
3、这时,用户B将他刚才做的操作提交了,但是这时,系统仍然可以给用户A提供正确的数据,因为那第4100万行记录的内容仍然还在回滚段UNDOTS1里,系统可以根据SCN到回滚段里找到正确的数据,但要注意到,这时记录在UNDOTS1里的第4100万行记录已经发生了重大的改变:就是第4100万行在回滚段UNDOTS1里的数据有可能随时被覆盖掉,因为这条记录已经被提交了!
4、由于用户A的查询时间漫长,而业务在一直不断的进行,UNDOTS1回滚段在被多个不同的transaction使用着,这个回滚段里的extent循环到了第4100万行数据所在的extent,由于这条记录已经被标记提交了,所以这个extent是可以被其他transaction覆盖掉的!
5、到了1点45分,用户A的查询终于到了第4100万行,而这时已经出现了第4条说的情况,需要到回滚段UNDOTS1去找数据,但是已经被覆盖掉了,这时就出现了ORA-01555错误。


--以上来自网上


模拟错误
第一步:新建一个大表,大概100多W行
bubuko.com,布布扣

第二步:设置undo_retention的值,我这里设置成二秒,
alter system set undo_retention=2 scope=spfile;
之后需要重新启动数据库

第三步:设置一个较小的undo空间, 我这里设置是50M
bubuko.com,布布扣

bubuko.com,布布扣

第四步:A窗口执行select ,之后B窗口执行delete
A窗口:select * from ora01555;
B窗口:bubuko.com,布布扣

结果:出现ora-01555错误。实验成功OK,以后需要这个错误就不怕了,哈哈。
bubuko.com,布布扣



模拟ora-01555错误

原文:http://blog.csdn.net/macliukaijie/article/details/19908445

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!