lucheng918的个人博客分享 http://blog.sciencenet.cn/u/lucheng918

博文

读一致性 snapslot too old ORA01555错误

已有 3120 次阅读 2014-2-15 21:53 |个人分类:linux+oracle|系统分类:科研笔记| 读一致性

ITL:事务槽。每个数据/索引块都有一个事务槽。ITL(Interested Transaction List)是Oracle数据块内部的一个组成部分,位于数据块头(block header),itl由xid,uba,flag,lck和scn/fsc组成,用来记录该块所有发生的事务,一个itl可以看作是一条事务记录。当然,如果这个事务已经提交,那么这个itl的位置就可以被反复使用了,因为itl类似记录,所以,有的时候也叫itl槽位。如果一个事务一直没有提交,那么,这个事务将一直占用一个itl槽位,itl里面记录了事务信息,回滚段的入口,事务类型等等。如果这个事务已经提交,那么,itl槽位中还保存的有这个事务提交时候的SCN号。

每个数据/索引行头包含lock type,它记录着行在ITL中的slot。

每一个行只能与一个事务相关联

初始状态在块头分配两个ITL

ITL包括:TRANSACTION ID (XID)

Undo byte address (UBA)

System Change Number (SCN)

ITL单元会被每个修改块的当前事务覆写。

上一次的修改已被记录在undo块中。

dump一个块可以看到ITL信息类似如下:
    Itl           Xid                                    Uba                             Flag     Lck        Scn/Fsc
    0x01   0x0006.002.0000158e 0x0080104d.00a1.6e  --U-   734   fsc 0x0000.6c9deff0
    0x02   0x0000.000.00000000 0x00000000.0000.00 ----        0      fsc 0x0000.00000000
 

Xid:事务id,在回滚段事务表中有一条记录和这个事务对应

Uba:回滚段地址,该事务对应的回滚段地址

 第一段地址:回滚数据块的地址,包括回滚段文件号和数据块号

 第二段地址:回滚序列号

 第三段地址:回滚记录号


读一致性

oracle只会读提交之后的数据。避免脏读。

oracle读数据,读的是一个时间节点的。

CR块:

Cr块consistent read块也就是用来维护oracle的读一致性的数据块。当查询某些数据的时候,发现数据块的版本比我们要查询的新,例如session1执行了dml操作并没有提交,session2此时查找跟session1相关的dml操作的数据信息,此时查询的数据却是原来的数据信息。

查询的过程会在undo段中查找该数据块的前映像后,然后把前映像和current块合并形成了一个CR block,通过查询cr block就可以满足数据的一致性了。




SCN(system change number)

经典错误:snapslot too old ORA01555错误

原因:(1)select执行时间太长,(2)undo表空间压力太大,导致undo数据被覆盖(解决:增加undo表空间)

通过EM(企业管理器)可以修改undo表空间大小。主目录下方有个指导中心——还原管理——还原指导——出现一个图,横坐标:undo保留时间,对应纵坐标:undo表空间大小。

总之,根据保留时间寻找表空间大小



https://blog.sciencenet.cn/blog-780964-767854.html

上一篇:redo undo区别
下一篇:BRE的后向引用
收藏 IP: 168.160.22.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-7-18 08:23

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部