1. 程式人生 > >ORA-23421: job number 225 is not a job in the job queue

ORA-23421: job number 225 is not a job in the job queue

conn uil bms delet ext roc erro declare dba_jobs

  在對數據庫進行異機恢復之後,為了防止上面作業自動執行,擾亂正常業務系統,需要將測試庫上的作業和db_link進行刪除:
但是使用sys用戶連接進去,刪除的時候報如下錯誤
SQL> exec DBMS_JOB.broken(225,true);
BEGIN DBMS_JOB.broken(225,true); END;
*
ERROR at line 1:
ORA-23421: job number 225 is not a job in the job queue
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 86
ORA-06512: at "SYS.DBMS_IJOB", line 529
ORA-06512: at "SYS.DBMS_JOB", line 245
ORA-06512: at line 1


查看MOS,有兩種可能:
第一:不是job的owner的用戶delete,remove,broken一個job時,會報錯:ORA-23421: job number XXXX is not a job in the job queue
第二:job$的索引INDEX I_JOB_JOB 損壞,導致此錯誤

對於第一種:只有job的owner才能夠對job進行修改變更。
查詢找到job的owner PRIV_USER
SQL> select job, what, log_user,broken from dba_jobs where job=225;
JOB WHAT LOG_USER PRIV_USER B
---------- ---------------------------------------- ---------- ---------- -
225 WEB_SMS.cleanAppBuffer; SYSTEM SYSTEM N

用上面的sql語句中查詢到的PRIV_USER登錄數據庫
SQL> exec DBMS_JOB.broken(225,TRUE);
PL/SQL procedure successfully completed.


SQL> select job, log_user,broken from dba_jobs where job in (225);
JOB LOG_USER PRIV_USER B
---------- ---------- ---------- -
225 SYSTEM SYSTEM Y


另一種方法是以sys用戶:
SQL> exec DBMS_IJOB.broken(225,true);
PL/SQL procedure successfully completed.

SQL> select job, what, log_user, PRIV_USER,broken from dba_jobs where job=225;
JOB WHAT LOG_USER PRIV_USER B
---------- ---------------------------------------- ---------- ---------- -
225 WEB_SMS.cleanAppBuffer; SYSTEM SYSTEM Y


嘗試以system用戶執行命令此命令,會報錯:
SQL> exec DBMS_IJOB.broken(225,false);
BEGIN DBMS_IJOB.broken(225,false); END;
*
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00201: identifier ‘DBMS_IJOB.BROKEN‘ must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored


對於第二種情況,Rebuild the indexes related to job$:
SQL> CONN / AS SYSDBA
SQL> ALTER INDEX I_JOB_JOB REBUILD ONLINE;
SQL> ALTER INDEX I_JOB_NEXT REBUILD ONLINE;

ORA-23421: job number 225 is not a job in the job queue