查看: 9624|回复: 11

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

[复制链接]
论坛徽章:
8
ITPUB8周年纪念徽章
日期:2009-09-27 10:21:222010新春纪念徽章
日期:2010-03-01 11:20:06ITPUB9周年纪念徽章
日期:2010-10-08 09:31:21ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07优秀写手
日期:2013-12-18 09:29:132014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11
跳转到指定楼层
1#
发表于 2007-7-16 11:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问大家是怎样管理undo表空间?
比如undo_retention设置多少合适?
undo表空间对应的数据文件是自动扩展
还是限制大小
用完一个后再增加另一个?
论坛徽章:
1
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
2#
发表于 2007-7-16 11:41 | 只看该作者

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

最初由 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的设置和创建问题

(1  optsize
(2  shrinks,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参数.

这是我的笔记!

使用道具 举报

回复
论坛徽章:
20
参与2007年甲骨文全球大会(中国上海)纪念
日期:2007-08-06 15:19:002012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:52马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:09:52
3#
发表于 2007-7-16 11:53 | 只看该作者
0)undo 表空间应该是限制大小的,一般用个10g左右,也最好创建两个undo tablespace,数据库出问题时,也可以进行切换undo
0)表空间管理应该采用local 的管理方式
0)段空间管理采用mannul管理方式,这也是oracle对undo tablespace默认的管理方式
0)还有undo_management  = AUTO
0)undo_retention设置可以比默认值稍微小一些,这样也有利于undo tablespace的空间回收

使用道具 举报

回复
论坛徽章:
26
授权会员
日期:2007-06-27 09:39:552010新春纪念徽章
日期:2010-03-01 11:08:242010数据库技术大会纪念徽章
日期:2010-05-13 09:34:232010年世界杯参赛球队:斯洛伐克
日期:2010-05-25 13:42:01ITPUB9周年纪念徽章
日期:2010-10-08 09:34:032011新春纪念徽章
日期:2011-02-18 11:43:34双黄蛋
日期:2011-07-29 16:22:53ITPUB十周年纪念徽章
日期:2011-11-01 16:21:152012新春纪念徽章
日期:2012-01-04 11:51:22奥运会纪念徽章:跆拳道
日期:2012-07-04 11:25:40
4#
发表于 2007-7-16 12:25 | 只看该作者
学习楼上的学习精神!!

使用道具 举报

回复
论坛徽章:
0
5#
发表于 2007-7-16 15:33 | 只看该作者

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

最初由 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的设置和创建问题

(1  optsize
(2  shrinks,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 的吧..不过还是很不错的.谢谢

使用道具 举报

回复
论坛徽章:
23
生肖徽章2007版:虎
日期:2008-01-02 17:35:532010年世界杯参赛球队:日本
日期:2010-05-27 15:15:36生肖徽章2007版:虎
日期:2009-03-10 21:13:27生肖徽章2007版:虎
日期:2008-10-20 20:39:19生肖徽章2007版:虎
日期:2008-10-14 22:25:42生肖徽章2007版:虎
日期:2008-10-11 15:40:21生肖徽章2007版:虎
日期:2008-10-10 12:52:22生肖徽章2007版:虎
日期:2008-10-09 11:14:10生肖徽章2007版:虎
日期:2008-10-06 13:54:36生肖徽章2007版:虎
日期:2008-10-05 18:58:33
6#
发表于 2007-7-24 19:15 | 只看该作者
auto,v$undostat视图可以作个参考

使用道具 举报

回复
论坛徽章:
2
奥运会纪念徽章:跆拳道
日期:2008-10-24 13:12:172010新春纪念徽章
日期:2010-03-01 11:19:54
7#
发表于 2007-7-24 20:07 | 只看该作者
学到不少东西,谢谢.

使用道具 举报

回复
论坛徽章:
24
生肖徽章:狗
日期:2006-09-07 10:14:43数据库板块每日发贴之星
日期:2008-07-26 01:02:20生肖徽章2007版:兔
日期:2008-10-13 11:10:11奥运会纪念徽章:铁人三项
日期:2008-10-24 13:27:21开发板块每日发贴之星
日期:2008-12-27 01:01:09生肖徽章2007版:马
日期:2009-11-18 10:45:032010新春纪念徽章
日期:2010-03-01 11:21:02ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51ERP板块每日发贴之星
日期:2011-05-18 01:01:01ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
8#
发表于 2007-7-24 21:47 | 只看该作者
学习了!没有看过

使用道具 举报

回复
论坛徽章:
5
ITPUB十周年纪念徽章
日期:2011-11-01 16:25:51灰彻蛋
日期:2012-12-11 13:45:29茶鸡蛋
日期:2012-12-30 23:24:09咸鸭蛋
日期:2013-01-18 11:44:13咸鸭蛋
日期:2013-02-20 10:09:54
9#
发表于 2011-7-13 10:35 | 只看该作者
学习!

使用道具 举报

回复
论坛徽章:
2
2011新春纪念徽章
日期:2011-02-18 11:43:33ITPUB学员
日期:2011-05-04 17:44:51
10#
发表于 2011-7-13 11:02 | 只看该作者
学习!

使用道具 举报

回复

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

本版积分规则 发表回复

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