客户的数据库出现了ORA-1251错误,进而引发了ORA-600(kjccgmb:l)错误。
数据库版本是9208 RAC for Linux X86-64。客户数据库一个数据文件突然不可用,被置为OFFLINE状态:
ORA-01171: datafile 44 going offline due TO error advancing checkpoint ORA-01122: DATABASE file 44 failed verification CHECK ORA-01110: DATA file 44: '/dev/raw/raw77' ORA-01251: UNKNOWN File Header Version READ FOR file NUMBER 44 |
随后不久,另一个节点的会话出现ORA-600错误:
Sat Oct 22 20:35:09 OUT OF memory FOR message buffers Errors IN file /oracle/admin/adb/bdump/adb1_lms3_4982.trc: ORA-00600: internal error code, arguments: [kjccgmb:l], [], [], [], [], [], [], [] Sat Oct 22 20:35:09 Errors IN file /oracle/admin/adb/bdump/adbl_lms3_4982.trc: ORA-00603: oracle server SESSION TERMINATED BY fatal error ORA-00600: internal error code, arguments: [kjccgmb:l], [], [], [], [], [], [], [] |
在MOS上没有找到任何与这个ORA-600错误有关的信息,根据错误信息和现象可以推断,由于前面的错误导致数据库文件OFFLINE,导致Oracle在处理全局数据块信息的时候出现了异常,从而引发了这个错误。
客户随后尝试了RESIZE以及RECOVER大量的操作都没有解决问题,尝试通过备份进行恢复,却发现上次备份到当前的归档日志中丢失了几个。
对于这个ORA-1251的错误,Oracle的解释是读写丢失或硬件问题或者Oracle的文件头被外部的进程覆盖。
Oracle官方给出的解决方案是利用这个数据文件创建以来所有的归档进行恢复,其实如果有可用的备份和归档,那么直接恢复数据文件就可以了。
对于当前的这个环境,没有什么其他的好办法了,只好通过DUL来抽取客户的数据了。