DBAtlas · 数据库运维图谱

创建、手动运行、禁用和删除调度程序作业

Oracle调度程序

命令

-- 1) Create disabled, set attributes, then enable:
BEGIN
  DBMS_SCHEDULER.CREATE_JOB(
    job_name        => 'CUSTOMER_APP.NIGHTLY_STATS',
    job_type        => 'PLSQL_BLOCK',
    job_action      => q'[BEGIN DBMS_STATS.GATHER_SCHEMA_STATS(ownname => 'CUSTOMER_APP', options => 'GATHER STALE'); END;]',
    start_date      => SYSTIMESTAMP,
    repeat_interval => 'FREQ=DAILY; BYHOUR=2; BYMINUTE=30; BYSECOND=0',
    enabled         => FALSE,
    auto_drop       => FALSE,
    comments        => 'Nightly stale statistics gathering');
  DBMS_SCHEDULER.SET_ATTRIBUTE('CUSTOMER_APP.NIGHTLY_STATS', 'max_run_duration', INTERVAL '2' HOUR);
  DBMS_SCHEDULER.SET_ATTRIBUTE('CUSTOMER_APP.NIGHTLY_STATS', 'logging_level', DBMS_SCHEDULER.LOGGING_FULL);
  DBMS_SCHEDULER.ENABLE('CUSTOMER_APP.NIGHTLY_STATS');
END;
/

-- 2) Validate the calendar expression (next run time):
SET SERVEROUTPUT ON
DECLARE
  l_next TIMESTAMP WITH TIME ZONE;
BEGIN
  DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING(
    calendar_string   => 'FREQ=DAILY; BYHOUR=2; BYMINUTE=30; BYSECOND=0',
    start_date        => SYSTIMESTAMP,
    return_date_after => SYSTIMESTAMP,
    next_run_date     => l_next);
  DBMS_OUTPUT.PUT_LINE('Next run: ' || l_next);
END;
/

-- 3) Run now in the background (does not affect the schedule):
EXEC DBMS_SCHEDULER.RUN_JOB('CUSTOMER_APP.NIGHTLY_STATS', use_current_session => FALSE);

-- 4) Status:
SELECT owner, job_name, enabled, state, run_count, failure_count,
       last_start_date, next_run_date
FROM   dba_scheduler_jobs WHERE owner = 'CUSTOMER_APP';

-- 5) Stop (if running) / disable / drop:
-- EXEC DBMS_SCHEDULER.STOP_JOB('CUSTOMER_APP.NIGHTLY_STATS', force => FALSE);
EXEC DBMS_SCHEDULER.DISABLE('CUSTOMER_APP.NIGHTLY_STATS', force => TRUE);
EXEC DBMS_SCHEDULER.DROP_JOB('CUSTOMER_APP.NIGHTLY_STATS', force => TRUE);

作用

使用 DBMS_SCHEDULER 定义一个定时 PL/SQL 作业;设置 max_run_duration(超过时触发事件)和详细日志级别,预先验证日历表达式,并允许在不打乱调度的情况下手动运行。

适用场景

用于在数据库内部而不是 cron 中运行维护、ETL 和清理等周期性数据库工作,并感知 RAC/Data Guard。

注意

无需额外许可。start_date 的时区很重要:SYSTIMESTAMP 使用数据库服务器的 TZ;请使用明确的区域(例如 'Europe/Istanbul')以避免夏令时切换时出现偏移。如果 JOB_QUEUE_PROCESSES=0,则不会运行任何作业。使用 force=>TRUE 的 DISABLE 不会停止正在运行的实例,只会阻止以后的运行;要中断请使用 STOP_JOB。在其他 schema 中创建作业需要 CREATE ANY JOB。

在 DBAtlas 中打开 →

相关内容