一 整體描述linux
本身的實驗虛擬數據庫中的alert不停的報下面的錯誤.alert日誌刷的鬧心.sql
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:oracle
ORA-00604: error occurred at recursive SQL level 1app
ORA-08102: index key not found, obj# 239, file 1, block 1674 (2)spa
ORA-12012: error on auto execute of job 21日誌
ORA-08102: index key not found, obj# 239, file 1, block 1674 (2)blog
二 操做環境索引
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 keynot 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]