Oracle数据库数据恢复、性能优化

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖

131

积分

1

好友

13

主题
1#
发表于 2012-4-27 11:32:10 | 查看: 5086| 回复: 2
应用在申请一个undo段的时候oracle的实现流程是啥?忘刘总解答一下
2#
发表于 2012-4-27 11:36:19
新事务申请新的UNDO空间

1,如果free block pool空间用完,进入第2
oracle会为每个undo segment设置一个free block pool,把最近要使用的空闲块放入到其中,如果池中有空闲块,那么将直接使用空闲块;如果没有,进入第2步。
2,当前undo segment是否还有free block,如果有,选择这个作为可用的free block
Free block = 过期的块 + 未使用的块,undosegment是一个环形结构,如下图作为一个5个区的segment的,只不过没有首尾相连,e表示过期的块,a表示活动课,空白表示未使用的块。
1.png

如果当前区没有free block,则进入步骤3
3undo segment的当前区的下一个区是过期的么?
如果是,选择覆盖下一个区的第一个块。
如果不是,进入步骤4
4,从undo tablespace中选择一个新的空闲区作为扩展分区使用。如果undo tablespace中没有这样的新的空闲分区,那么进入步骤5.

5,从offlineundosegment的事务表中选择一个空闲区(所以块都是过期或者未使用的块)作为空闲区关联到申请空间需要的undo segment的事务表上。
当前的undo segment没有空闲的区供使用,同时undo tablespace也没用,那么就可以去占用其他undotablespace未使用的区。

先占用空闲的区,也就是别的回滚段没有使用或者过期的区,并且这个回滚段是offline(没有活动事务的undo segment)

6,从onlineundosegment的事务表中选择一个空闲区(所以块都是过期或者未使用的块)作为空闲区关联到申请空间的undo segment事务表中。
如果没有找到这样的区,那么进入第7步。

7,扩展undo tablespace,如果undo tablepsace是不允许扩展的,进入第8步。

8,使用当前segment的其它空闲区(不是下一个区)。
2.png

9,从offlinesegment中偷取一个未过期的区作为扩展分区使用,这里未过期的块,可能会被覆盖产生ora-1555错误。

offline中没有找到未过期的区,进入第10步。(个人理解,在offlinesegment都是过期区以及不存在offline的区会出现这种情况。)


10,从onlinesegment中偷取一个未过期的区作为扩展分区使用,和第9步一样,也有可能出现ora-1555错误.
如果还是没有分配到空间,就进入第11步。

11, ora-30036
“unable to extend segment by %s in undotablespace '%s'”

回复 只看该作者 道具 举报

3#
发表于 2012-4-27 22:38:14
该问题 最近会在博客 总结成专题 共享,  今天太忙了 暂时搁置

回复 只看该作者 道具 举报

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

QQ|手机版|Archiver|Oracle数据库数据恢复、性能优化

GMT+8, 2024-12-24 10:04 , Processed in 0.051337 second(s), 25 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部
TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569