[转载]【原创】回滚段的一点理解
(2012-08-22 23:34:38)
原文地址:【原创】回滚段的一点理解作者:Ryan
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$";
- drop rollback segment "_SYSSMU9$"
- *
- ERROR 位于第 1 行:
- ORA-30025: 不允许 DROP 段 ‘_SYSSMU9$‘ (在撤消表空间中)
看来是行不通的。那么怎么样才能删除呢?试试下面的办法:
SQL> alter session set "_smu_debug_mode"=4;
- 会话已更改。
- SQL> drop rollback segment "_SYSSMU9$";
- drop rollback segment "_SYSSMU9$"
- *
- ERROR 位于第 1 行:
- ORA-01545: 指定的回退段‘_SYSSMU9$‘不可用
还是不行。下面我们看看UNDO段的状态:
SQL> select segment_name,status from dba_rollback_segs;
- SEGMENT_NAME STATUS
- ------------------------------ ----------
- SYSTEM ONLINE
- _SYSSMU1$ ONLINE
- _SYSSMU2$ ONLINE
- _SYSSMU3$ ONLINE
- _SYSSMU4$ ONLINE
- _SYSSMU5$ ONLINE
- _SYSSMU6$ ONLINE
- _SYSSMU7$ ONLINE
- _SYSSMU8$ ONLINE
- _SYSSMU9$ ONLINE
- _SYSSMU11$ OFFLINE
发现这个要删除的UNDO状态为ONLINE。下面我们将UNDO段置为OFFLINE状态,再删除:
SQL> alter rollback segment "_SYSSMU9$" offline;
- 回退段已变更。
- SQL> drop rollback segment "_SYSSMU9$";
- 回退段已删除。
可以看到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” ;