ORACLE DB 的學習者們

2017年10月3日 星期二

Oracle Scheduler

Oracle 的排程器(Scheduler) 是由一支背景執行的 CJQ0 (JOB QUEUE COORDINATOR) 來監控管理,主要的動態VIEWS 為 DBMS_SCHEDULER_JOBS。若有使用者指定的 JOB 執行時,會指派 JOB ID,如 Jnnn,其中 nnn為 JOB ID。 JOB ID 的範圍由參數JOB_QUEUE_PROCESSES (預設1000):若設為0,Scheduler不會啟動。

SCHEDULER 的背景程式

下圖顯示在系統背景執行的這支 CJQ0。
或是由LINUX的SHELL也可看出
使用以下查詢都可以找出在背景執行的 JOBS
select * from v$process where pname like 'CJQ%';  
或是
select program from v$process where program like '%J%';

SCHEDULER 的 PACKAGE

主要是 DBMS_SCHEDULER ,該套件有許多介面可供使用,可透過 DESCRIBE DBMS_SCHEDULER 來查詢。所建立的為資料庫的物件,僅列舉以下常常使用的使用方法
  • CREATE JOB
  • JOB 包含幾個重點:做什麼 (WHAT) 和何時做 (WHEN)。其他參數如工作型態、參數等。
    • 做什麼 (WHAT)
    • SCHEDULER 可執行的包含有匿名 PL/SQL 區塊、STORED PROCEDURE,或甚至執行檔。
    • 何時做 (WHEN)
    • 型態(Job Type)
    • PLSQL_BLOCK(可為單一INSERT), STORED_PROCEDURE, EXECUTABLE, CHAIN (具備程式邏輯的一串 SCHEDULE)
    • 開始日期時間、結束日期時間
    • 執行頻率
    • ENABLE
    • 此參數必須設為 TRUE 才會啟動 (預設是 FALSE)
    • AUTODROP
    • JOB 結束後是否自動刪除 JOB 的定義。預設是 TRUE
  • CREATE PROGRAM
  • CREATE SCHEDULE
以下使用其中一個定義來展示
PROCEDURE create_job(
  job_name                IN VARCHAR2,
  job_type                 IN VARCHAR2,
  job_action              IN VARCHAR2,
  number_of_arguments     IN PLS_INTEGER              DEFAULT 0,
  start_date              IN TIMESTAMP WITH TIME ZONE DEFAULT NULL,
  repeat_interval         IN VARCHAR2                 DEFAULT NULL,
  end_date                IN TIMESTAMP WITH TIME ZONE DEFAULT NULL,
  job_class               IN VARCHAR2              DEFAULT 'DEFAULT_JOB_CLASS',
  enabled                 IN BOOLEAN                  DEFAULT FALSE,
  auto_drop               IN BOOLEAN                  DEFAULT TRUE,
  comments                IN VARCHAR2                 DEFAULT NULL,
  credential_name         IN VARCHAR2                 DEFAULT NULL,
  destination_name        IN VARCHAR2                 DEFAULT NULL);

SCHEDULER 的相關權限

由於 SCHEDULER 有可能執行匿名區塊、STORED PROCEDURE或是執行檔等,因此需要的相關權限如下
  • CREATE JOB
  • CREATE ANY JOB
  • CREATE EXTERNAL JOB
  • EXECUTE ANY PROGRAM
  • EXECUTE ANY CLASS
  • MANAGE SCHEDULE
  • EXECUTE ON
  • ALTER ON
  • ALL ON
其中,角色 SCHEDULER_ADMIN 包含有前六項權限

SCHEDULER 的動態 VIEWS

user_scheduler_jobs 、 dba_scheduler_jobs 、 dba_jobs 或是 dba_jobs 等等 以下在 HR SCHEMA 下新增一TABLE,然後透過一分鐘執行一次的 JOB ,將系統時間INSERT到該新的TABLE 首先透過 SYSTEM 權限,授權 HR 。
grant create job to hr;
grant alter job to hr;
接下來登入 HR,建立 TABLE及 JOB
create table times (c1 date);
alter session set nls_date_format='dd-mm-yy hh24:mi:ss';

begin
    dbms_scheduler.create_job
    (
        job_name=>'savedate',
        job_type=>'plsql_block',
        job_action=>'insert into times values(sysdate);',
        start_date=>sysdate,
        repeat_interval=>'freq=minutely;interval=1',
        enabled=>true,
        auto_drop=>false
    );
end;
/
執行完畢後,透過動態 VIEWS ,查詢執行次數如下 select job_name, enabled, to_char(next_run_date, 'dd-mm-yy hh24:mi:ss'), run_count from user_scheduler_jobs;

透過DATABASE CONTROL新增SCHEDULER

在網頁中選擇伺服器==>排程==>程式==>新增 ,在所有欄位填入必要資訊後,選擇【顯示SQL】可看到該工作的對應SQL,如下圖
確定執行後可看到多了一筆排程

SCHEDULER 的LOGS

紀錄可透過下列兩個TABLES來取得,dba_scheduler_job_log 或 user_scheduler_job_log 。
select job_name, log_date, status from dba_scheduler_job_log ; 
或是
select job_name, log_date, status from user_scheduler_job_log ;
以下透過HR帳號取得該帳號下的紀錄
以下則為管理者帳號所取得紀錄