undo表空间损坏

UNDOTBS损坏处理方案

 

 

1:一直处理控制文件损坏,未处理过undo表空间损坏的问题,今天处理了一次,总结下处理该问题的步骤如下

 

 

 

2:处理过程

 

 

2.1:直接启动数据库,alter database open 以后,系统直接提示,实例强制中断,就没有下文了

操作如下:  sqlplus / as sysdba

 

系统提示:连接到空闲进程

 

继续执行命令: alter database open

 

系统提示:ORA-01092: ORACLE 实例终止。强制断开连接

 

 

2.2未进行分析,以为数据库文件损坏,就直接进行了数据库恢复

 

Recover database

 

Recover datafile 1

 

Recover datafile 2

 

系统提示 :介质恢复成功

 

以为恢复成功就,直接,startup force ,系统提示跟刚刚的一样

 

系统提示:ORA-01092: ORACLE 实例终止。强制断开连接

 

 

2.3分析问题,查找原因

 

查找系统的日志文件:D:\oracle\product\10.2.0\admin\hr\bdump

alert_hr.log

 

ORA-01578: ORACLE 数据块损坏 (文件号 2, 块号 89)

ORA-01110: 数据文件 2:'D:\ORACLE\PRODUCT\10.2.0\ORADATA\HR\UNDOTBS01.DBF'

 

发现是undotbs01,数据文件损坏,

 

 

 

 

2.4找到问题以后,解决问题方案

 

 

思路如下:(先把原来的undotbs offline 然后启动数据库,新建一个undotbs2,然后,把系统默认的 undo表空间设置为tbs2)

 

 

这里出现问题的是UNDO表空间,如果UNDO表空间中没有要回滚的数据,那么问题比较简单,因为Oracle可以更换UNDO表空间,只需要直接将UNDO表空间的数据文件OFFLINE,启动数据库后,新建一个UNDO表空间,并切换当前的UNDO表空间即可。

但是如果UNDO表空间中记录了要回滚的数据,那么恢复操作就会更复杂了。

尝试OFFLINE出现问题的数据文件:

 

 

 

ALTER DATABASE DATAFILE'D:\oracle\product\10.2.0\oradata\hr\UNDOTBS01.DBF' OFFLINE;

 

下线以后,直接再启动数据库

 

 

ALTER DATABASE OPEN;

 

系统可能提示,打开成功,也可能提示,数据库无法找到对应的UNDOTBS01.DBF文件

 

,所以不用管他,查看下系统当前的状态

 

select status fromv$instance;

 

查看数据库是open状态

 

 

下面可以为系统创建新的UNDO表空间,并实现切换:

 

CREATE UNDO TABLESPACEUNDOTBS2 DATAFILE

'D:\oracle\product\10.2.0\oradata\hr\UNDOTBS02.DBF'SIZE 200M;

 

 

修改当前默认的undo表空间为tbs02

 

ALTER SYSTEM SETUNDO_TABLESPACE = UNDOTBS2;

 

 

修改过后,再次尝试打开数据库(发现数据库仍然无法打开,并且停止都无法停止)

执行:shutdown  immediate(系统提示找不到对应的tbs01文件)

 

SHOW PARAMETERUNDO_TABLESPACE (显示的也是tbs02)

 

 

2.5 继续解决问题

 

分析:分明已经设置了对应的表空间为新建立的,但是系统重启后,为什么还是无法识别,还要找原来的undo表空间那(查找资料后发现原来undo表空间储存了回退字段,导致每次都要先加载这些回退字段,因为这些回退字段储存在undotbs1中,所以需要先删除掉这些回退字段

现在问题就是前面所提到的,OFFLINE的UNDO表空间中保存着需要进行回滚的记录,而这些记录会导致数据库部分内容还没有最终恢复完成,在此之前受影响的部分对象是无法正常访问的。

 

 

 

解决方案:

 

默认情况下,无法直接删除这些回退字段,需要借助spfile启动,增加一些隐藏参数以后才能删除,处理方法如下

 

 

 

1:先查询下那些里边储存这待恢复的数据

SELECT SEGMENT_NAME, OWNER,TABLESPACE_NAME, STATUS
FROM DBA_ROLLBACK_SEGS;

SEGMENT_NAME OWNER TABLESPACE_NAME STATUS

 

 

2:修改系统的spfile启动文件,默认路径如下

 

 

 

D:\oracle\product\10.2.0\admin\hr\pfile\init.ora.14201794940

 

 

需要修改的有两个地方(修改为手动,并且,undo修改为新的undotbs2)

 

undo_management=MANUAL

undo_tablespace=UNDOtbs2

 

 

在文件结尾增加隐藏参数

 

_offline_rollback_segments=(_SYSSMU1$,_SYSSMU2$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$)

 

修改后,再次启动数据库(因为无法执行 shutdown immediate,进行关闭重启,所以先执行如下)

 

Shutdown abort

 

Startup pfile=’D:\oracle\product\10.2.0\admin\hr\pfile\init.ora.14201794940’

 

启动数据库,启动时候,系统继续报错,还是提示找不到对应的tbs01

 

这个时候就可以删除回退字段了

 

 

DROP ROLLBACK SEGMENT"_SYSSMU1$";

DROP ROLLBACK SEGMENT"_SYSSMU2$";

DROP ROLLBACK SEGMENT"_SYSSMU3$";

DROP ROLLBACK SEGMENT"_SYSSMU4$";

DROP ROLLBACK SEGMENT"_SYSSMU5$";

DROP ROLLBACK SEGMENT"_SYSSMU6$";

DROP ROLLBACK SEGMENT"_SYSSMU7$";

DROP ROLLBACK SEGMENT"_SYSSMU8$";

DROP ROLLBACK SEGMENT"_SYSSMU9$";

DROP ROLLBACK SEGMENT"_SYSSMU10$";

 

删除过以后,再次执行启动数据库操作

 

 

 

Startup pfile=’D:\oracle\product\10.2.0\admin\hr\pfile\init.ora.14201794940’

 

 

 

 

 

2.6收尾工作

 

执行以上命令以后,发现数据库已经可以正常启动了,查询表,也可以查询到数据了

 

,这个时候,赶紧exp,把数据倒出来,然后再重新安装数据库,问题至此得到解决

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值