oracle10g服务器断电后的恢复
一、问题描述
天气原因,暴雨连连,导致所在机房突然断电,oracle10g服务器断电,来电以后数据库无法正常启动。
二、错误现象
登录oracle10g所在服务器Windows2003,启动数据库:
Sqlplus / as sysdba
startup
Error at line1:
Ora-01113:file 5 needs media recovery
Ora-01110:data file 5:’D:\oracle\product\10.2.0\oradata\orcl\cqq.dmp’
三、问题分析
从报错内容上看是文件5需要介质恢复,于是敲如下命令:
recover datafile 5;
继续报错:
Ora-00283:recovery session canceled due to errors
Ora-00354:corrupt redo log block header
0ra-00353:log corruption near block 50571 change 13***(scn) 07/05/2016 13:57:24
Ora-00312:online log 2 thread 1:
‘D:\oracle\product\10.2.0\oradata\orcl\redo02.log’
分析:从报错上看是恢复文件5需要日志文件2,但是日志文件2损坏了,导致介质恢复失败;
(1)于是继续查看有没有归档日志文件:通过查看归档模式,发现数据库为非归档模式,寻找归档的日志文件进行不下去;
(2)再查看redo 2是处于什么状态,如果处于active状态就比较麻烦(待研究)
(3)查看本机的redo 2是处于inactive状态,可以进行下一步操作
(4)又试了一下alter database open clear logs;
(5)这时尝试了一下 recover database until cancel,再alter database open,还是报文件5需要介质恢复
(6)接着又尝试将清空日志启动,因为需要的日志文件2状态为inactive,所以在断电之前,该日志文件已经归档提交,数据已经更新至数据文件,所以可以进行alter database open resetlogs;
(7)此时提示要使用flashcovery里的文件恢复:auto/cancel,但是去flashcovery路径下并没有找到提示的那个文件,选择auto和cancel没有用;
(8)又试着在pfile里添加隐含参数来强制启动数据库:(拉库,跳过实例恢复这个步骤)
#############添加隐含参数##################
*._allow_resetlogs_corruption=TRUE
*._allow_error_simulation=TRUE
##########################################
*.undo_managment=’manual’
*.undo_tablespace=’SYSTEM‘既然时启动需要回滚,那么之前的回滚段数据是不一致的,所以换一个回滚段来启动
(9)用pfile启动,数据库启动成功!
(10)但过了10分钟之后,数据库再次宕掉,查看日志文件报错ora00600、00474,分析是进程还再进行实例恢复,但是已经找不到可以恢复的记录,smon及将数据库停掉。
三、问题解决
1、Ora-00600、ora-00474网上找了很多办法都没有解决掉,无赖作最坏的打算,将客户需要的数据备份出来,准备重新建库导入;
2、在备份的时候发现有个表导出始终报ora-01555快照过旧,查询这个表也报这个错误,这个表确实比较大,于是尝试着增大undo表空间、修改undo_rentention都无果,SMON进程一致尝试实例恢复;
3、尝试创建undo表空间,再删除之前的表空间,删除undotbs1的时候发现系统提示ora-01548,发现回滚段中依然存在基于undotbs1的活动事物,后台还再尝试进行回滚,但是系统已无可提供回滚的记录支持select*from dba_rollback_segs;
4、要想把这些回滚信息删了,采取在pfile中添加一些参数来做:
*.undo_management=manual
*.undo_retention=10800
*.undo_tablespace=undotBS2新建的undo表空间
*._CORRUPTED_ROLLBACK_SEGMENTS=(_SYSSMU1
,
S
Y
S
S
M
U
2
,_SYSSMU2
,SYSSMU2,_SYSSMU3
,
S
Y
S
S
M
U
3
,_SYSSMU3
,SYSSMU3,_SYSSMU4
,
S
Y
S
S
M
U
5
,_SYSSMU5
,SYSSMU5,_SYSSMU6
,
S
Y
S
S
M
U
7
,_SYSSMU7
,SYSSMU7,_SYSSMU8
,
S
Y
S
S
M
U
9
,_SYSSMU9
,SYSSMU9,_SYSSMU10$)
5、用pfile启动数据库成功,之前查询那个大表报ora-01555的错误不见了,删除undotbs1成功,再创建undotbs1
6、再重新修改undo表空间为自动管理,并且设置默认undo表空间为undotbs1,通过init参数修改。
*.undo_management=auto
*.undo_retention=10800
*.undo_tablespace=undotbs1
7、pfile启动数据库成功,创建spfile,再重用spfile启动,这样可以修改oracle的一些启动参数了。
问题解决!