会滚段

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

 (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” ;

posted on 2014-09-07 20:35  Lishenyin  阅读(275)  评论(0编辑  收藏  举报

导航