본문 바로가기
DBMS/ORACLE

[oracle] 스케줄러(dbms_scheduler) 실행 시간대(time zone)

by 드바 2024. 2. 22.

 

- 오라클 스케줄러(dbms_scheduler) JOB 생성 시 시간대는 무엇인가
- JOB 등록시 세션 시간대로 등록되며 DBA_SCHEDULER_JOBS에서 시간대가 포함된 시간 확인 가능
- 스케줄 JOB 실행 시간대는 OS time zone 기준

 

참고:
oracle 리스너 timezone 설정
oracle alert.log 시간대(time zone) 기준은 무엇인가
oracle 오브젝트 생성시간은 어떤 시간대(time zone)

세션 시간대 KST에서 JOB 생성

세션 시간대 KST로 설정 후 TEST_KST JOB 생성합니다

-- 세션 시간대 KST로 변경
SQL> ALTER SESSION SET TIME_ZONE = '+09:00';
Session altered.

-- 세션 시간대 확인
SELECT dbtimezone, sessiontimezone, sysdate, current_date  FROM dual ;
Session altered.

DBTIME SESSIONTIMEZONE    SYSDATE        CURRENT_DATE
------ ----------------------------------- ------------------- -------------------
+00:00 +09:00    2024/02/21 13:52:20 2024/02/21 13:52:20

-- JOB 등록
SQL> 
BEGIN
DBMS_SCHEDULER.CREATE_JOB
(
 JOB_NAME  => 'TEST_KST'
 , JOB_TYPE => 'PLSQL_BLOCK'
 , JOB_ACTION => 'select sysdate from dual; '
, NUMBER_OF_ARGUMENTS => 0
, START_DATE => TO_DATE('2024-02-21 14:00','YYYY-MM-DD HH24:MI')
, REPEAT_INTERVAL => 'FREQ=MINUTELY;INTERVAL=1'
, COMMENTS => ''
, ENABLED => TRUE
);
END;
/

SQL>
PL/SQL procedure successfully completed.

 
DBA_SCHEDULER_JOBS의 START_DATE 컬럼 값을 보면 time zone(+09:00) 확인 가능 합니다

SQL> select job_name, start_date, next_run_Date
from DBA_SCHEDULER_JOBS
where job_name like 'TEST%'
;

JOB_NAME  START_DATE             NEXT_RUN_DATE
------------------------ --------------------------------------------------- -------------------------------------------------
TEST_KST  21-FEB-24 02.00.00.000000 PM +09:00      21-FEB-24 02.00.00.000000 PM +09:00

SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

 

세션 시간대 UTC에서 JOB 생성

세션 시간대 UTC로 설정 후 TEST_UTC JOB 생성합니다

-- 세션 시간대 UTC 변경
SQL> ALTER SESSION SET TIME_ZONE = '00:00';
Session altered.

-- 시간대 확인
SQL> ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS';
SELECT dbtimezone, sessiontimezone, sysdate, current_date  FROM dual ;
Session altered.

DBTIME SESSIONTIMEZONE    SYSDATE        CURRENT_DATE
------ ----------------------------------- ------------------- -------------------
+00:00 +00:00    2024/02/21 13:54:34 2024/02/21 04:54:34

-- JOB 등록
SQL> BEGIN
DBMS_SCHEDULER.CREATE_JOB
(
 JOB_NAME  => 'TEST_UTC'
 , JOB_TYPE => 'PLSQL_BLOCK'
 , JOB_ACTION => 'select sysdate from dual; '
, NUMBER_OF_ARGUMENTS => 0
, START_DATE => TO_DATE('2024-02-21 14:00','YYYY-MM-DD HH24:MI')
, REPEAT_INTERVAL => 'FREQ=MINUTELY;INTERVAL=1'
, COMMENTS => ''
, ENABLED => TRUE
);
END;
/
 
PL/SQL procedure successfully completed.

SQL>

 
TEST_KST는 +09:00, TEST_UTC는 +00:00으로 생성시 세션시간대 반영하여 등록되어 있습니다

-- DBA_SCHEDULER_JOBS에 세션 시간대 반영하여 등록됨
SQL> select job_name, start_date, next_run_Date
from DBA_SCHEDULER_JOBS
where job_name like 'TEST%'
;

JOB_NAME  START_DATE                     NEXT_RUN_DATE
---------------------------------------- ------------------------------------------ -----------------------------------------
TEST_KST  21-FEB-24 02.00.00.000000 PM +09:00     21-FEB-24 02.00.00.000000 PM +09:00
TEST_UTC  21-FEB-24 02.00.00.000000 PM +00:00     21-FEB-24 02.00.00.000000 PM +00:00

SQL>
반응형

스케줄 JOB 실행 시간대

스케줄러에 등록된 JOB은 OS time znoe을 기준으로 실행되는것을 확인 할 수 있습니다
아래 테스트에서 14:00(KST)로 설정된 TEST_KST만 실행되고 있습니다

-- 실행 시간은 OS 시간대를 기준으로 실행된다
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

-- JOB 확인
SQL> select job_name, start_date, next_run_Date
from DBA_SCHEDULER_JOBS
where job_name like 'TEST%'
;

JOB_NAME  START_DATE                     NEXT_RUN_DATE
-------------------------------- ------------------------------------------ -----------------------------------------------
TEST_KST  21-FEB-24 02.00.00.000000 PM +09:00     21-FEB-24 02.00.00.000000 PM +09:00
TEST_UTC  21-FEB-24 02.00.00.000000 PM +00:00     21-FEB-24 02.00.00.000000 PM +00:00

-- sysdate 확인
SQL> 
SELECT dbtimezone, sessiontimezone, sysdate, current_date  FROM dual ;
Session altered.

SQL> 

DBTIME SESSIONTIMEZONE    SYSDATE        CURRENT_DATE
------ --------------------------- ------------------- -------------------
+00:00 +09:00    2024/02/21 14:03:05 2024/02/21 14:03:05

-- KST 14:00로 설정된 TEST_KST만 실행중
SQL> SELECT log_id, log_date, job_name 
FROM DBA_SCHEDULER_JOB_LOG
where job_name like 'TEST%'
order by log_id desc
;

    LOG_ID LOG_DATE        JOB_NAME
---------- --------------------------------------------------------------------------- ------------------------------
      1120 21-FEB-24 02.04.00.499806 PM +09:00        TEST_KST
      1118 21-FEB-24 02.03.00.390768 PM +09:00        TEST_KST
      1116 21-FEB-24 02.02.00.285368 PM +09:00        TEST_KST
      1114 21-FEB-24 02.01.00.125692 PM +09:00        TEST_KST
      1112 21-FEB-24 02.00.00.058986 PM +09:00        TEST_KST

SQL>

 

스케줄 JOB 시간대 변경

TEST_UTC시간대를 UTC -> KST로 변경하니 바로 실행되는 것 확인됩니다

-- JOB 시간대 변경(UTC -> KST로 변경)
SQL> BEGIN
  DBMS_SCHEDULER.SET_ATTRIBUTE(
    name      => 'TEST_UTC',
    attribute => 'START_DATE',
    value     => TO_TIMESTAMP_TZ('2024-02-21 14:00 +09:00', 'YYYY-MM-DD HH24:MI TZR')
  );
END;
/

PL/SQL procedure successfully completed.

-- 변경 확인
SQL> select job_name, start_date, next_run_Date
from DBA_SCHEDULER_JOBS
where job_name like 'TEST%'
;

JOB_NAME        START_DATE    NEXT_RUN_DATE
------------------------------ --------------------------------------------------- ----------------------------------------------
TEST_KST        21-FEB-24 02.00.00.000000 PM +09:00    21-FEB-24 02.12.00.629287 PM +09:00
TEST_UTC        21-FEB-24 02.00.00.000000 PM +09:00    21-FEB-24 02.12.00.638787 PM +09:00

-- 실행내역 조회
SQL> SELECT log_id, log_date, job_name 
FROM DBA_SCHEDULER_JOB_LOG
where job_name like 'TEST%'
order by log_id desc
;

    LOG_ID LOG_DATE      JOB_NAME
---------- ------------------------------------------------- ------------------------------
      1138 21-FEB-24 02.11.00.647160 PM +09:00      TEST_UTC
      1136 21-FEB-24 02.11.00.631811 PM +09:00      TEST_KST
      1132 21-FEB-24 02.10.00.430838 PM +09:00      TEST_KST
      1130 21-FEB-24 02.09.00.414688 PM +09:00      TEST_KST
      1128 21-FEB-24 02.08.01.064500 PM +09:00      TEST_KST
      1126 21-FEB-24 02.07.00.937474 PM +09:00      TEST_KST
      1124 21-FEB-24 02.06.00.861984 PM +09:00      TEST_KST
      1122 21-FEB-24 02.05.00.689815 PM +09:00      TEST_KST
      1120 21-FEB-24 02.04.00.499806 PM +09:00      TEST_KST
      1118 21-FEB-24 02.03.00.390768 PM +09:00      TEST_KST
      1116 21-FEB-24 02.02.00.285368 PM +09:00      TEST_KST
      1114 21-FEB-24 02.01.00.125692 PM +09:00      TEST_KST
      1112 21-FEB-24 02.00.00.058986 PM +09:00      TEST_KST

13 rows selected.

SQL>


테스트 JOB 삭제

-- 스케줄 JOB 삭제
SQL> EXEC DBMS_SCHEDULER.DROP_JOB('TEST_KST');
PL/SQL procedure successfully completed.
SQL> EXEC DBMS_SCHEDULER.DROP_JOB('TEST_UTC');
PL/SQL procedure successfully completed.

-- 스케줄 JOB 확인
SQL> select 
job_name, start_date, next_run_Date
from DBA_SCHEDULER_JOBS
where job_name like 'TEST%'
;

no rows selected

SQL>

댓글