查看: 17755|回复: 42

[精华] delayed block cleanout 与 ORA-1555的关系

[复制链接]
论坛徽章:
48
娜美
日期:2016-11-25 10:31:35宝马
日期:2014-01-28 09:04:04阿斯顿马丁
日期:2014-01-22 15:03:55奥迪
日期:2013-10-25 14:33:53劳斯莱斯
日期:2013-10-11 14:28:46宝马
日期:2013-09-29 12:56:56问答徽章
日期:2013-09-26 10:44:48Jeep
日期:2013-09-09 10:52:59茶鸡蛋
日期:2013-06-27 15:31:59茶鸡蛋
日期:2013-03-14 16:32:43
发表于 2003-6-12 13:39 | 显示全部楼层 |阅读模式
很多资料都把delayed block cleanout 作为产生ORA-1555的一个原因。我觉得ora-1555的原因有二:相应的transaction table slot被覆盖或相应的undo information被覆盖。想不明白为什么单独把delayed block cleanout作为一个原因:它可以归结为上述原因之一。
谁帮忙解释一下。
另外一个问题:如果transaction table slot被覆盖,block cleanout能成功吗?它的commit SCN从那里得到?
谢谢!
论坛徽章:
48
娜美
日期:2016-11-25 10:31:35宝马
日期:2014-01-28 09:04:04阿斯顿马丁
日期:2014-01-22 15:03:55奥迪
日期:2013-10-25 14:33:53劳斯莱斯
日期:2013-10-11 14:28:46宝马
日期:2013-09-29 12:56:56问答徽章
日期:2013-09-26 10:44:48Jeep
日期:2013-09-09 10:52:59茶鸡蛋
日期:2013-06-27 15:31:59茶鸡蛋
日期:2013-03-14 16:32:43
 楼主| 发表于 2003-6-12 15:16 | 显示全部楼层

up

问题太简单还是坛中已有相关帖子?
我在黑暗中,清指出一条明路。

使用道具 举报

回复
论坛徽章:
5
授权会员
日期:2005-10-30 17:05:33生肖徽章2007版:鸡
日期:2008-01-02 17:35:53生肖徽章2007版:鼠
日期:2008-01-02 17:35:532015年新春福章
日期:2015-03-04 14:19:112015年新春福章
日期:2015-03-06 11:57:31
发表于 2003-6-12 16:47 | 显示全部楼层
相应的transaction table slot被覆盖.oracle不能确定数据块在查询开始的SCN时是否是commit的。

cleanout 能成功,只要进行cleanout的这个事务不发生1555。rbs header里有个SCN的上限值,cleanout时会记录这个SCN,而不是事务实际的SCN了。

使用道具 举报

回复
论坛徽章:
48
娜美
日期:2016-11-25 10:31:35宝马
日期:2014-01-28 09:04:04阿斯顿马丁
日期:2014-01-22 15:03:55奥迪
日期:2013-10-25 14:33:53劳斯莱斯
日期:2013-10-11 14:28:46宝马
日期:2013-09-29 12:56:56问答徽章
日期:2013-09-26 10:44:48Jeep
日期:2013-09-09 10:52:59茶鸡蛋
日期:2013-06-27 15:31:59茶鸡蛋
日期:2013-03-14 16:32:43
 楼主| 发表于 2003-6-12 17:33 | 显示全部楼层

这样理解正确否?

TRANSACTION SLOT OVERWRITTEN,所以不知该BLOCK的COMMIT SCN与QUERY SCN孰大孰小,所以无从得到CONSISTENT IMAGE。对吗?
谢谢楼上仁兄。

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
发表于 2003-6-12 18:29 | 显示全部楼层

参考

一致读的步骤:
    1. Read the Data Block.

2. Read the Row Header.

3. Check the Lock Byte to determine whether there's an ITL entry.

4. Read the ITL entry to determine the Transaction ID (Xid).

5. Read the Transaction Table using the Transaction ID. If the transaction has been committed and has a System Commit Number less than the query's System Change Number, update the status of the block (block cleanout) and start over at step 1.

6. Read the last undo block (Uba).

7. Compare the block transaction ID with the transaction table transaction ID. If the Transaction ID in the undo block doesn't equal the Transaction ID from the Transaction Table, then issue ORA-1555, Snapshot Too Old.

8. If the Transaction IDs are identical, make a copy of the data block in memory. Starting with the head undo entry, apply the changes to the copied data block.

9. If the tail undo entry (the actual first undo entry in the chain, or the last in the chain going backwards!) indicates another data block address, read the indicated undo block into memory and repeat steps 7 and 8 until the undo entries don't contain a value for the data block address.

10. When there's no "previous data block address," the transaction has been completely undone.

11. If the undo entry contains:

a. a pointer to a previous transaction undo block address, read the Transaction ID in the previous transaction undo block header and read the appropriate Transaction Table entry. Return to step 5.

b. an ITL record, restore the ITL record to the data block. Return to step 4.

使用道具 举报

回复
论坛徽章:
5
授权会员
日期:2005-10-30 17:05:33生肖徽章2007版:鸡
日期:2008-01-02 17:35:53生肖徽章2007版:鼠
日期:2008-01-02 17:35:532015年新春福章
日期:2015-03-04 14:19:112015年新春福章
日期:2015-03-06 11:57:31
发表于 2003-6-12 19:05 | 显示全部楼层
to hqs4500:
  我认为你的理解是对的。

to biti:
你的文章里并没有提到transaction table slot找不到(被覆盖)的情况。

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
发表于 2003-6-12 20:11 | 显示全部楼层

仔细看

5,6,7,8

假如 transaction table slot 和 undo  block 都被覆盖,则返回 1555,假如transaction table slot被覆盖,但是 undo  block 没有被覆盖,这时一定满足这样其中情况,就是 事务已经提交并且 commit  SCN  > select SCN (假如commit SCN < select SCN的话在5已经停止往下走了),于是产生consistent reads

8. If the Transaction IDs are identical, make a copy of the data block in memory. Starting with the head undo entry, apply the changes to the copied data block.

把 data block 产生一个拷贝,把 回滚段内容应用于 拷贝上


transaction table slot找不到  也是标志 事务被提交的情况的一种,实际上已经包含在上述的文字中了

使用道具 举报

回复
论坛徽章:
5
授权会员
日期:2005-10-30 17:05:33生肖徽章2007版:鸡
日期:2008-01-02 17:35:53生肖徽章2007版:鼠
日期:2008-01-02 17:35:532015年新春福章
日期:2015-03-04 14:19:112015年新春福章
日期:2015-03-06 11:57:31
发表于 2003-6-13 15:04 | 显示全部楼层
"假如 transaction table slot 和 undo block 都被覆盖,则返回 1555"
这种 情况下并不一定要会返回1555,只有当Oracle无法判断出commitSCN<querySCN时才会返回1555.(这种时候Oracle还有可能有办法得到一个COMMIT SCN的上限值,可以通过上限值来比较来判断是否commitSCN<querySCN)

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
发表于 2003-6-13 15:10 | 显示全部楼层

hehe

最初由 overtime 发布
[B]"假如 transaction table slot 和 undo block 都被覆盖,则返回 1555"
这种 情况下并不一定要会返回1555,只有当Oracle无法判断出commitSCN<querySCN时才会返回1555.(这种时候Oracle还有可能有办法得到一个COMMIT SCN的上限值,可以通过上限值来比较来判断是否commitSCN<querySCN) [/B]


commit SCN 是真切地存在于回滚段中,如果都被覆盖了,还从哪里来?其他地方能存储么?可是好多的说

应该是没有办法

BTW: 偶还是比较信任给出这份文字的人的说

使用道具 举报

回复
论坛徽章:
48
娜美
日期:2016-11-25 10:31:35宝马
日期:2014-01-28 09:04:04阿斯顿马丁
日期:2014-01-22 15:03:55奥迪
日期:2013-10-25 14:33:53劳斯莱斯
日期:2013-10-11 14:28:46宝马
日期:2013-09-29 12:56:56问答徽章
日期:2013-09-26 10:44:48Jeep
日期:2013-09-09 10:52:59茶鸡蛋
日期:2013-06-27 15:31:59茶鸡蛋
日期:2013-03-14 16:32:43
 楼主| 发表于 2003-6-13 17:37 | 显示全部楼层

容我消化消化

没想到biti_rainy也来了,有些激动。
但是感觉overtime说法更合理,先消化消化看是否还有其他问题。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表