본문 바로가기
Oracle/운영

[JOB] Failure 초기화 하는 방법

by 취미툰 2021. 1. 26.
반응형

JOB은 자동적으로 프로시저등을 등록하여 INTERVAL에 따라 자동적으로 수행해줍니다.

FAILURE가 16회가 되면 JOB은 BROKEN이 되고 자동적으로 수행되지 않습니다.

 

BROKEN 여부를 Y(disable)과 N(enable)로 관리할 수도 있습니다.

하지만 제가 오늘 포스팅할 내용은 FAILURE가 16회가 되기전에 어떠한 이유(예를들어 프로시저가 새로 적용 되었는데 제대로 수행되지 않는 프로시저)로 FAILURE가 늘어난는것을 확인하여 프로시저를 원복 or 수정하여 제대로 수행되게 만든 후 DBA_JOBS 또는 USER_JOBS에서 FAILURE횟수를 0으로 초기화 하는 방법입니다.

 

방법 자체는 되게 간단합니다. 해당 JOB을 수동으로 다시 수행해주면 됩니다. 

EXECUTE DBMS_JOB.RUN(JOB번호);

 

아래의 테스트로 확인해보겠습니다.

 

1.테스트 테이블 및 프로시저 생성

테이블 생성
create table sys.jobtest
(DAY varchar2(100));


프로시저 생성
CREATE OR REPLACE PROCEDURE SYS.PL_JOBTEST
IS
BEGIN

insert into SYS.jobtest
select to_char(sysdate,'yyyy/mm/dd HH24:MI:SS') DAY
from dual;

commit;
END ;
/

 

2.5초마다 수행하는 JOB 생성

DECLARE

  JOBN number;

BEGIN
	DBMS_JOB.SUBMIT( JOBN  --jobno
					,'SYS.PL_JOBTEST;'  --what
					, sysdate + 5/86400  --next_date      
					, 'sysdate + 5/86400' --interval
					, TRUE --no_parse
                    );         
END;
/

 

3.잘 수행되는것 확인

SQL> select what,interval,broken,failures,total_Time,next_Date from user_jobs ;

WHAT	INTERVAL 				BROKEN   FAILURES TOTAL_TIME NEXT_DATE
--------------------------------------------------------------------------------
SYS.PL_JOBTEST; sysdate + 5/86400 N          0          0 25-JAN-21

 

4.프로시저를 수정하여 FAILURE 발생시키기

 

CREATE OR REPLACE PROCEDURE SYS.PL_JOBTEST
IS
BEGIN

insert into SYS.jobtest
select to_char(sysdate,'yyyy/mm/dd HH24:MI:SS') DAY , sysdate --sysdate 추가
from dual;

commit;
END ;
/


PL/SQL Created With Warning.

 

5. 일정시간(약 30초) 후 user_jobs 재확인

SQL> select what,interval,broken,failures,total_Time,next_Date from user_jobs ;

WHAT	INTERVAL 				BROKEN   FAILURES TOTAL_TIME NEXT_DATE
--------------------------------------------------------------------------------
SYS.PL_JOBTEST; sysdate + 5/86400 N          13          0 25-JAN-21

 

 

6.해결 - 프로시저 원복 후 JOB 수동 실행

프로시저 원복
CREATE OR REPLACE PROCEDURE SYS.PL_JOBTEST
IS
BEGIN

insert into SYS.jobtest
select to_char(sysdate,'yyyy/mm/dd HH24:MI:SS') DAY
from dual;

commit;
END ;
/


잡 수동 실행
execute dbms_job.run(5);

 

7.확인

SQL> select what,interval,broken,failures,total_Time,next_Date from user_jobs ;

WHAT	INTERVAL 				BROKEN   FAILURES TOTAL_TIME NEXT_DATE
--------------------------------------------------------------------------------
SYS.PL_JOBTEST; sysdate + 5/86400 N          0          0 25-JAN-21

 

BROKEN된 JOB도 마잔가지로 수동으로 수행해주면 초기화 됩니다. 즉 Y인 JOB이 N으로 바뀌고 FAILURE도 초기화된다는 것입니다.

 

 

FAILURE가 16이되고 BROKEN이 Y인 경우,

execute DBMS_JOB.BROKEN(JOB번호,false); 명령어로 BROKEN을 N으로 변경할 수 있습니다. 하지만 FAILURE는 초기화되지 않고 JOB은 계속해서 수행되지 않습니다. 수동으로 재시작해야 초기화되며 JOB이 다시 정상적으로 수행됩니다.

 

 

 

 

 

반응형

댓글