• 会滚段


    [转载]【原创】回滚段的一点理解

     (2012-08-22 23:34:38)
     

      UNDO表空间用于支持事务和数据的一致性。具体说,回退段的四大作用:交易的回退:没有提交的交易可以后悔.交易的恢复:数据库崩溃的时候,将写入磁盘的不正确数据恢复到交易前.读一致性:查询时结果集已经确定.闪回数据:从回退段中构造历史的数据.
       在一个数据库中可以存在多个UNDO表空间,不过任一时刻只能有一个UNDO表空间被激活。如果UNDO表空间设置过小会出现“ORA-01555"错误。

       在RAC环境,对UNDO的要求是:1)、所有实例的UNDO_MANAGEMENT必须相同;2)、必须为每个实例指定一个UNDO_TABLESPACE;

      管理回滚段方式:1)、手动管理 2)、自动管理(AUM)。两者区别:回滚段的名称由之前的ROLLBACK SEGENTMENT 变成了UNDO SEGMENT。 AUM时不能也不需要执行create/drop rollback segment 或者online/offline segment等操作.但在回滚段损坏,通常还要借助手工管理的方法才能修复。

      AUM之后,ORACLE就会:

       1)、自动创建1个系统回滚段,这个回滚段放在SYSTEM表空间上,并且名称为SYSTEM;

       2)、自动创建N个用户UNDO segment,n是根据参数SESSION的值确定的;这些用户回滚段会自动命名成_SYSSMUn$的格式;每个回滚段都是由PUBLIC所有;不再需要手工维护每个回滚段。

      与回滚段相关的视图:

      v$rollname和v$rollstat、DBA_ROLLBACK_SEGS、DBA_UNDO_EXTENTS 等;

    查看定期集群中所有回滚段信息:

    select segment_id,segment_name,owner,tablespace_name,status,instance_num from dba_rollback_segs

    order by 1 ;

     通过STRING命令得到回滚段的信息:

    如果数据库无法打开,无法通过dba_rollback_segs获得ROLLBACK SEGMENT列表,也可以通过STRING命令获得列表

    [root]strings system01.dbf |grep _SYSSMU|cut -d $ -f 1 |sort -u

     查询当前未提交事务正在使用的回滚段:

      select s.username,t.start_time,r.name name,t.ubafil,t.ubablk,log_io,phy_io

    from v$transaction t,v$rollname r,v$rollstat rs,v$session s where t.xidusn=r.usn

    and  t.ses_addr=s.saddr and rs.usn=r.usn  and s.sid in (select distinct sid from v$mystat);

    涉及的相关的隐含参数是_offline_rollback_segments _corrupted_rollback_segments.

       在自动UNDO管理模式下,我们有时仍然想手动删除UNDO段。比如某个UNDO段出现了逻辑坏块。
    下面首先来看看,直接删除UNDO段能不能成功。

    SQL> drop rollback segment "_SYSSMU9$";   
    1. drop rollback segment "_SYSSMU9$"  
    2. *   
    3. ERROR 位于第 1 行:   
    4. ORA-30025: 不允许 DROP 段 '_SYSSMU9$' (在撤消表空间中)  

    看来是行不通的。那么怎么样才能删除呢?试试下面的办法:

    SQL> alter session set "_smu_debug_mode"=4;   
    1.   
    2. 会话已更改。   
    3.   
    4. SQL> drop rollback segment "_SYSSMU9$";   
    5. drop rollback segment "_SYSSMU9$"  
    6. *   
    7. ERROR 位于第 1 行:   
    8. ORA-01545: 指定的回退段'_SYSSMU9$'不可用  

    还是不行。下面我们看看UNDO段的状态:

    SQL> select segment_name,status from dba_rollback_segs;   
    1.   
    2. SEGMENT_NAME                   STATUS   
    3. ------------------------------ ----------   
    4. SYSTEM                         ONLINE   
    5. _SYSSMU1$                      ONLINE   
    6. _SYSSMU2$                      ONLINE   
    7. _SYSSMU3$                      ONLINE   
    8. _SYSSMU4$                      ONLINE   
    9. _SYSSMU5$                      ONLINE   
    10. _SYSSMU6$                      ONLINE   
    11. _SYSSMU7$                      ONLINE   
    12. _SYSSMU8$                      ONLINE   
    13. _SYSSMU9$                      ONLINE   
    14. _SYSSMU11$                     OFFLINE  

    发现这个要删除的UNDO状态为ONLINE。下面我们将UNDO段置为OFFLINE状态,再删除:

    SQL> alter rollback segment "_SYSSMU9$" offline;   
    1.   
    2. 回退段已变更。   
    3.   
    4. SQL> drop rollback segment "_SYSSMU9$";   
    5.   
    6. 回退段已删除。  

    可以看到UNDO段已经被删除。这里首先把UNDO段OFFLINE,然后再DROP。值得注意的是,在没有修改”_smu_debug_mode”的情况下,UNDO段是不能OFFLINE的。

    总结:
    要在UNDO自动管理模式下删除UNDO段,需要三个步骤:

    • 执行alter session set “_smu_debug_mode”=4;
    • 执行 alter rollback segment “undo-segment-name” offline;
    • 执行 drop rollback segment “undo-segment-name” ;
  • 相关阅读:
    个人号微信机器人开发
    群控系统开发sdk服务端调用方法
    微信个人号scrm客服通信协议定义
    微信crm客服系统使用sdk定制开发(持续更新中!)
    微信客服crm系统接口定义(完善中)
    压测工具-ab
    设计模式之美学习-结构型-享元模式(二十五)
    设计模式之美学习-结构型-组合模式(二十四)
    设计模式之美学习-结构型-门面模式(二十三)
    设计模式之美学习-结构型-适配器模式(二十二)
  • 原文地址:https://www.cnblogs.com/isoftware/p/3960746.html
Copyright © 2020-2023  润新知