Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Проблема с SCHEDULER JOBS: Двойной запуск  [new]
-=SwiMMeR=-
Member

Откуда: Россия, Краснодар
Сообщений: 110
Добрые утро/день/вечер.

Столкнулись сегодня с такой проблемой.
Есть SCHEDULER JOB, который запускается 1 раз в сутки.
Выполняется ~1 минуту.
Сегодня он запустился дважды.
Дождался первого выполнения и запустился второй раз.
Завершился с ошибкой (логика выполнения не может быть выполнена дважды в сутки).
Стали разбираться. Не смогли.

Выдача dba_scheduler_job_run_details

SQL> SELECT r.log_id, r.log_date, r.status, r.error#, r.req_start_date, r.actual_start_date, r.run_duration, r.instance_id, r.session_id, r.slave_pid, r.cpu_used
  2  FROM dba_scheduler_job_run_details r
  3  WHERE job_name = '?'
  4    AND CAST( actual_start_date AS DATE ) >= TRUNC( SYSDATE ) ;
  
    LOG_ID LOG_DATE                            STATUS    ERROR# REQ_START_DATE                             ACTUAL_START_DATE                          RUN_DURATION  INSTANCE_ID SESSION_ID  SLAVE_PID CPU_USED
---------- ----------------------------------- --------- ------ ------------------------------------------ ------------------------------------------ ------------- ----------- ----------- --------- ----------------
 565717738 19-OCT-16 12.01.44,774278 AM +03:00 SUCCEEDED      0 19-OCT-16 12.00.59,427083 AM EUROPE/MOSCOW 19-OCT-16 12.00.59,994432 AM EUROPE/MOSCOW +000 00:00:45           1 8582,24363  23593386  +000 00:00:20.51
 565717946 19-OCT-16 12.01.53,744305 AM +03:00 FAILED     20858 19-OCT-16 12.00.59,999954 AM EUROPE/MOSCOW 19-OCT-16 12.01.44,777591 AM EUROPE/MOSCOW +000 00:00:09           1 18659,16401 29558504  +000 00:00:05.40
                                                                                                                                                                                           
SQL> 


Выдача dba_scheduler_jobs

SQL> SELECT r.job_style, r.job_type, r.schedule_type, r.repeat_interval, r.job_class, r.state, r.job_priority, r.failure_count, r.retry_count, r.last_start_date, r.last_run_duration, r.next_run_date, r.logging_level, r.restartable
  2  FROM dba_scheduler_jobs r
  3  WHERE job_name = '?' ;

JOB_STYLE JOB_TYPE    SCHEDULE_TYPE REPEAT_INTERVAL                            JOB_CLASS         STATE     JOB_PRIORITY FAILURE_COUNT RETRY_COUNT LAST_START_DATE                            LAST_RUN_DURATION          NEXT_RUN_DATE                              LOGGING_LEVEL RESTARTABLE
--------- ----------- ------------- ------------------------------------------ ----------------- --------- ------------ ------------- ----------- ------------------------------------------ -------------------------- ------------------------------------------ ------------- -----------
REGULAR   PLSQL_BLOCK CALENDAR      Freq=Daily;ByHour=0;ByMinute=0;BySecond=59 DEFAULT_JOB_CLASS SCHEDULED            1             1           0 19-OCT-16 12.01.44,777536 AM EUROPE/MOSCOW +000000000 00:00:08.965482 20-OCT-16 12.00.59,782849 AM EUROPE/MOSCOW OFF           FALSE

SQL> 


Ну и традиционно ...

SQL> SELECT banner FROM v$version ;
BANNER
--------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
PL/SQL Release 12.1.0.2.0 - Production
CORE	12.1.0.2.0	Production
TNS for IBM/AIX RISC System/6000: Version 12.1.0.2.0 - Production
NLSRTL Version 12.1.0.2.0 - Production

SQL> 


В чем может быть проблема? Куда копать? Как смоделировать/повторить?
CJQ-процесс (вроде) 1 штук. (CJQ0)

Стали смотреть на другие. Ситуация повторяется часто и густо с другими джобами с разными расписаниями.
Никакой системы/закономерности не нашли.

Логи шедулера есть за последние 30 дней. Проблема повторяется весь период.
Для обращения в ТП надо приложить описание моделирования ошибки.

Спасибо.
19 окт 16, 21:19    [19801870]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с SCHEDULER JOBS: Двойной запуск  [new]
dba123
Member

Откуда:
Сообщений: 1054
-=SwiMMeR=-,

Покажи как создаешь джоб и как правишь календарь
только джоб создай новый, без импортов/апгрейдов

+ http://docs.oracle.com/database/121/ARPLS/d_sched.htm#ARPLS72366

--Doc ID 807159.1 - Sample Code 
--Doc ID 1520580.1 - Master Note: Troubleshooting Oracle Scheduler

--1) Prepare
--
-- if start_date is NULL (timezone from session TIME_ZONE|ORA_SDTZ client env|default_timezone of scheduler)
--
ALTER SESSION SET TIME_ZONE = 'EUROPE/MOSCOW';
exec DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE('default_timezone','EUROPE/MOSCOW');

-- if start_date is NOT NULL (timezone from start_time)
--
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
alter session set NLS_TIMESTAMP_FORMAT='yyyy-mm-dd hh24:mi:ssxff' ;
alter session set NLS_TIMESTAMP_TZ_FORMAT='yyyy-mm-dd hh24:mi:ss TZR TZD';


drop table scott.t21_log purge;
create table scott.t21_log(x number generated as identity, y timestamp with time zone, z varchar2(64));

insert into scott.t21_log(y,z) values
( to_timestamp_tz('20161021 14:00:00 EUROPE/MOSCOW','YYYYMMDD HH24:MI:SS TZR')
 ,to_char(SYSTIMESTAMP AT TIME ZONE 'EUROPE/MOSCOW','YYYYMMDD HH24:MI:SSXFF TZR TZD')
);


--2) Check of preparing

select dbms_scheduler.stime from dual;

STIME
-------------------------------------
2016-10-21 14:09:13 EUROPE/MOSCOW MSK


select * from scott.t21_log;

    X Y                                      Z
----- -------------------------------------- -------------------------------------------
    1 2016-10-21 14:00:00 EUROPE/MOSCOW MSK  20161021 14:09:40,979096 EUROPE/MOSCOW MSK


--3)
declare
 job_does_not_exist exception;
 pragma exception_init(job_does_not_exist, -27475);
begin
 DBMS_SCHEDULER.DROP_JOB ('CALEND_ALA_TEST');
 exception when job_does_not_exist then
   dbms_output.put_line('Create job');
end;
/

ALTER SESSION SET TIME_ZONE = 'EUROPE/MOSCOW';
begin
dbms_scheduler.create_job('CALEND_ALA_TEST'
 ,'PLSQL_BLOCK'
 ,'begin insert into scott.t21_log(y,z) 
    select SYSTIMESTAMP AT TIME ZONE ''EUROPE/MOSCOW''
    ,to_char(systimestamp, ''YYYYMMDD HH24:MI:SSXFF'') from dual;commit; end;'
-- , start_date =>'2016-10-21 13:25:00 EUROPE/MOSCOW'
 ,start_date=>null
 ,enabled => true
-- ,repeat_interval => 'freq=daily;byminute=12');
-- ,repeat_interval => 'freq=hourly;byminute=5');
 ,repeat_interval => 'freq=minutely;bysecond=59');
end;
/

-- в датах никаких смещений: +4, -7 ,...
-- только временные зоны должны быть 
-- вдруг летнее время(DST) вернется
select owner
      ,start_date
      ,repeat_interval
      ,last_start_date
      ,next_run_date 
 from dba_scheduler_jobs where job_name='CALEND_ALA_TEST';

select * from scott.t21_log;

1 2016-10-21 14:00:00 EUROPE/MOSCOW MSK            20161021 14:09:40,979096 EUROPE/MOSCOW MSK
2 2016-10-21 14:39:02 EUROPE/MOSCOW MSK            20161021 14:39:02,623923
3 2016-10-21 14:40:02 EUROPE/MOSCOW MSK            20161021 14:40:02,623461
4 2016-10-21 14:41:02 EUROPE/MOSCOW MSK            20161021 14:41:02,622506
5 2016-10-21 14:42:02 EUROPE/MOSCOW MSK            20161021 14:42:02,621904
6 2016-10-21 14:43:02 EUROPE/MOSCOW MSK            20161021 14:43:02,614655

--проверить календарь 
--зациклить вычисление next_run_date
--example: http://docs.oracle.com/database/121/ARPLS/d_sched.htm#ARPLS72366
ALTER SESSION SET TIME_ZONE = 'EUROPE/MOSCOW';
DECLARE
 start_date        TIMESTAMP WITH TIME ZONE;
 return_date_after TIMESTAMP WITH TIME ZONE;
 next_run_date     TIMESTAMP WITH TIME ZONE;
-- start_date        TIMESTAMP;
-- return_date_after TIMESTAMP;
-- next_run_date     TIMESTAMP;
BEGIN
--start_date := null;
 start_date :=  to_timestamp_tz('20161021 14:00:00  EUROPE/MOSCOW MSK','YYYYMMDD HH24:MI:SS TZR TZD');
 return_date_after := start_date;
FOR i IN 1..5 LOOP
 DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING(  
    'FREQ=DAILY;BYHOUR=9;BYMINUTE=30;BYDAY=MON,TUE,WED,THU,FRI',
    start_date, return_date_after, next_run_date);
-- DBMS_OUTPUT.PUT_LINE('next_run_date: ' || to_char(next_run_date AT TIME ZONE 'EUROPE/MOSCOW','YYYYMMDD HH24:MI:SSXFF TZR'));
 DBMS_OUTPUT.PUT_LINE('next_run_date: ' || next_run_date);
 return_date_after := next_run_date;
END LOOP;
END;
/

next_run_date: 2016-10-24 09:30:00 EUROPE/MOSCOW MSK
next_run_date: 2016-10-25 09:30:00 EUROPE/MOSCOW MSK
next_run_date: 2016-10-26 09:30:00 EUROPE/MOSCOW MSK
next_run_date: 2016-10-27 09:30:00 EUROPE/MOSCOW MSK
next_run_date: 2016-10-28 09:30:00 EUROPE/MOSCOW MSK

begin
 DBMS_SCHEDULER.DROP_JOB ('CALEND_ALA_TEST');
end;
/

drop table scott.t21_log purge;

21 окт 16, 15:56    [19809874]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с SCHEDULER JOBS: Двойной запуск  [new]
orTOPed
Member

Откуда: |▒|▒|▒|▒|▒|
Сообщений: 611
Не смущает, что ACTUAL_START_DATE первого запуска плюс RUN_DURATION равно ACTUAL_START_DATE второго запуска?
27 окт 16, 02:54    [19826275]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с SCHEDULER JOBS: Двойной запуск  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18483
А должно быть как-то по-другому?

Меня больше смущает BySecond=59 в расписании. Не то чтобы это было запрещено (или замечено в косяках), но все-таки обработка "граничных условий"...
В общем, я бы поставил что-нибудь другое
27 окт 16, 03:17    [19826276]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с SCHEDULER JOBS: Двойной запуск  [new]
Nobody1111
Guest
Глюканул скедулер. Базу давно рестартовали? Рестартануть не поможет? Или хотя бы скедулер. Все чаще и чаще баги у оракла лечатся купируются рестартом, как у винды.
28 окт 16, 00:08    [19831222]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с SCHEDULER JOBS: Двойной запуск  [new]
Eliska
Member

Откуда:
Сообщений: 19
Согласна с Любомудровым
10 фев 17, 20:35    [20201870]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с SCHEDULER JOBS: Двойной запуск  [new]
Viewer
Member

Откуда: Самара
Сообщений: 5369
Eliska
Согласна с Любомудровым

... так и тянет спросить "На что?" ;)
13 фев 17, 10:11    [20206227]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить