冤孽残念的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个小时就这么浪费了去了。搜索引擎中找到的内容实在有点不靠谱,所以我加了不少站点名称。为了不再悲剧重演,请不要转载本篇文章,否则恭喜转载的各位生一个孩子俩菊花。
实在很累,睡觉去。
分享到: | |
哇塞,真的好复杂啊