机房环境:
os:windows 2008
数据库版本:oracle 11g
事件起因:
昨天公司运维说机房的hp服务器磁盘坏了,我当时冷汗一下子就出来了,因为这是测试库,没有备份,没有归档,但是里面可是有1.5t的数据啊,下午他们修了一下午,系统可以进去了,但是数据库在启动到open的时候报错system01数据文件缺失一千多个数据块,由于没有备份和归档,所以这个数据库是挂掉了。(dba们一定要做好备份,否则最后全是自己的事情),幸好我们还有一个一周前的冷备库,所以我直接物理迁移,把数据库恢复到一周以前了,恢复的过程非常简单,因为数据库必须的那些文件路径都已存在(如参数文件内的dump文件等),我只是把参数文件,密码文件,控制文件,数据文件恢复到指定的目录,然后直接startup,在nomount和mount阶段都是比较顺利的,而到open阶段的时候,则报错了让我闹心的ora-600ora-00600: internal error code, arguments: [kcratr_nab_less_than_odr]的错误,因为大家都知道,ora-600是数据库自己内部的bug,我也是第一次遇到,问了很多人大家都不会,所以只能自己去摸索解决,值得庆幸的是在摸索了一个小时后,我终于把数据库open了,以下就是我恢复的步骤,如果感觉对您有所帮助,那么请支持我一下。
//报错:ora-00600: internal error code, arguments: [kcratr_nab_less_than_odr], [1], [1770], [779181], [779205], [], [], [], [], [], [], []
//因为ora-600的错误没有具体提示,所以很多人无从下手,别着急,我们可以先去告警日志去看看,以下是我的告警日志信息:
ora-00600: internal error code, arguments: [kcratr_nab_less_than_odr], [1], [1770], [779181], [779205], [], [], [], [], [], [], [
incident details in: d:/app/administrator/diag/rdbms/ccxe/ccxe/incident/incdir_2570/ccxe_ora_2164_i2570.trc
aborting crash recovery due to error 600
errors in file d:/app/administrator/diag/rdbms/ccxe/ccxe/trace/ccxe_ora_2164.trc:
ora-00600: internal error code, arguments: [kcratr_nab_less_than_odr], [1], [1770], [779181], [779205], [], [], [], [], [], [], []
errors in file d:/app/administrator/diag/rdbms/ccxe/ccxe/trace/ccxe_ora_2164.trc:
ora-00600: internal error code, arguments: [kcratr_nab_less_than_odr], [1], [1770], [779181], [779205], [], [], [], [], [], [], []
ora-600 signalled during: alter database open...
tue may 10 10:13:10 2011
trace dumping is performing id=[cdmp_20110510101310]
tue may 10 10:13:11 2011
sweep [inc][2570]: completed
sweep [inc2][2570]: completed
tue may 10 10:29:52 2011
shutting down instance (immediate)
shutting down instance: further logons disabled
//我们通过告警日志文件好像也没查到什么有用的信息,别着急,我们还可以再查找对应的trc文件,我的对应trc文件则是ccxe_ora_2788_i2164.trc,以下是我的trc信息
warning! crash recovery of thread 1 seq 1770 is
ending at redo block 779181 but should not have ended before
redo block 779205
//看,有警告了,意思是我在恢复的时候,丢失了redo日志,当时我很纳闷,怎么会丢失redo呢?最后我把这个问题定位在传输redo的时候可能造成数据块的丢失,因为我以前发生过这类事情,所以我重新拷贝redo日志,再次将数据库启动。
incident 3771 created, dump file: d:/app/administrator/diag/rdbms/ccxe/ccxe/incident/incdir_3771/ccxe_ora_2164_i3771.trc
ora-00600: internal error code, arguments: [kcratr_nab_less_than_odr], [1], [1770], [779181], [779205], [], [], [], [], [], [], []
ora-00600: internal error code, arguments: [kcratr_nab_less_than_odr], [1], [1770], [779181], [779205], [], [], [], [], [], [], []
ora-00600: internal error code, arguments: [kcratr_nab_less_than_odr], [1], [1770], [779181], [779205], [], [], [], [], [], [], []
*** 2011-05-10 10:47:11.138
stopping background process mmnl
*** 2011-05-10 10:47:12.139
stopping background process mmon
*** 2011-05-10 10:47:13.259
ksukia: starting kill, flags = 1
ksukia: killed 0 out of 0 processes.
*** 2011-05-10 10:47:14.652
*** 2011-05-10 10:47:14.652 4132 krsh.c
arch: archival disabled due to shutdown: 1089
*** 2011-05-10 10:47:15.653
*** 2011-05-10 10:47:15.653 4132 krsh.c
arch: archival disabled due to shutdown: 1089
//重新拷贝redo日志到指定目录,再次启动数据库。
total system global area 6413680640 bytes
fixed size 2187728 bytes
variable size 754978352 bytes
database buffers 5637144576 bytes
redo buffers 19369984 bytes
database mounted.
ora-00338: log 4 of thread 1 is more recent than control file
ora-00312: online log 4 thread 1:
'd:/app/administrator/oradata/ccxe/redo04.log'
//报错果然不一样了,这次报错的意思是我的日志比我的控制文件新,要我恢复控制文件。
sql> recover database using backup controlfile until cancel; 指定日志文件恢复
specify log: {=suggested | filename | auto | cancel}
d:/app/administrator/oradata/ccxe/redo04.log
ora-00279: change 128488612 generated at 05/10/2011 11:13:52 needed for thread
ora-00289: suggestion :
d:/app/administrator/flash_recovery_area/ccxe/archivelog/2011_05_10/o1_mf_1_1771_%u_.arc
ora-00280: change 128488612 for thread 1 is in sequence #1771
ora-00278: log file 'd:/app/administrator/oradata/ccxe/redo04.log' no longer
needed for this recovery
specify log: {=suggested | filename | auto | cancel}
d:/app/administrator/oradata/ccxe/redo05.log
log applied.
media recovery complete.
sql> alter database open; -必须以resetlogs方式打开数据库
alter database open
error at line 1:
ora-01589: must use resetlogs or noresetlogs option for database open
sql> alter database open resetlogs ;
database altered.
ok,现在数据库起来了,通过这次出错我总结了几点,希望对大家有帮助
1:数据库不管是不是测试,都尽量备份,否则出问题哭都来不及。
2:数据库尽量归档,这样就可以恢复数据库在任何时刻。
3:出错时不要慌,要仔细查看报错信息,分析报错,根据自己所掌握的知识一步一步解决,当你把问题解决
时,你会发现排错的过程真的是一个非常提升自己的过程。
4:平常一定要有几个在这方面很强的朋友,因为有的时候并不是自己查资料就能查到的,更多的是需要朋友的
经验与帮助。
注:以上就是这次错误的全部过程,过段时间我会把近期所遇到的错误都整理一下,都分享给大家,通过近期的工作我感觉数据库真的是一个非常庞大的系统,每次遇到新错的时候我都会很郁闷的解决,因为我发现我的懂的还是太少了,学习毕竟是一个由点到线,由线到网的过程,一个问题由模糊到清晰,由清晰再模糊,反复来几遍最终都会很明白的。我们要有清晰的理论知识,出错的时候才会找到出题所在,作为一个dba冷静,清晰的头脑也很重要,通过dba的这个行业,也是非常锻炼自己的性格,希望大家都可以在dba的这条职场之路,越走越远,祝大家好运。
posted on 2015-03-20 15:08
坏男孩 阅读(1278)
评论(0) 编辑 收藏 所属分类:
oracle篇章