วันเสาร์ที่ 28 มีนาคม พ.ศ. 2558

สร้าง Job Scheduler ง่ายๆด้วย Oracle Scheduler

Oracle Scheduler มีประโยชน์ในการกำหนดงานให้ทำแบบอัตโนมัติตามเวลาหรือเหตุการณ์ที่เราได้ตั้งไว้
และมันยังสามารถตั้งค่าให้งานนึงรันต่อจากอีกงานนึงก็ได้ (Job chain) อีกทั้งยังประยุกต์ใช้ร่วมกับ Resource Manager เพื่อกำหนด Priorities ต่างๆได้อีกด้วย
เราสามารถสร้าง Job ให้รันงานได้หลายประเภทเช่น PLSQL_BLOCK , STORED_PROCEDURE , หรือ EXECUTABLE
โดย PLSQL_BLOCK คือ SQL statement , PL/SQL anonymous block
STORED_PROCEDURE คือ stored procedure ซึ่งสามารถเป็น pl/sql , java หรือ external procedure ที่เขียนด้วย C
EXECUTABLE คือชุด OS command , executable binary file , หรือ shell script หรือ batch file
โดยเมื่อเรากำหนดประเภทของมันแล้วเราต้องกำหนด Action ให้ตรงกันด้วย

ตัวอย่างการสร้าง Job อย่างง่ายด้วย DBMS_SCHEDULER
1. สร้าง table ไว้เก็บวันที่และเวลา

create table num (c1 date);

2. ปรับรูปแบบวันที่ให้ดูนาทีได้

alter session set nls_date_format='dd-mm-yy hh24:mi:ss';

3. สร้าง job ขึ้นมาโดยสั่งให้ Insert วันที่กับเวลาลงใน TIMES table โดยให้ทำทุกๆ 1 นาที

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;
/

4. ลอง query ดู
select * from times;

C1
-----------------
28-03-15 22:48:57
28-03-15 22:49:57
28-03-15 22:50:57

5. เราสามารถยกเลิกและลบ JOB ของเราทิ้งได้ด้วย

exec dbms_scheduler.disable('savedate');

exec dbms_scheduler.drop_job('savedate');


เราสามารถสร้าง Program และ Schedule ขึ้นมาแล้วให้ JOB อื่นมาเรียก Program และ Schedule ของเราได้อีกหลายๆครั้ง เป็นการ Reuse Operation ได้โดยเรากำหนด Action ไว้ที่ Program และเวลาที่รันไว้ที่ Schedule แทน
ตัวอย่าง
1. สร้าง Program ขึ้นมาก่อน

begin
    dbms_scheduler.create_program(
    program_name=>'savedate',
    program_action=>'insert into times values(sysdate);',
    program_type=>'plsql_block',
    comments=>'Insert current date into the TIMES table',
    enabled=>true);
end;
/
NOTE : JOB และ PROGRAM แชร์ Namespace กันเราไม่สามารถสร้าง JOB และ PROGRAM มีชื่อเหมือนกันได้

2. สร้าง Schedule ขึ้นมาและกำหนดว่ารันทุก 3 นาที

begin
    dbms_scheduler.create_schedule(
    schedule_name=>'every_three_minute',
    start_date=>sysdate,
    repeat_interval=>'freq=minutely;interval=3',
    comments=>'Every 3 minutes');
end;
/

3. สร้าง JOB ขึ้นมาแล้วสั่งให้ใช้ Program กับ Schedule ที่มีอยู่

begin
    dbms_scheduler.create_job(
    job_name=>'increase_date',
    program_name=>'savedate',
    schedule_name=>'every_three_minute',
    enabled=>true,
    auto_drop=>false);
end;
/

4. ลอง query ดู

select * from times;
C1
-----------------
28-03-15 23:05:07
28-03-15 23:08:07
28-03-15 23:11:07
28-03-15 23:14:07


ตัวอย่างที่ 2 สร้าง job เพื่อทำ begin backup และ end backup (สร้างบน SYS หรือ SYSTEM) โดยให้รันวันละ 1 ครั้งตามเวลาที่กำหนด

begin
    dbms_scheduler.create_job(
    job_name=>'begin_backup',
    job_type=>'plsql_block',
    job_action=>'begin
    execute immediate ''alter database begin backup''; end;',
    start_date=>to_date('17-JUL-2017 17:28:00','DD-MON-YYYY HH24:MI:SS'),
    repeat_interval=>'freq=daily;interval=1',
    enabled=>true,
    auto_drop=>false);
end;
/

begin
    dbms_scheduler.create_job(
    job_name=>'end_backup',
    job_type=>'plsql_block',
    job_action=>'begin
    execute immediate ''alter database end backup''; end;',
    start_date=>to_date('17-JUL-2017 17:33:00','DD-MON-YYYY HH24:MI:SS'),
    repeat_interval=>'freq=daily;interval=1',
    enabled=>true,
    auto_drop=>false);
end;
/

ตัวอย่างบางส่วนใช้จากหนังสือ OCP Oracle 11g Administration II Exam Guide

ไม่มีความคิดเห็น:

แสดงความคิดเห็น