设为首页 加入收藏

TOP

Oracle:UNDO机制简析(一)
2014-11-24 01:36:30 】 浏览:1786
Tags:Oracle:UNDO 机制 简析
Oracle绝对禁止一个用户查看另一个用户未提交的事务数据。
启动一个DML事务时,已修改数据的象前版本被缓存在database buffer cache,再有一个缓冲副本被写入一个回退段(undo segment)上。
Undo segment三个重要目的:
1) DML用户发布rollback命令,则可用来恢复数据原状态。
2) 其他用户访问DML用户发布commit前的原数据,则提供一个已修改数据的读一致性视图。
3) 在实例恢复期间,用来rollback一个在实例故障刚发生前进行的未提交的事务。
回滚段由范围组成,这个范围由5个或5个以上的Oracle块组成。
回滚段工作方式:
1) 在一个回滚段内,以环形方式循环使用范围,直到段装满。由用户的commit或rollback命令发布后释放回滚段内的范围。
2) 同一个undo segment可以存储很多个像前版本,同时,一个像前版本只会存储在一个undo segment而不会因空间等任何问题连接到其他undo segment。
3) 如果一个undo segment中的一个范围启动了一个事务的像前版本,且逐渐增长装满了该范围,此时会环绕到下一个临近的范围继续使用空间,此时如果下一个临近范围已经被其他事务占领,则绝对不会跳过该临近范围查找其他可用范围,而是会在这个范围之间创建一个新的范围来使用。
4) 一个undo segment能处理的事务个数,取决于Oracle块大小。
5) 每个 数据库都至少有一个回滚段(系统回滚段),一旦创建了其他回滚段,则该回滚段将只用于处理数据目录读一致性和事务控制。 www.2cto.com
6) set transaction use rollback segment命令可以申请一个指定的回滚段。
7) LOB列不使用undo segment,而使用创建时分配给表的空间来存储像前版本。
5.5.1 测量UNDO I/O性能
5.5.1.1 undo segment头部的争用
Oracle 使用undo segment头部块中一个事务表来跟踪使用他的那些事务,其内容通常被缓存在database buffer cache中以便被搜索。OLTP上很有可能会因为访问这个头部发生等待。
SQL> select event,total_waits,time_waited,average_wait
 from v$system_event where event like '%undo%' and event like '%slot%';
average_wait:平均每毫秒等待的次数,等于0或接近于0最好。
SQL>select class,count from v$waitstat
where class in ('undo header','system undo header');
count:等候访问undo segment头部的次数。理想情况下,该值等于0或接近于0最好。
SQL>select n.name,s.usn,
decode(s.waits,0,1,1-(s.waits/s.gets)) "RBS Header Get Ratio"
from v$rollstat s,v$rollname n
where s.usn = n.usn
order by usn;
RBS Header Get Ratio:等于1或接近1最好,至少为95%。
5.5.1.2 undo segment范围的争用
SQL>select class,count from v$waitstat
where class ='system undo block' ;
count: 系统回滚段的范围的块争用次数
SQL>select w.count,w.count/s.value as wait_ratio from v$waitstat w,v$sysstat s
where w.class = 'undo block'
and s.name = 'consistent gets';
count:非系统回滚段的范围的块争用次数 www.2cto.com
wait_ratio:回滚等待率,如果超过1%,则需要调整了。
5.5.1.3 undo segment的环绕
SQL> select n.name,s.usn,
decode(s.waits,0,1,1-(s.waits/s.gets)) "RBS Header Get Ratio",s.wraps
from v$rollstat s,v$rollname n
where s.usn = n.usn
order by usn;
s.wraps:该回滚段被环绕到下一个范围的次数。次数太多表示段范围可能太小。
5.5.1.4 undo segment的动态范围分配
事务的像前版本在undo segment中发生环绕,而下一个范围已经分配给其他事务的像前版本,此时会在他们之间动态创建一个范围来给该事务的像前版本环绕。应避免以减少I/O。
SQL> select event,total_waits,time_waited,average_wait
from v$system_event where event = 'undo segment extension';
time_waited:表示动态分配的等待次数。若值很高或不断增长,说明undo segment太少或太小。
SQL>select n.name,s.usn,s.extends,
decode(s.waits,0,1,1-(s.waits/s.gets)) "RBS Header Get Ratio",s.wraps
from v$rollstat s,v$rollname n
where s.usn = n.usn
order by usn;
s.extends:被动态添加的范围数。若经常发生动态添加,则说明undo segment可能太小。
5.5.2 优化undo segment
优化目标:
1) 用户不用等待,就始终可找到undo segment来使用。
2) 用户始终能得到完成事务所需要的读一致性视图。
3) 回滚段不会引起过多的I/O。 www.2cto.com
一般就是:
1) 消除对undo segment header或block的争用。
2) 尽量最小化undo segment的扩充和环绕。
3) 避免undo segment用尽。
4) 始终拥有为用户提供一致性视图的undo segment。
做法:
1) 添加更多的undo segment 。
2) 增大现有undo segmen
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Oracle:解决归档日志的问题 下一篇Oracle逻辑结构

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目