ITPub博客

首页 > Linux操作系统 > Linux操作系统 > ORA-08102 index key的错误恢复

ORA-08102 index key的错误恢复

原创 Linux操作系统 作者:ilsyx 时间:2012-06-11 23:45:14 0 删除 编辑

一 总体描述

自己的实验虚拟数据库中的alert不停的报下面的错误.alert日志刷的闹心.

Sun Jun 10 23:44:42 2012
Errors in file /u01/app/oracle/product/10.2.0/db_1/admin/testb/bdump/testb_j000_4944.trc:
ORA-00604: error occurred at recursive SQL level 1
ORA-08102: index key not found, obj# 239, file 1, block 1674 (2)
ORA-12012: error on auto execute of job 21
ORA-08102: index key not found, obj# 239, file 1, block 1674 (2)

二 操作环境

OS

$cat /etc/redhat-release
Red Hat Enterprise Linux Server release 5.6 (Tikanga)
$uname -a
Linux stu00 2.6.18-238.el5 #1 SMP Tue Jan 4 15:24:05 EST 2011 i686 i686 i386 GNU/Linux

DB

SQL> set lines 150
COL PRODUCT FORMAT A55
COL VERSION FORMAT A15
COL STATUS FORMAT A15
SELECT * FROM PRODUCT_COMPONENT_VERSION;SQL> SQL> SQL> SQL>

PRODUCT                                                 VERSION         STATUS
------------------------------------------------------- --------------- ---------------
NLSRTL                                                  10.2.0.4.0      Production
Oracle Database 10g Enterprise Edition                  10.2.0.4.0      Prod
PL/SQL                                                  10.2.0.4.0      Production
TNS for Linux:                                          10.2.0.4.0      Production

SQL>

other

三 排错思路概况

1.报错信息ORA-12012: error on auto execute of job 21,ORA-08102: index key not found, obj# 239, file 1, block 1674 (2) 是由于job 21执行的时候没有找到索引key.所以alert日志不停的刷.
2.查询job
3.查询索引
4.重建索引

四 详细步骤操作

1.查看 /u01/app/oracle/product/10.2.0/db_1/admin/testb/bdump/testb_j000_4944.trc文件内容(汗,看不懂,这里跳过)
2.根据排错思路查看job 21的情况:
SQL> r
  1* select job,log_user,interval,what from dba_jobs where job=21

       JOB LOG_USER                       INTERVAL                       WHAT
---------- ------------------------------ ------------------------------ ------------------------------------------------------------
        21 SYS                            sysdate + 1 / (24 * 60)        EMD_MAINTENANCE.EXECUTE_EM_DBMS_JOB_PROCS();

SQL>
原来是EM的维护操作,1分钟执行一次.
3.查询obj# 239号是什么obj:
SQL> r
  1* select owner,object_name,object_id,object_type,status from DBA_OBJECTS  where OBJECT_ID=239

OWNER                          OBJECT_NAM  OBJECT_ID OBJECT_TYPE         STATUS
------------------------------ ---------- ---------- ------------------- ---------------
SYS                            I_JOB_NEXT        239 INDEX               VALID

SQL>
obj# 239真是一个索引哈,看status是valid的,这里竟然不一致.不管为什么不一致了,先解决这个alert再说. (嘿嘿,实验机有快照,有兴趣再研究的请留言)
4.重建问题索引:(使用在线重建方式)
SQL> ALTER INDEX I_JOB_NEXT REBUILD ONLINE;

Index altered.

SQL>
5.观察alert日志是否还有错误产生.
6.日志已无报错.

五 个人总结

面对报错不要心急,静心的去分析每一个报错提示.官方支持文档中有说使用索引重建方式依然解决不了alert日志报错的.唯有重建索引一种方式.这里附上使用dbms_metadata.get_ddl查找索引ddl的方式.

SQL> select DBMS_METADATA.GET_DDL('INDEX','I_JOB_NEXT','SYS') from dual;

DBMS_METADATA.GET_DDL('INDEX','I_JOB_NEXT','SYS')
--------------------------------------------------------------------------------

  CREATE INDEX "SYS"."I_JOB_NEXT" ON "SYS"."JOB$" ("NEXT_DATE")
  PCTFREE 10 I


SQL>

六 资料参考引用

ORA-08102: TRYING TO MANIPULATE A JOB IN DBA_JOBS [ID 1036858.6]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/11780477/viewspace-732508/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-06-12

  • 博文量
    194
  • 访问量
    578555