10.10.2 如何处理回滚段损坏(1)
如果生产环境中遇到了回滚段的损坏,当然***的方法当然是完全恢复,不过如果现实条件不允许的话(比如没有备份,或恢复时间太长),对于回滚段还可以有一种非常规的手段,这个手段的处理流程如图10-4所示。之所以可以这么处理,因为回滚段是用来支持事务的,如果事务提交,回滚段中的数据就没用了。如果事务尚未提交时回滚段发生了损坏,我们可以强制事务提交,这样只会损失部分数据一致性。有些时候,这种损失是允许的,接下来我们就通过两个例子来演示。
(点击查看大图)图10-4 UNDO表空间或者回滚段发生损坏时的处理方法
1.没有活动事务的处理
如果损坏的回滚段中已经没有了活动事务,那这个回滚段其实是可以删除的,而且删除后数据也不会由任何损失。我们来看一下这个例子。
(1)系统当前没有任何活动事务:SQL>select usn,xacts from v$rollstat
2 where xacts<>0;
no rows selected
(2)数据库异常关闭:SQL>shutdown abort;
ORACLE instance shut down.
(3)删除undo文件,模拟数据库损坏:[oracle@dbs testzxm1]$ mv undotbs01.dbf undotbs01.dbf.ori
(4)启动数据库:SQL>startup ;
ORACLE instance started.
Total System Global Area 3221225472 bytes
Fixed Size 2024200 bytes
Variable Size 570428664 bytes
Database Buffers 634022912 bytes
Redo Buffers 14749696 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 2 – see DBWR trace file
ORA-01110: data file 2: ‘/zxm/testzxm1/testzxm1/undotbs01.dbf’
(5)因为数据文件已经无法恢复,所以只好把这个数据文件offline:SQL>alter database datafile ‘/zxm/testzxm1/
testzxm1/undotbs01.dbf’ offline drop;
Database altered.
然后打开数据库:SQL>alter database open;
Database altered.
(6)查看各个回滚段的状态:SQL>select status,count(*) from dba_rollback_segs group by status;
STATUS COUNT(*)
—————- ———-
ONLINE 1
NEEDS RECOVERY 9
OFFLINE 355
SQL>select segment_name,status from dba_rollback_segs
where status<>’OFFLINE’
/
SEGMENT_NAME STATUS
—————————— —————-
SYSTEM ONLINE
_SYSSMU1$ NEEDS RECOVERY
_SYSSMU2$ NEEDS RECOVERY
_SYSSMU3$ NEEDS RECOVERY
_SYSSMU4$ NEEDS RECOVERY
_SYSSMU5$ NEEDS RECOVERY
_SYSSMU7$ NEEDS RECOVERY
_SYSSMU8$ NEEDS RECOVERY
_SYSSMU9$ NEEDS RECOVERY
_SYSSMU10$ NEEDS RECOVERY
10 rows selected.
【责任编辑:云霞 TEL:(010)68476606】
点赞 0