最近遇到几个客户反映,Scheduler job的日志记录时间与job运行时间不一致,自动统计任务的window打开时间与job执行的时间不一致等问题。
例如下面的情况,
SQL>select LOG_DATE, OWNER,JOB_NAME , STATUS , REQ_START_DATE,ACTUAL_START_DATE, RUN_DURATION from dba_scheduler_job_run_details;
LOG_DATE OWNER JOB_NAME STATUS REQ_START_DATE ACTUAL_START_DATE RUN_DURATION
2017-09-26 20:01:07.156536 +08:00 HFMMS CW_UTIL_JOB SUCCEEDED 2017-09-26 05:01:01.300000 -07:00 2017-09-26 05:01:04.316769 -07:00 +000 00:00:03
从上述结果可以发现,日志记录的时间是2017-09-26 20:01:07.156536 +08:00。而job执行时间是2017-09-26 05:01:01.300000 -07:00。
根据计算,这两个时区+08 和 -07 正好相差15个小时。而 20:01 和 05:01 正好相差了15个小时。因此,这实际是同一个时间,只是时区不同,表示方式不一样。
发生该问题的原因是dbms_scheduler使用的默认timezone不是操作系统的时区。可以使用下面的语句检查:
1)检查 system timezone:
SQL> select systimestamp, sessiontimezone from dual;
2)检查 Scheduler time zone:
SQL> select DBMS_SCHEDULER.STIME from dual;
解决该问题的办法是执行下面的语句将scheduler job 的时区修改为与system一致的时区:
SQL> exec DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE(‘default_timezone’,”);
可以参考下面的文档:
How to Change the Scheduler Timezone to Match the System Timezone (Doc ID 1488157.1)
DBMS_SCHEDULER or DBMS_JOB And DST / Timezones Explained (Doc ID 467722.1)