,

Зависший job (hanging job)

вторник, 15 декабря 2009 г. 0 коммент.

В одной из баз попросили разобраться почему не работает job. По всем признакам он был валидным: флажок broken имел значение “N”, количество неудачных попыток (failures) было равно 0. Смущало только одно значение, следующее дата и время выполнения (next_date, next_time), оно было меньше текущей даты на 10 дней, хотя job должен был выполняться через каждые 5 минут. Вывод был один, джоб не завершил предыдущее задание, и поэтому не может дальше продолжить свою работу.

Чтобы найти работающие джобы нужно обратиться к вьюшке dba_jobs_running или v$lock.

SQL>
SQL> select v$lock.sid as sid,
2 v$lock.type as lock_type,
3 v$lock.id1,
4 v$lock.id2 as job
5 from v$lock
6 where v$lock.type = 'JQ';

SID LOCK_TYPE ID1 JOB
---------- --------- ---------- ----------
171 JQ 0 405

SQL>
SQL> select dba_jobs_running.sid,
2 dba_jobs_running.job,
3 dba_jobs_running.failures,
4 dba_jobs_running.last_date,
5 dba_jobs_running.last_sec
6 from dba_jobs_running;

SID JOB FAILURES LAST_DATE LAST_SEC
---------- ---------- ---------- ----------- --------------------------------
171 405 0 01.12.2009 17:11:53

SQL>
Да это мой зависший job c номером 405. Посмотрим, что делает сессия с номером 171.
SQL>
SQL>
SQL> select v$session_wait.event
from v$session_wait
where v$session_wait.sid = 171;

EVENT
---------------------------
SQL*Net message from dblink

SQL>
Сессия ожидает ответа по DBLink. Сессия “не убиваемая”, пришлось убивать процесс с помощью orakill. Читать полностью