Từ các phiên bản cũ, Oracle đã cung cấp khả năng lập lịch tự động chạy task (tạo job) với package DBMS_JOB. Tuy nhiên cách này có nhiều hạn chế và bất tiện. Do đó, từ phiên bản 10g, Oracle cung cấp Scheduler để  thay thế cho DBMS_JOB, hỗ trợ đa năng, mạnh mẽ hơn trong việc tạo các thao tác tự động chạy theo lịch hẹn sẵn.

 

Các phiên bản sau này vẫn hỗ trợ DBMS_JOB, nhưng chỉ nhằm mục đích hỗ trợ tương thích. Ta vẫn nên xài Oracle Scheduler hơn. Để sử dụng, có thể dùng package DBMS_SCHEDULER hoặc dùng giao diện trên Enterprise Manager, hay các công cụ như Toad…

 

Do nhiều tính năng nên cấu trúc của Oracle Scheduler cũng khá phức tạp, với nhiều thành phần con: jobs, schedules, programs, job classes, windows… Ta sẽ tìm hiểu sơ qua định nghĩa về các đối tượng trong phần 1 này.

 

Các process và tham số liên quan

 

Trong database, tham số job_queue_processes quy định số process tối đa có thể sinh ra để chạy job. Nếu tham số này bằng 0, Oracle Scheduler coi như bị disable (kể cả DBMS_JOB cũng bị disable). Mặc định tham số này là 1000, cũng là giá trị maximum cho phép.

 

 

Ở bài kiến trúc Oracle process ta đã biết được 2 process liên quan:

  • CJQ0: job coordinator process, monitor table DBA_SCHEDULER_JOBS, tạo các job slave process. Process này có thể deactive/bị kill mà không làm crash database, vì sẽ tự động sinh ra lại khi cần thiết
  • Jnnn: các job slave process, chạy job

 

Program

 

Program là 1 đối tượng chỉ chứa thông tin về công việc/thao tác cần thực hiện. Do đó ta có thể định nghĩa program, cùng với các tham số, để có thể tạo nhiều job khác nhau gọi program đó trong các tình huống khác nhau. 

 

Program có thể là 1 khối lệnh PL/SQL, 1 stored procedure hay 1 script lưu trữ bên ngoài database.

 

Schedule

 

Nếu program chỉ chứa thông tin về thao tác thì schedule chỉ chứa thông tin về lịch chạy: thời gian bắt đầu, thời gian kết thúc, tần suất lặp lại (repeat interval).

 

Thời gian bắt đầu mặc định là thời điểm hiện tại. Thời gian kết thúc là thời điểm job không còn hiệu lực nữa. Tần suất lặp lại ta có thể quy định bằng các giá trị

 

 

và có thể chỉ định rõ thêm thời điểm bằng các giá trị

 

 

VD:

– Chạy 6 tiếng 1 lần

 

 

– Chạy vào ngày 2 đầu mỗi tháng ở mỗi quý, ngay khi resource cho phép

 

 

– Chạy vào 6h10 mỗi sáng thứ 2, 2 tuần 1 lần

 

 

Job

 

Job là công việc/thao tác cần thực hiện tại 1 thời điểm xác định

  • Công việc: có thể là 1 câu SQL, 1 khối lệnh PL/SQL, 1 stored procedure, external procedure…
  • Thời điểm xác định: 1 thời điểm ngày giờ cụ thể, có thể bao gồm cả tần suất để lặp lại công việc

Job bao gồm 2 thành phần trên. Do đó ta có thể sử dụng DBMS_SCHEDULER.CREATE_JOB để tạo job theo nhiều cách:

 

  • Công việc chi tiết + Thời điểm chi tiết
  • Program + Thời điểm chi tiết
  • Công việc chi tiết + Schedule
  • Program + Schedule
 

Tuy vậy, bình thường, ta hay tạo job với định nghĩa công việc và thời điểm chi tiết, mà ít khi sử dụng program và schedule.

 

Chain

 

Chain là 1 chuỗi thao tác, sau khi chạy xong 1 program ta có thể gọi đến 1 program khác, hay 1 subchain, hay 1 event gì đó.

VD chain: chạy program A, sau đó chạy program B, nếu cả 2 thành công thì chạy program C, nếu không thì chạy program D.

 

Job Class

 

Job class nhằm mục đích nhóm các job vào cùng 1 nhóm để gán vào consumer group phù hợp, nhằm sử dụng hiệu quả tài nguyên. Nếu không chỉ định, mặc định các job sẽ nằm ở DEFAULT_JOB_CLASS.

 

Window

 

Thay vì cố định 1 thời điểm như schedule, window rộng rãi hơn khi quy định 1 khoảng thời gian. Trong khoảng thời gian đó, Oracle sẽ chọn thời điểm phù hợp để start job. Ta cũng có thể cấu hình Resource plan đi kèm với window. Tại 1 thời điểm chỉ có thể active 1 window.

 

Window Group

 

Ta có thể nhóm nhiều window vào 1 window group để dễ quản lý theo nhu cầu.

 

Các quyền liên quan tới scheduler

 

  • CREATE JOB
  • CREATE ANY JOB
  • EXECUTE ANY PROGRAM
  • EXECUTE ANY CLASS
  • MANAGE SCHEDULER
  • EXECUTE ON <JOB, PROGRAM, OR CLASS>
  • ALTER ON <JOB, PROGRAM, OR SCHEDULE>
  • ALL ON <JOB, PROGRAM, SCHEDULE, OR CLASS>

 

Các view data dictionary

 

Để kiểm tra các thông tin liên quan đến Oracle Scheduler, có thể query trong các view DBA_SCHEDULER_* như:

 

– DBA_SCHEDULER_JOBS

DBA_SCHEDULER_RUNNING_JOBS

DBA_SCHEDULER_JOB_RUN_DETAILS

DBA_SCHEDULER_PROGRAMS

DBA_SCHEDULER_SCHEDULES…

 

Lý thuyết thì chẳng có gì hấp dẫn thật, khô như ngói, mình viết xong mà đọc còn nản boring Qua các bài tiếp theo chúng ta sẽ đi vào cách sử dụng, chắc là đọc sẽ đỡ nhàm chán hơn giggle