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,把数据倒出来,然后再重新安装数据库,问题至此得到解决

9924

被折叠的 条评论
为什么被折叠?



