热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Oracle:UNDO机制简析

Oracle绝对禁止一个用户查看另一个用户未提交的事务数据。启动一个DML事务时,已修改数据的象前版本被缓存在databasebuffercache,再有一个缓冲副本被写入一个回退段(undosegment)上。Undosegment三个重...SyntaxHighlighter
 
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 segment。
3)        明确管理大事务的undo segment。
4)        undo segment需求最小化。
5)        使用自动管理功能。
 
5.5.2.1        增加更多的undo segment
最好把新添加的undo segment放在另外的磁盘的表空间内。对undo要求最多的是delete,其次是update,最后是insert。
 
Oracle建议,为每4个并发事务创建一个undo segment,最多只能添加20个undo segment.
 
为了更准确的确定到底需要多大的undo segment,可以跟踪用户使用的undo segment大小:
//查询当前用户所使用的undo segment大小
SQL>select s.osuser,s.username,t.used_ublk
  from v$session s,v$transaction t
  where s.taddr = t.addr;
t.used_ublk:单位为Oracle块,*block size等于该用户将使用的size。
//查询某个大事务的具体使用大小。
1)        只保留一个undo segment online,其他的都offline。
Alter rollback segment xxxxx offline;
2)        统计当前所使用了的undo segment大小。
Select n.name,s.sun,s.writes from v$rollname n,v$rollstat s
Where n.usn = s.usn and name != ‘SYSTEM’;
s.writes:有多少字节的数据被写到该rollback segment上了。
3)        执行遇到回滚问题的大事务。
如:delete from alarminfo;
4)        重新执行“2)”的统计,使用新查询的s.writes减去(-)“2)”中查询出来的s.writes值,就是“3)”中事务所要使用的undo segment大小.
 
如果设置的undo segment大小是按大事务来设置,可能会浪费很多空间,只需要明确管理undo segment就可以了。
 
典型错误:ORA-01555 SNAPSHOT TOO OLD
一个修改事务很长时间未提交,别人查的时候在undo segment中找到了一个像前版本得到一致性读,别人还在查询到该修改前,最先修改的人提交了,并且此时undo segment中因为接受了commit而不守护该范围,此范围被其他事务写了。  www.2cto.com  
这时候就会发生这种错误,只需要在查一次就可以了。
防范:
1)        表上发生小事务时候,设法避免运行时间很长的查询。
2)        增加undo segment的大小和数量。
 
一般设置:initial=512k,next=512k,minextents=20,这样就会创建一个10M的undo segment.
 
5.5.2.2        明确管理大事务的undo segment
创建一个很大的undo segment,专用于处理特定的事务.
由于Oracle会自动把任务分配给undo segment,所以一般创建完和使用完后,需要手工把他们offline.
 
1)        创建大回滚段.
Create private rollback segment rbs_for_large_tran
Storage (initial 10M next 10M) tablespace rbs;
2)        直到在作业开始前,把rbs_for_large_tran 联机.
Alter rollback segment rbs_for_large_tran online;
或:execute dbms_transaction.use_rollback_segment(‘rbs_for_large_tran’);
3)        启动作业.
Delete from alarminfo;
4)        一旦"3)"执行完,马上在另外一个窗口把该rbs_for_large_tran段offline.
Alter rollback segment rbs_for_large_tran offline;
 
注意:在作业中的任何commit,都将导致rbs_for_large_tran脱机.若脱机了,需重新联机.
 
5.5.2.3        undo segment需求最小化
最大限度的减少写往undo segment的项目数量和大小。
如:
imp的时候使用commit=y.
exp的时候不要使用consistent选项.
Sql*loader时设置适当的commit值.
 
5.5.2.4        使用自动管理功能
Oracle 9i的新功能,通过配置init.ora,让Oracle自动来进行管理undo segment(Oracle推荐)。
        undo_managementl  www.2cto.com  
=auto     //使用undo 自动管理(AUM)
=manual   //不使用AUM。
       l undo_retention
单位是秒.指定一个像前版本在commit后被保存的时间.(减少ORA-01555错误)
       l undo_suppress_errors
FALSE,TRUE.指定是否抑制在RBU中可用的命令。
       l undo_tablespace
指定用于AUM的表空间名.
(同一时间,只能有一个undo tablespace在线,也必须有一个undo tablespace在线.
如果数据库未创建而undo_management=auto,则系统自动创建一个SYS_UNDOTBS表空间来使用)
 
创建的语法:
create undo tablespace undo_tbs
datafile ‘/u01/oradata/prod/undo01.dbf’  size  500M
autoextend on
next 5M maxsize 2000M;
(不能指定初始范围和下一个范围大小,因系统要自己指定)
 
估计undo tablespace大小的公式:
Undo space = (undo_retention * (undo blocks per second * db_block_size)) + db_block_size;
 
删除一个大的undo tbs:
8)        创建一个新的undo tbs undo_tbs02.
9)        SQL>alter system setundo_tablespace=undo_tbs02;
此时,新的事务会使用undo_tbs02,而以前的事务,依然会继续使用undo_tbs.
10)        待Undo_tbs上的所有事务commit或rollback,且超过了undo_retention指定的时间后,drop tablespace删除该undo tbs.
(此时注意,如果drop 了undo_tbs,此时任何发生在undo_tbs的像前读都要报错,此时最好发生在alter命令前的所有事物都commit了或rollback了.)
 
SQL>select u.begin_time,u.end_time,
t.name "undo_tbs_name",  www.2cto.com  
u.undoblks "blocks_used",
u.txncount "transactions",
u.maxquerylen "longest query",
u.expblkreucnt "expired blocks"
from v$undostat u,v$tablespace t
where u.undotsn = t.ts#;
 
查询统计时间内,被undo使用的Oracke块数,发生的事务数,最长的查询时间,在需要查一致性时有多少块已经被覆盖(出现>0的数表示ORA-01555就很可能发生).
 
 
 
作者 aaron8219

推荐阅读
  • 本文介绍如何在 FireDAC 环境下实现 FDMEMTable 字段的自动获取,为开发人员提供便捷的数据处理方式。 ... [详细]
  • 本文由瀚高PG实验室撰写,详细介绍了如何在PostgreSQL中创建、管理和删除模式。文章涵盖了创建模式的基本命令、public模式的特性、权限设置以及通过角色对象简化操作的方法。 ... [详细]
  • 本文探讨了MariaDB在当前数据库市场中的地位和挑战,分析其可能面临的困境,并提出了对未来发展的几点看法。 ... [详细]
  • 本文探讨了在Oracle数据库中,动态SQL语句的执行及其对事务管理的影响,特别是关于回滚操作的有效性。重点讨论了一个具体场景:将预警短信从当前表迁移到历史表时遇到的字段长度不匹配问题及相应的异常处理。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 本文详细介绍了Python编程语言的学习路径,涵盖基础语法、常用组件、开发工具、数据库管理、Web服务开发、大数据分析、人工智能、爬虫开发及办公自动化等多个方向。通过系统化的学习计划,帮助初学者快速掌握Python的核心技能。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • 本文将深入探讨使用IMPDP工具进行分区表导入时需要注意的事项,涵盖最佳实践和常见问题。通过详细的分析与解释,帮助读者更好地理解和应用这些知识。 ... [详细]
  • PostgreSQL 10 离线安装指南
    本文详细介绍了如何在无法联网的服务器上进行 PostgreSQL 10 的离线安装,并涵盖了从下载安装包到配置远程访问的完整步骤。 ... [详细]
  • 探讨如何使用正则表达式从类 SQL 查询语句中提取字段及其对应的值。 ... [详细]
  • TCP长连接设备管理平台:架构与功能概览
    本文介绍了基于TCP长连接的设备管理平台的设计理念、技术选型及主要功能模块。最初,项目旨在实现简单的协议测试,但随着需求扩展,逐步演变为一个完整的前后端分离系统。 ... [详细]
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • 使用Pandas高效读取SQL脚本中的数据
    本文详细介绍了如何利用Pandas直接读取和解析SQL脚本,提供了一种高效的数据处理方法。该方法适用于各种数据库导出的SQL脚本,并且能够显著提升数据导入的速度和效率。 ... [详细]
  • 本文介绍了如何在 Oracle 数据库中结合使用 UPDATE 和 SELECT 语句,以实现复杂的数据更新操作。首先准备测试环境和数据表,然后通过嵌套查询的方式从其他表中获取需要更新的值,最后执行更新操作并验证结果。 ... [详细]
  • 自己用过的一些比较有用的css3新属性【HTML】
    web前端|html教程自己用过的一些比较用的css3新属性web前端-html教程css3刚推出不久,虽然大多数的css3属性在很多流行的浏览器中不支持,但我个人觉得还是要尽量开 ... [详细]
author-avatar
mobiledu2502852753
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有