冤孽残念的Oracle数据恢复之8小时折腾  

今天有台Oracle数据库服务器被人强行拔电后就雅麦嗲了,朋友中午12点找到我求救。除去吃饭下班到现在一共折腾了8个小时终于刚刚把问题解决了。偶滴肾啊。。。

我真的有点很BS度娘,搜索出来的结果都是雷同雷同加雷同。幸亏本人还有一点点Oracle知识,整个解决过程如下(版权:30c.org):

服务器是WindowsServer2008,安装的Oracle10.2.0.症状是服务启动正常,也不会自动关闭。但是只能使用sysdba登录到空闲进程,startup提示oracle遇到致命错误,使用startup mount可以启动,但是无法alter database open。唯一能出现的像样点的错误提示就是在open时ORA-00603: ORACLE server session terminated by fatal error。使用trace跟踪并结合alert_dbname.log发现是ORA-00600: internal error code, arguments: [4194],基本确定肯定是undo和redo两口子吵架所致,基本不和谐到要准备办离婚证了,喵了个咪的。(30c.org)

最终的解决方案如下:

1.shutdown或者shutdown immediate或者shutdown abort,反正只要灭了它,但是服务别动。

2.重启你的oracleservice服务,别问为什么。并且在启动成功以后马上进入cmd输入sqlplus / as sysdba,然后输入

select segment_name, tablespace_name from dba_rollback_segs

看结果中_SYSSMU这个数字能从1到多少,自己记下来。因为10秒20秒以后你的数据库就是 oracle not available 了。信不信随你 30c。org

3.打开init.ora,搜索undo_management=AUTO修改为如下格式

undo_tablespace=UNDOTBS1
_corrupted_rollback_segments=(_SYSSMU1$,_SYSSMU2$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU....步骤2找到多少个写多少个)

4.回到cmd 继续sqlplus / as sysdba 输入

startup restrict  mount

然后

alter database datafile 'c:\ORACLE\ORADATA\ORCL\UNDOTBS01.DBF' offline drop;

再然后alter database open就可以了。你还可以看看现在的日志文件

show parameter undo
或者
select name from v$datafile;

可以删除错误的空间文件了

drop tablespace undotbs1 including contents

如果你这里出现错误,那恭喜你跟我一样悲剧了m(_-_)m,(30c.org~~)如果你没出现下面的错误,那请忽略第6,7条。

ORA-01548: 已找到活动回退段'_SYSSMU1$',终止删除表空间 满目的眼泪~~~

这到底是纳尼的错误呢?看看文件状态然后哑火了

select segment_name,status,tablespace_name from dba_rollback_segs;
SEGMENT_NAME STATUS TABLESPACE_NAME
------------------------------ ---------------- ------------------------------
SYSTEM ONLINE SYSTEM
_SYSSMU1$ NEEDS RECOVERY UNDOTBS1
_SYSSMU2$ NEEDS RECOVERY UNDOTBS1
_SYSSMU3$ NEEDS RECOVERY UNDOTBS1
_SYSSMU4$ NEEDS RECOVERY UNDOTBS1以下更多类似错误....

看来Oracle大爷果然不能随便断电,这么多东西需要recovery。不管他,咱先继续着。

5.创建新的表空间

create undo tablespace undotbs2 datafile ‘c:\ORACLE\ORADATA\ORCL\UNDOTBS01.DBF’ size 200M;
alter tablespace undotbs2 online;
alter system set undo_tablespace=undotbs2;

6.搜索你的配置文件Init.ora.1234567 最后这个数字会因为电脑而不同的。备份一个,然后修改源文件部分内容如下

ndo_management=manual
undo_retention=10800
undo_tablespace=undotBS2
_CORRUPTED_ROLLBACK_SEGMENTS =(_SYSSMU1$,_SYSSMU2$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU还是之前看到的那一串)

7.shutdown abort 不能用Shutdown Immediate Or Shutdown Normal 因为这样会出现回滚。

然后启动数据库:startup pfile=’c:\oracle\admin\orcl\pfile\init.ora.1234567′;

干掉那个还在挣扎的小姑娘 drop tablespace undotbs1 including contents后继续shutdown abort,恢复刚才备份的Init.ora.1234567.

8.把步骤三的内容改回来。什么?你没记下来。。。对不起,我也忘记说了。(30c.org邪恶的笑了。。。).再次启动startup,现在应该可以正常启动了.

9.恢复到unbotbs1

create undo tablespace undotBS1 datafile 'c:\oracle\oradata\orcl\UNDOTBS1.DBF' size 200M;
alter system set undo_tablespace=undotBS1;
drop tablespace undotbs2 including contents;

10.看看你的成果吧。

select segment_name,status,tablespace_name from dba_rollback_segs;

我觉得我应该收费。我的8个小时就这么浪费了去了。搜索引擎中找到的内容实在有点不靠谱,所以我加了不少站点名称。为了不再悲剧重演,请不要转载本篇文章,否则恭喜转载的各位生一个孩子俩菊花。

实在很累,睡觉去。

欢迎大佬支持本博客的发展 -- Donate --

本文链接:冤孽残念的Oracle数据恢复之8小时折腾

转载声明:本站文章若无特别说明,皆为原创,转载请注明来源:三十岁,谢谢!^^


分享到:          
  1. 哇塞,真的好复杂啊

  1. 没有通告