Oracle Database JOB Scheduler

Oracle Jobs: DBA_JOBS, DBA_SCHEDULER_JOBS and Auto Tasks

Oracle Jobs: DBA_JOBS, DBA_SCHEDULER_JOBS and Auto Tasks

Summary

Oracle Database provides different mechanisms for scheduling and managing jobs: DBA_JOBS (deprecated since 10g), DBA_SCHEDULER_JOBS (the current mechanism), and DBA_AUTO_TASKS (internal Oracle jobs). This article documents how to query, monitor, enable/disable, create, and manage these jobs.

1) Types of Jobs

  • DBA_JOBS – Deprecated since 10g, requires explicit COMMIT.
  • DBA_SCHEDULER_JOBS – Current job scheduling mechanism.
  • DBA_AUTO_TASKS – Oracle internal jobs for maintenance and tuning.

2) DBA_JOBS

2.1 Query all DBA_JOBS

SET LINESIZE 1000 PAGESIZE 1000

COLUMN log_user FORMAT A15
COLUMN priv_user FORMAT A15
COLUMN schema_user FORMAT A15
COLUMN interval FORMAT A40
COLUMN what FORMAT A50
COLUMN nls_env FORMAT A50
COLUMN misc_env FORMAT A50

SELECT a.job,
       a.log_user,
       a.priv_user,
       a.schema_user,
       To_Char(a.last_date,'DD-MON-YYYY HH24:MI:SS') AS last_date,
       To_Char(a.next_date,'DD-MON-YYYY HH24:MI:SS') AS next_date,
       a.broken,
       a.interval,
       a.failures,
       a.what,
       a.total_time,
       a.nls_env,
       a.misc_env
FROM   dba_jobs a;

SET LINESIZE 80 PAGESIZE 14;

2.2 Query running DBA_JOBS

SET LINESIZE 500
SET PAGESIZE 1000
SET VERIFY OFF

SELECT a.job "Job",
       a.sid,
       a.failures "Failures",
       Substr(To_Char(a.last_date,'DD-Mon-YYYY HH24:MI:SS'),1,20) "Last Date",
       Substr(To_Char(a.this_date,'DD-Mon-YYYY HH24:MI:SS'),1,20) "This Date"
FROM   dba_jobs_running a;

SET PAGESIZE 14
SET VERIFY ON;

2.3 Manage DBA_JOBS

Disable:

EXEC DBMS_JOB.BROKEN(<JOB_ID>, TRUE);
COMMIT;

Enable:

EXEC DBMS_JOB.BROKEN(<JOB_ID>, FALSE);
COMMIT;

Remove:

EXEC DBMS_JOB.REMOVE(<JOB_ID>);
COMMIT;

2.4 Create DBA_JOBS Examples

Start at 06:00 and run every hour:

dbms_job.submit(
  :jobno, 'BEGIN statspack_alert_proc; END;',
  trunc(sysdate)+6/24,
  'trunc(SYSDATE+1/24,''HH'')',
  TRUE,
  :instno);
/
commit;

Start at 09:00 and repeat every 12 hours:

dbms_job.submit(
  :jobno,
  'BEGIN statspack_alert_proc; END;',
  trunc(sysdate+1)+9/24,
  'trunc(SYSDATE+12/24,''HH'')',
  TRUE,
  :instno);
/
commit;

Start at 06:00 and run every 10 minutes:

dbms_job.submit(
  :jobno,
  'BEGIN statspack_alert_proc; END;',
  trunc(sysdate+1)+6/24,
  'trunc(sysdate+1/144,''MI'')',
  TRUE,
  :instno);
/
commit;

Start at 06:00 every hour, Monday–Friday:

dbms_job.submit(
  :jobno,
  'BEGIN statspack_alert_proc; END;',
  trunc(sysdate+1)+6/24,
  trunc(
    least(
      next_day(SYSDATE - 1,'MONDAY'),
      next_day(SYSDATE - 1,'TUESDAY'),
      next_day(SYSDATE - 1,'WEDNESDAY'),
      next_day(SYSDATE - 1,'THURSDAY'),
      next_day(SYSDATE - 1,'FRIDAY')
    )+1/24,'HH'),
  TRUE,
  :instno);
/
commit;

3) DBA_SCHEDULER_JOBS

3.1 Query DBA_SCHEDULER_JOBS

SET LINESIZE 200

COLUMN owner FORMAT A20
COLUMN job_name FORMAT A30
COLUMN job_class FORMAT A30
COLUMN next_run_date FORMAT A36

SELECT owner,
       job_name,
       enabled,
       job_class,
       next_run_date
FROM   dba_scheduler_jobs
ORDER BY owner, job_name;

3.2 Running DBA_SCHEDULER_JOBS

SET LINESIZE 200

COLUMN owner FORMAT A20
COLUMN elapsed_time FORMAT A30

SELECT owner,
       job_name,
       running_instance,
       elapsed_time,
       session_id
FROM   dba_scheduler_running_jobs
ORDER BY owner, job_name;

3.3 History

SELECT * FROM DBA_SCHEDULER_JOB_LOG;

SELECT * FROM DBA_SCHEDULER_JOB_RUN_DETAILS;

3.4 Create Scheduler Jobs

Basic PLSQL Block:

BEGIN
  DBMS_SCHEDULER.create_job (
    job_name        => 'test_full_job_definition',
    job_type        => 'PLSQL_BLOCK',
    job_action      => 'BEGIN my_job_procedure; END;',
    start_date      => SYSTIMESTAMP,
    repeat_interval => 'freq=hourly; byminute=0; bysecond=0;',
    enabled         => TRUE);
END;
/

Stored procedure:

BEGIN
  DBMS_SCHEDULER.CREATE_JOB (
    job_name           =>  'update_sales',
    job_type           =>  'STORED_PROCEDURE',
    job_action         =>  'OPS.SALES_PKG.UPDATE_SALES_SUMMARY',
    start_date         =>  '28-APR-08 07.00.00 PM Australia/Sydney',
    repeat_interval    =>  'FREQ=DAILY;INTERVAL=2', -- every other day
    end_date           =>  '20-NOV-08 07.00.00 PM Australia/Sydney',
    auto_drop          =>   FALSE,
    job_class          =>  'batch_update_jobs',
    comments           =>  'My new job');
END;
/

Using a saved program:

BEGIN
  DBMS_SCHEDULER.CREATE_JOB (
    job_name          =>  'my_new_job1',
    program_name      =>  'my_saved_program',
    repeat_interval   =>  'FREQ=DAILY;BYHOUR=12',
    comments          =>  'Daily at noon');
END;
/

3.5 Manage Scheduler Jobs

Run job:

BEGIN
  dbms_scheduler.run_job (job_name => '<JOB1>');
END;
/

Stop job:

BEGIN
  DBMS_SCHEDULER.STOP_JOB('<JOB1>');
END;
/

Disable jobs:

BEGIN
  DBMS_SCHEDULER.DISABLE('<JOB1>, <JOB2>, <JOB3>');
END;
/

Enable jobs:

BEGIN
  DBMS_SCHEDULER.ENABLE('<JOB1>, <JOB2>, <JOB3>');
END;
/

Drop job:

BEGIN
  DBMS_SCHEDULER.drop_schedule (schedule_name => '<JOB1>');
END;
/

4) DBA_AUTO_TASKS

4.1 List Auto Tasks

SET LINES 180 PAGES 1000
COL CLIENT_NAME FOR A40
COL ATTRIBUTES FOR A60

SELECT CLIENT_NAME, STATUS, ATTRIBUTES, SERVICE_NAME
FROM   DBA_AUTOTASK_CLIENT;

4.2 Check Execution History

SET PAGES 200 LIN 250
COL "JOB NAME" FOR A40
COL "WIN NAME" FOR A20
COL WINDOW_START_TIME FOR A40
COL WINDOW_END_TIME FOR A40
COL WINDOW_DURATION FOR A40

SELECT CLIENT_NAME "JOB NAME",
       WINDOW_NAME "WIN NAME",
       WINDOW_START_TIME,
       WINDOW_END_TIME,
       WINDOW_DURATION
FROM   DBA_AUTOTASK_CLIENT_HISTORY
ORDER BY CLIENT_NAME, WINDOW_START_TIME;

4.3 Disable Default Maintenance Windows (having them enabled requires EE)

Disable Auto Space Advisor:

BEGIN
  DBMS_AUTO_TASK_ADMIN.disable(
    client_name => 'auto space advisor',
    operation   => NULL,
    window_name => NULL);
END;
/

Disable Auto SQL Tuning Advisor:

BEGIN
  DBMS_AUTO_TASK_ADMIN.disable(
    client_name => 'sql tuning advisor',
    operation   => NULL,
    window_name => NULL);
END;
/

Disable Auto Optimizer Stats Collection:

BEGIN
  DBMS_AUTO_TASK_ADMIN.disable(
    client_name => 'auto optimizer stats collection',
    operation   => NULL,
    window_name => NULL);
END;
/

Comments

Popular Posts