Переход на летнее время вызывает проблемы с синхронизацией запланированных заданий

#oracle #oracle11g #scheduled-tasks

#Oracle #oracle11g #запланированные задачи

Вопрос:

У меня есть материализованное представление MVIEW_MY_AU , которое обновляется из имени хранимой процедуры REFRESH_MVIEWS_VIA_PRC . Этот SP содержит следующее утверждение :

 dbms_mview.refresh('MVIEW_MY_AU');
  

В REFRESH_MVIEWS_VIA_SCH таблице all_scheduler_jobs создается задание для выполнения этой хранимой процедуры.

Запрос :

 select job_name, last_start_date,next_run_date,job_action from all_scheduler_jobs 
where job_name = 'REFRESH_MVIEWS_VIA_SCH'
  

Вывод :

введите описание изображения здесь

В соответствии с запланированным заданием я ожидаю, что это материализованное представление обновится в 3:30 утра по австралийскому времени. Но когда он обновляется в 4:30 утра по австралийскому времени в соответствии со следующим запросом :

Запрос :

 SELECT LAST_REFRESH              
,TO_CHAR(last_refresh, 'MM/DD/YYYY HH24:MI:SS A.M.') as LAST_REFRESH_TIME 
FROM user_mview_refresh_times
where name like 'MVIEW_MY_AU'
  

Вывод :

введите описание изображения здесь

Я начал сталкиваться с этой проблемой после перехода на летнее время для Австралии, начавшегося 2 октября 2016 года. Есть ли какой-либо способ запланировать задание, которое будет учитывать время экономии дневного света?

Ответ №1:

Существует несколько способов, с помощью которых Oracle будет учитывать переход на летнее время.

Введите TIMESTAMP WITH TIME ZONE значение для параметра start_time , например SYSTIMESTAMP , или CURRENT_TIMESTAMP

Из документации DBMS_SCHEDULER:

Когда значение start_date равно НУЛЮ, планировщик определяет часовой пояс для интервала повторения следующим образом:

  1. Он проверяет, является ли часовой пояс сеанса именем региона. Часовой пояс сеанса может быть установлен либо:
    • Выдача инструкции ALTER SESSION, например: SQL> ALTER SESSION SET time_zone = 'Asia/Shanghai';
    • Установка ORA_SDTZ переменной среды.
  2. Если часовой пояс сеанса является абсолютным смещением вместо имени региона, планировщик использует значение атрибута DEFAULT_TIMEZONE Scheduler.
  3. Если DEFAULT_TIMEZONE атрибут равен нулю, планировщик использует часовой пояс systimestamp при включении задания или окна.

Самое главное: часовой пояс должен быть указан как регион, например Australia/Sydney , а не как смещение UTC, как 08:00

Что касается вашего запроса:

Столбец LAST_REFRESH представления user_mview_refresh_times DATE — это тип данных, поэтому по определению он не содержит никакой информации о часовом поясе. Скорее всего, столбец LAST_REFRESH указан в часовом поясе сервера операционной системы вашей БД (т. Е. Значение часового пояса SYSDATE ). Какой часовой пояс вашего сервера операционной системы DB? Вы можете определить это в ОС напрямую или с помощью

 SELECT TO_CHAR(SYSTIMESTAMP, 'tzr') FROM dual;