恢复误删Oracle数据库所有文件后出现ORA-08102: index key not found……
问题原因:一个数据库,由于误删了所有的文件,包括控制文件、在线重做日志文件、数据文件、归档日志文件等等,通过操作系统层面的方法恢复了控制文件、数据文件,但是日志文件是无法恢复的,这个时候只能通过重建控制文件、_allow_resetlogs_corruption、_corrupted_rollback_segments等一系列动作强制打开数据库,打开数据库后,alert日志出现以下报错: Errors in file /oracle/admin/source/bdump/source_j000_17181.trc:ORA-12012: error on auto execute of job 64ORA-08102: index key not found, obj# 239, file 1, block 846 (2)Sat Aug 18 00:56:01 2012Errors in file /oracle/admin/source/bdump/source_j000_17181.trc:ORA-00604: error occurred at recursive SQL level 1ORA-08102: index key not found, obj# 239, file 1, block 846 (2)ORA-12012: error on auto execute of job 64ORA-08102: index key not found, obj# 239, file 1, block 846 (2) 查看/oracle/admin/source/bdump/source_j000_17181.trc,内容如下:ksedmp: internal or fatal errorCurrent SQL statement for this session:update sys.job$ set failures=0, this_date=null, flag=:1, last_date=:2, next_date = greatest(:3, sysdate), total=total+(sysdate-nvl(this_date,sysdate)) where job=:4----- Call Stack Trace -----ora-08102这种错误说明索引或表出现了数据不一致的,索引上记录的键值和表里的数据不一致,引起访问失败,一般重建下索引就可以解决。解决过程:SQL> col OBJECT_NAME format a20SQL> SELECT owner, object_name, object_type 2 FROM Dba_Objects 3 WHERE object_id IN (239);OWNER OBJECT_NAME OBJECT_TYPE------------------------------ -------------------- -------------------SYS I_JOB_NEXT INDEX可以查出object_name的名字,发现是表SYS的索引,然后重建索引这个时候需要使用rebuild online,因为他会重新读表来创建索引,而rebuild可能会读取原先的索引段而不会去读表。SQL> alter index I_JOB_NEXT rebuild online;Index altered.通过以上的方法得到解决。如果以上的方法还不能解决,就删除重新创建SQL> select index_name,column_name from all_ind_columns where index_name='I_JOB_NEXT';INDEX_NAME COLUMN_NAME---------------------------------------------------I_JOB_NEXT NEXT_DATESQL> drop index I_JOB_NEXT;SQL> create index I_JOB_NEXT on job$(next_date);测试后正常。