2017-10-08 19 views
-3

5 분마다 화요일부터 일요일까지 작업을 정의했습니다. 22:00Oracle DBMS 작업이 실행되고 있지 않음

BEGIN 
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'GET_INVOICES_JOB', 
job_type => 'PLSQL_BLOCK', 
job_action => 'BEGIN LOPES.GET_INVOICES; END;', 
repeat_interval =>'FREQ=MINUTELY; INTERVAL=5; BYHOUR=9,22; BYDAY=TUE,WED,THU,FRI,SAT,SUN', 
enabled => TRUE, 
comments => 'GET_INVOICES'); 
END; 
/

그러나 일 오전 9시에서 확인 될 것으로 보인다 작업 확인

SELECT * 
FROM USER_SCHEDULER_JOB_RUN_DETAILS 
ORDER BY LOG_DATE DESC 

cheking 실행되지 않습니다

enter image description here

및 작업을 수동으로 실행하면 절차가 실행되지만 5 분마다 한 번만 실행됩니다.

답변

1

이것은 가장 일반적인 스케줄러 질문 중 하나입니다. 여기에 몇 가지 일반적인 문제와 해결 방법이 나와 있습니다.

1) job_queue_processes (이것은 일반적인 문제)가 job_queue_processes의 값은 주어진 시간에 실행될 수 DBMS_SCHEDULER 및 DBMS_JOB 작업의 총 수를 제한 너무 낮을 수있다. 이 경우인지 확인하려면 job_queue_processes의 현재 값을 확인하십시오. 으로 SQL을 선택하십시오. v $ parameter where name = 'job_queue_processes'; 그런 다음 실행중인 작업 수를 확인하십시오. SQL> select count () from dba_scheduler_running_jobs; SQL> select count () from dba_jobs_running;

이 문제가 발생하면 을 사용하여 매개 변수를 늘릴 수 있습니다. SQL> alter system set job_queue_processes = 1000;

2) max_job_slave_processes가 너무 낮을 수 있음 이 매개 변수가 NULL이 아닌 경우 한 번에 실행될 수있는 dbms_scheduler 작업의 수를 제한합니다. 이것이 문제가되는지 확인하려면 을 사용하여 현재 값을 확인하십시오. dba_scheduler_global_attribute에서 값을 선택하십시오. 여기서 attribute_name = 'MAX_JOB_SLAVE_PROCESSES'; 그런 다음 실행중인 작업 수를 확인하십시오. SQL> select count (*) from dba_scheduler_running_jobs;

이 (널 (null) 'max_job_slave_processes') 당신이 수를 증가하거나 SQL> 간부 dbms_scheduler.set_scheduler_attribute를 사용을 NULL 수있는 문제

3) 세션 이 매개 변수는 제한이 너무 낮을 수있다 인 경우 언제든지 세션 수. 모든 스케줄러 작업 에는 2 개의 세션이 필요합니다. 문제가 있는지 확인하려면 을 사용하여 현재 valule을 확인하십시오. SQL> v $ parameter where name = 'sessions'에서 값 선택; 그런 다음 을 사용하여 현재 세션 수를 확인하십시오. SQL> v $ session에서 count (*)를 선택하십시오.

숫자가 너무 가까우면 을 사용하여 최대 값을 늘릴 수 있습니다. SQL> alter system set job_queue_processes = 200;

4) 최근에 시간대 업데이트 패치를 적용했거나 데이터베이스를 최신 시간대 정보가있는 버전으로 업그레이드 했습니까? 시간대 정보를 업데이트 할 때 어떤 단계를 건너 뛰면 작업이 실행되지 않을 수 있습니다.이 이 해당되는지 확인하려면 SQL> select * from sys.scheduler $ _job; 및 SQL> select * from sys.scheduler $ _window; 오류없이 완료되었는지 확인하십시오.

시간대 경고가 표시되면 업그레이드 또는 시간대 패치를 다시 적용하여 모든 단계를 수행하십시오.

5) 데이터베이스가 제한 모드로 실행 중입니까? 데이터베이스가 제한 모드에서 실행 중이면 11g를 사용하고 ALLOW_RUNS_IN_RESTRICTED_MODE 속성을 사용하지 않는 한 작업이 실행되지 않습니다. 이 사용을 확인하려면 SQL> v $ instance에서 로그인 선택;

로그인이 제한되면 을 사용하여 제한 모드를 비활성화 할 수 있습니다. SQL> ALTER SYSTEM DISABLE RESTRICTED SESSION;

6) 작업이 다운 된 인스턴스에서 실행되도록 예약 되었습니까?

instance_id가 작업에 설정되어 있는지 (dba_scheduler_jobs 뷰를 확인하십시오) 확인하여 확인할 수 있습니다. 그렇다면 인스턴스가 가동 중인지 확인해야합니다.

7) 작업이 어떤 인스턴스에서 시작되지 않은 서비스에서 실행되도록 예약되어 있습니까?

작업이 가리키는 job_class를 확인한 다음 해당 클래스가 서비스를 가리키고 있는지 확인할 수 있습니다. 실행중인 경우 적어도 하나의 실행중인 인스턴스에서 서비스가 시작되었는지 확인하십시오. dbms_service.start_service를 사용하여 인스턴스에서 서비스를 시작할 수 있습니다.

8) 자원 관리자가 제한적인 자원 계획에 적용됩니까?

제한적인 자원 계획이 유효한 경우, 스케줄러 작업에 할당 된 자원이 충분하지 않아서 실행되지 않을 수 있습니다. 어떤 자원 계획이 효과가 있는지 확인할 수 있습니다.

SQL> V $ RSRC_PLAN에서 이름 선택;

계획이 효과적이지 않거나 적용 계획이 INTERNAL_PLAN이면 자원 관리자가 적용되지 않습니다. 리소스 관리자가 유효하다면 수행 할 수 있습니다.

SQL> alter system set resource_manager_plan = '';

9) 스케줄러가 비활성화 되었습니까? 이것은 지원되는 동작이 아닙니다. 누군가가 어쨌든 그것을했을 가능성이 있습니다. . 이 dba_scheduler_global_attribute에서 SQL> 선택 값을 확인하려면 어디 ATTRIBUTE_NAME = 'SCHEDULER_DISABLED'

이 쿼리가 TRUE를 반환하면 다음이 사용 SQL> 간부 DBMS_SCHEDULER를 해결할 수 있습니다.set_scheduler_attribute ('scheduler_disabled', 'false'); 작업이 실행되는 이유

이유 후반

1)을 확인하기 위해 우선이 작업이 SQL>를 선택 소유자, 작업 이름, dba_scheduler_jobs에서 next_run_date로 예정되어있는 시간대이다;

작업이 잘못된 시간대에있는 경우 예상 시간 인 시간에 실행되지 않을 수 있습니다. next_run_date가 미국/태평양과 같이 지정된 시간대 대신 절대 시간대 오프셋 ( +08 : 00)을 사용하는 경우 일광 절약 시간제가 적용될 경우 이 예상대로 실행되지 않을 수 있습니다.이 시간대는 일 수 있습니다 일찍 또는 늦게.

2) 작업이 실행될 예정이었을 때 위에 나온 제한 중 하나 인 중 하나가 일시적으로 도달하여 작업이 지연 될 수 있습니다. 위의 제한이 충분한 지 확인하고 가능한 경우 동안 작업이 지연되는 시간을 확인하십시오.

3) 위의 제한 중 하나가 발생할 수있는 한 가지 이유는 유지 관리 창이 적용되었을 수 있기 때문입니다. 유지 관리 창은 MAINTENANCE_WINDOW_GROUP이라는 창 그룹에 속한 스케줄러 창입니다. 예약 된 유지 관리 기간 중에 여러 유지 관리 작업이 작업을 사용하여 실행됩니다. 이로 인해 위에서 열거 한 제한 중 하나 인 이 발생하고 사용자 작업이 지연 될 수 있습니다. 이에 대한 자세한 내용은 관리자 안내서 ( )를 참조하십시오 (24 장).

유지 관리 창 목록을 얻으려면 SQL> select * from dba_scheduler_wingroup_members;

창이 실행되는시기를 확인하려면 SQL> select * from dba_scheduler_windows;

이 문제를 해결하려면 제한 시간을 늘리거나 유지 관리 기간을 더 편리한 시간에 실행하도록 일정을 조정할 수 있습니다. 이 중 어느 것도, 여기 당신이 무슨 일이 일어나고 있는지 그림을 시도하기 위해 취할 수있는 몇 가지 추가 단계가 작동하지 않으면 다른 문제

진단

.

1) 경고 로그에 오류가 있는지 확인하십시오. 데이터베이스에 메모리를 할당하는 데 문제가 있거나 디스크 공간이 부족하거나 다른 치명적인 오류가 발생한 경우 먼저 해결해야합니다. 을 사용하여 경고 로그의 위치를 ​​찾을 수 있습니다. SQL> v $ 매개 변수에서 값 선택 where name = 'background_dump_dest'; 경고 로그는 "alert"로 시작하는 이름으로이 디렉토리에 있습니다.

2) 작업 조정자 추적 파일이 있는지 확인하고 오류 코드가있는 경우 에 오류가 있는지 확인하십시오. 존재하는 경우, 위와 같이 찾을 수있는 'background_dump_dest'디렉토리에 위치하며 같은 것을 SID-cjq0_nnnn.trc와 같이 보입니다. 여기에 오류가있는 경우 작업이 실행되지 않는 이유에 대한 힌트를 얻을 수 있습니다.

3) SYSAUX 테이블 공간 (스케줄러가 로깅 테이블을 저장하는 곳)이 가득 찼다는 것을 나타내면 dbms_scheduler.purge_log 프로 시저를 사용하여 이전 로그 항목을 지울 수 있습니다.

4) 현재 열려있는 창이 있는지 확인하십시오. 있을 경우 닫는 것이 도움이되는지 확인할 수 있습니다.

SQL> select * from DBA_SCHEDULER_GLOBAL_ATTRIBUTE where 
attribute_name='CURRENT_OPEN_WINDOW'; 
SQL> exec DBMS_SCHEDULER.close_window ('WEEKNIGHT_WINDOW'); 

5)는 간단한 실행 한 번 작업이 실행되지 않는 경우, 스케줄러 등을 다시 시작 시도 할 수 있습니다)

SQL>begin 
dbms_scheduler.create_job (
job_name => 'test_job', 
job_type => 'plsql_block', 
job_action => 'null;', 
enabled => true); 
end; 
/
SQL> -- wait a while 
SQL> select * from user_scheduler_job_run_details where job_name='TEST_JOB'; 

6을 실행하는 경우 간단한 실행 한 번 작업을 실행 해 볼 다음과 같습니다.

SQL> exec dbms_scheduler.set_scheduler_attribute('SCHEDULER_DISABLED', 'TRUE'); 
SQL> alter system set job_queue_processes=0; 
SQL> exec dbms_ijob.set_enabled(FALSE); 
SQL> 
SQL> alter system flush shared_pool; 
SQL> alter system flush shared_pool; 
SQL> 
SQL> exec dbms_ijob.set_enabled(TRUE); 
SQL> alter system set job_queue_processes=99; 
SQL> exec dbms_scheduler.set_scheduler_attribute('SCHEDULER_DISABLED', 'FALSE');