分类 电化教育馆 商业联合会 中商会学会 综合类培训 健康技能类 其他技能证 质量认证培训 工商联培训 工信部培训 中小企培训

Oracle:UNDO机制

 


Oracle绝对禁止一个用户查看另一个用户未提交的事务数据。

    启动一个DML事务时,已修改数据的象前版本被缓存在database buffer cache,再有一个缓冲副本被写入一个回退段(undo segment)上。

    Undo segment三个重要目的:

    1用户发布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每个数据库都至少有一个回滚段(系统回滚段),一旦创建了其他回滚段,则该回滚段将只用于处理数据目录读一致性和事务控制。

    6set transaction use rollback segment命令可以申请一个指定的回滚段。

    7LOB列不使用undo segment,而使用创建时分配给表的空间来存储像前版本。

    5.5.1  测量UNDO I/O性能

    5.5.1.1undo 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:非系统回滚段的范围的块争用次数

    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。

    一般就是:

    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而不守护该范围,此范围被其他事务写了。

    这时候就会发生这种错误,只需要在查一次就可以了。

    防范:

    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

    =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",

    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就很可能发生)。

 


   >>学课在线网课试听.报名        >>学课在线智能题库.模拟做题       >>直播课程       >>录播课程

课程名称
课程免费试听
课程名称
课程免费试听
课程名称
课程免费试听
初级会计师

一级建造师

执业药师

中级会计师

二级建造师

护士资格证

注册会计师

一级造价工程师

健康管理师

经济师考试

监理工程师

考研辅导课

银行从业

安全工程师

自考课程

基金从业

一级消防工程师

心理咨询师

企业人力资源管理师

法律职业资格考试

公共营养师

社会工作者

消防设施操作员

保育员

教师资格证

成人高考

育婴师

公务员培训

文职培训

英语四六级

计算机软考
养老护理员
税务师培训

房产经纪人
咨询工程师

其它课程>>



重要提醒!!内容中联系方式并非本站联系方式,报名咨询的学员请与下面最新联系方式联系我们咨询报名-以免损失!
>>长期招聘兼职招生代理人员,项目合作,团报优惠咨询,有意者请联系我们 >>咨询:13312524700(可加微信)。

昆明学历中心:◆咨询电话:0871-65385921、13312528471 赖老师、钱老师(微信报名:17787865775)点击这里给我发消息


云南地州中心:◆咨询电话:0871-65385921、17787865775 冯老师、 王老师(微信报名:17787865775)点击这里给我发消息


总部报名地址: ◆昆明市-五华区教场东路莲花财富中心10楼;网课试听:ke.xuekaocn.cn   点击这里立即咨询我们



地州分校:   大理分校   丽江分校   迪庆分校   怒江分校   红河分校   临沧分校   玉溪分校   文山分校   保山分校   德宏分校   昭通分校   普洱分校   版纳分校 【各地州学员请加老师微信咨询报名,电话(微信):133-1252-4700】;2021年云南省成人高考>>立即报名



职业技能考证:心理咨询师、健康管理师、茶艺师等更多>◆咨询电话:133 1252 4700(微信)点击这里咨询我们  

公考培训咨询:◆国考云南省考公务员/事业单位面授培训,咨询电话:133 1252 4700 (微信)点击这里立即咨询我们






温馨提示:因考试政策、内容不断变化与调整,学课在线网提供的以上信息仅供参考,如有异议,请考生以权威部门公布的内容为准!

免责声明:以上内容仅代表原创者观点,其内容未经本站证实,学课在线网对以上内容的真实性、完整性不作任何保证或承诺,转载目的在于传递更多信息,由此产生的后果与学课在线网无关;如以上转载内容不慎侵犯了您的权益,请联系我们QQ:1536696595,我们将会及时处理。




网友评论