大家都是怎样管理undo表空间的呢?

[复制链接]
查看11 | 回复9 | 2009-9-27 10:21:22 | 显示全部楼层 |阅读模式
请问大家是怎样管理undo表空间?
比如undo_retention设置多少合适?
undo表空间对应的数据文件是自动扩展
还是限制大小
用完一个后再增加另一个?
回复

使用道具 举报

千问 | 2009-9-27 10:21:22 | 显示全部楼层
最初由 hxl 发布
[B]请问大家是怎样管理undo表空间?
比如undo_retention设置多少合适?
undo表空间对应的数据文件是自动扩展
还是限制大小
用完一个后再增加另一个? [/B]

1.首先要描述undo segment的结构是怎么样的
undo segment分两个部分,一个是undo segment head,还有一个undo segment block(事务槽)
undo segment head中包含了这个回滚段的事务信息,而且有一个指针指向undo segment block
2。一个完成事务在undo segment的过程
undo segment block就是包含数据块的前映象,这也是为什么 head会有一个指针指向block的原因,否者事务无法对应。
不只如此,在事务开始之前,必须在undo获得一个事务槽(事务槽是在undo segment head分配的),这样在需要修改的块的ITL(ITL其实也是一个head)也有事务信息指象这个分配的undo segment head,这样一个完整的事务就全部对应起来了。
事务在未完成前,也就是没有commit,那么在块的ITL和undo segment head始终标识为active,如果完成了commit,则在UNDO segment head标识这个事务为inactive,然后进行块清除。(所谓块清除是:因为ITL包含的是一个块的活动的事务信息,当你完成了COMMIT,当然要把这个块上的事务对应的信息清除。)
注意:首先要注意,undo segment head有一个latch,也就是有锁,当你有新事务想要分配一个undo segment block,首先要在undo segment head注册这个信息,由于undo segment head是不能同时被几个事务同时修改,(为了保护整体结构不出现混乱),所以需要这个latch。
undo segment 的访问是由oracle本身根据segment的繁忙程度自动分配的(当然也可以你指定)。
由于latch是一定要串行执行的,所以如果一个undo segment 如果同时的请求的事务很多,就会存在排队的现象。这也是为什么需要多个undo segment的根本原因。
那么问题出来了:
我们到底需要几个undo segment 来保证事务在分配的过程不会出现等待,或者说不会对数据库的运行造成影响。
你一段时间内会有几个事务? total
一般来说保证一个segment一段时间内不超过5个事务
segment N=total/5 (N就是你需要的回滚段个数)
3。undo segment的设置和创建问题
(1optsize
(2shrinks,waits
(3视图:v$waitstat ,v$rollstat
先来谈谈第一个optsize问题:
首先要理解既然UNDO SEGMENT是循环使用的,那么为什么UNDO SEGMENT又要扩展呢?
因为当一个UNDO SEGMENT在未完成COMMIT的时候是不能重用的,因为一旦重用就会覆盖了未完成COMMIT的活动信息。所以当一个SEGMENT出现未提交的数据时,而且SEGMENT大小到达了你设置的最大UNDO SEGMENT大小时是不能重用的,这个时候就是继续扩展这个SEGMENT。
这也是为什么需要OPTSIZE这个参数的根本原因。 既然有扩展,就必须收缩。OPTSIZE这个参数就是当扩展的大小超过了OPTSIZE时,收缩开始了。(这会出现问题,第4个问题会解释)
个人认为这也是为什么一个UNDO SEGMENT中事务尽量少于5个的根本原因,如果有很多事务出现在这个UNDO SEGMENT,那么肯定会出现没有COMMIT的,那么收缩的成功率将非常小,因为一直存在活动的事务是不能收缩的。这有可能导致UNDO SEGMENT一直扩展而占满你的硬盘空间。
再来谈谈第二个问题:shrinks (收缩的意思啊)
如果在v$rollstat出现收缩的次数非常多,这就说明你开始设置的UNDO SEGMENT大小不能满足要求。否者为什么需要去扩展?
如果waits的数字大于0 ,就说明UNDO SEGMENT的个数太少,由于每个UNDO SEGMENT都处于繁忙状态,当出现新事务的时候必须选择一个UNDO SEGMENT,由于很繁忙,必然出现等待。如果多有几个UNDO SEGMENT就可能不会出现这个问题了。 至少事务能否平均分布,而不会出现繁忙的情况。

4。 最后来谈谈关于UNDO SEGMENT出现的错误问题
所谓错误也就是UNDO SEGMENT大小不够用,为什么会出现不够用呢? 或许你会说我的UNDO SEGMENT设置很大啊! 你的系统或许有很多事务,有可能这些事务很小,突然有一个很大的出来了。需要很多UNDO SEGMENT空间, 当然这个情况比较少。
这个时候可以把SEGMENT设置再大点,这样好吗?不好,因为就是一个二个事务比较大,没必要增加整个UNDO SEGMENT,解决方法可以自己建立一个比较大的UNDO SEGMENT, 指定这个大事务在这个UNDO SEGMENT运行。或者扩大OPTIMAL参数.
这是我的笔记!
回复

使用道具 举报

千问 | 2009-9-27 10:21:22 | 显示全部楼层
0)undo 表空间应该是限制大小的,一般用个10g左右,也最好创建两个undo tablespace,数据库出问题时,也可以进行切换undo
0)表空间管理应该采用local 的管理方式
0)段空间管理采用mannul管理方式,这也是oracle对undo tablespace默认的管理方式
0)还有undo_management= AUTO
0)undo_retention设置可以比默认值稍微小一些,这样也有利于undo tablespace的空间回收
回复

使用道具 举报

千问 | 2009-9-27 10:21:22 | 显示全部楼层
学习楼上的学习精神!!
回复

使用道具 举报

千问 | 2009-9-27 10:21:22 | 显示全部楼层
最初由 iamlargelove 发布
[B]
1.首先要描述undo segment的结构是怎么样的
undo segment分两个部分,一个是undo segment head,还有一个undo segment block(事务槽)
undo segment head中包含了这个回滚段的事务信息,而且有一个指针指向undo segment block
2。一个完成事务在undo segment的过程
undo segment block就是包含数据块的前映象,这也是为什么 head会有一个指针指向block的原因,否者事务无法对应。
不只如此,在事务开始之前,必须在undo获得一个事务槽(事务槽是在undo segment head分配的),这样在需要修改的块的ITL(ITL其实也是一个head)也有事务信息指象这个分配的undo segment head,这样一个完整的事务就全部对应起来了。
事务在未完成前,也就是没有commit,那么在块的ITL和undo segment head始终标识为active,如果完成了commit,则在UNDO segment head标识这个事务为inactive,然后进行块清除。(所谓块清除是:因为ITL包含的是一个块的活动的事务信息,当你完成了COMMIT,当然要把这个块上的事务对应的信息清除。)
注意:首先要注意,undo segment head有一个latch,也就是有锁,当你有新事务想要分配一个undo segment block,首先要在undo segment head注册这个信息,由于undo segment head是不能同时被几个事务同时修改,(为了保护整体结构不出现混乱),所以需要这个latch。
undo segment 的访问是由oracle本身根据segment的繁忙程度自动分配的(当然也可以你指定)。
由于latch是一定要串行执行的,所以如果一个undo segment 如果同时的请求的事务很多,就会存在排队的现象。这也是为什么需要多个undo segment的根本原因。
那么问题出来了:
我们到底需要几个undo segment 来保证事务在分配的过程不会出现等待,或者说不会对数据库的运行造成影响。
你一段时间内会有几个事务? total
一般来说保证一个segment一段时间内不超过5个事务
segment N=total/5 (N就是你需要的回滚段个数)
3。undo segment的设置和创建问题
(1optsize
(2shrinks,waits
(3视图:v$waitstat ,v$rollstat
先来谈谈第一个optsize问题:
首先要理解既然UNDO SEGMENT是循环使用的,那么为什么UNDO SEGMENT又要扩展呢?
因为当一个UNDO SEGMENT在未完成COMMIT的时候是不能重用的,因为一旦重用就会覆盖了未完成COMMIT的活动信息。所以当一个SEGMENT出现未提交的数据时,而且SEGMENT大小到达了你设置的最大UNDO SEGMENT大小时是不能重用的,这个时候就是继续扩展这个SEGMENT。
这也是为什么需要OPTSIZE这个参数的根本原因。 既然有扩展,就必须收缩。OPTSIZE这个参数就是当扩展的大小超过了OPTSIZE时,收缩开始了。(这会出现问题,第4个问题会解释)
个人认为这也是为什么一个UNDO SEGMENT中事务尽量少于5个的根本原因,如果有很多事务出现在这个UNDO SEGMENT,那么肯定会出现没有COMMIT的,那么收缩的成功率将非常小,因为一直存在活动的事务是不能收缩的。这有可能导致UNDO SEGMENT一直扩展而占满你的硬盘空间。
再来谈谈第二个问题:shrinks (收缩的意思啊)
如果在v$rollstat出现收缩的次数非常多,这就说明你开始设置的UNDO SEGMENT大小不能满足要求。否者为什么需要去扩展?
如果waits的数字大于0 ,就说明UNDO SEGMENT的个数太少,由于每个UNDO SEGMENT都处于繁忙状态,当出现新事务的时候必须选择一个UNDO SEGMENT,由于很繁忙,必然出现等待。如果多有几个UNDO SEGMENT就可能不会出现这个问题了。 至少事务能否平均分布,而不会出现繁忙的情况。

4。 最后来谈谈关于UNDO SEGMENT出现的错误问题
所谓错误也就是UNDO SEGMENT大小不够用,为什么会出现不够用呢? 或许你会说我的UNDO SEGMENT设置很大啊! 你的系统或许有很多事务,有可能这些事务很小,突然有一个很大的出来了。需要很多UNDO SEGMENT空间, 当然这个情况比较少。
这个时候可以把SEGMENT设置再大点,这样好吗?不好,因为就是一个二个事务比较大,没必要增加整个UNDO SEGMENT,解决方法可以自己建立一个比较大的UNDO SEGMENT, 指定这个大事务在这个UNDO SEGMENT运行。或者扩大OPTIMAL参数.
这是我的笔记! [/B]

这个文章应该是8I 的吧..不过还是很不错的.谢谢
回复

使用道具 举报

千问 | 2009-9-27 10:21:22 | 显示全部楼层
auto,v$undostat视图可以作个参考
回复

使用道具 举报

千问 | 2009-9-27 10:21:22 | 显示全部楼层
学到不少东西,谢谢.
回复

使用道具 举报

千问 | 2009-9-27 10:21:22 | 显示全部楼层
学习了!没有看过
回复

使用道具 举报

千问 | 2009-9-27 10:21:22 | 显示全部楼层
学习!
回复

使用道具 举报

千问 | 2009-9-27 10:21:22 | 显示全部楼层
学习!
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行