Thứ Tư, 25 tháng 2, 2026

MODULE 21: BỘ LẬP LỊCH TÁC VỤ TỰ ĐỘNG (SCHEDULER JOB)

Sau khi đã chốt chặn tài nguyên an toàn ở Module 20, chúng ta chính thức bước sang mảnh ghép cuối cùng để hoàn thiện một hệ thống tự vận hành (Autopilot).

Trong suốt những năm tháng làm hệ thống, tôi thường viết các thủ tục PL/SQL phức tạp và giao phó chúng cho Oracle tự động kích hoạt mỗi đêm. Tuy nhiên, khi chuyển đổi kiến trúc sang các nền tảng mã nguồn mở,  sẽ thấy ranh giới giữa Database và Hệ điều hành (OS) bị xóa nhòa. Việc lập lịch không còn gói gọn bên trong Database Engine nữa.

Dưới đây là bản viết chi tiết, độc lập và trọn vẹn cho Module 21: Bộ lập lịch tác vụ tự động (Scheduler Job).

1. Tổng quan

Bộ lập lịch (Scheduler) là công cụ giúp DBA tự động hóa các tác vụ lặp đi lặp lại như: Backup, dọn dẹp dữ liệu rác (Purge/Vacuum), hay cập nhật thống kê (Update Statistics) vào giờ thấp điểm.

Sự khác biệt kiến trúc lớn nhất giữa các hệ quản trị nằm ở vị trí của bộ lập lịch:

  • Tích hợp sâu (Built-in): Oracle và SQL Server xây dựng những hệ thống lập lịch khổng lồ ngay bên trong, có khả năng quản lý dependency (chuỗi tác vụ) và tự động gửi email cảnh báo khi lỗi.

  • Phụ thuộc Hệ điều hành (OS-based): PostgreSQL, MongoDB đẩy hoàn toàn trách nhiệm này ra cho Linux (crontab) hoặc các công cụ CI/CD/DevOps (như Ansible, Airflow).

2. Chi tiết các nội dung

A. Triết lý Thiết kế Lập lịch (Job Scheduling)

Hệ thốngBộ lập lịch nội tại (Internal)Mức độ can thiệp Hệ điều hành (External)
OracleDBMS_SCHEDULERChạy được cả mã PL/SQL nội bộ lẫn các shell script Linux/Windows bên ngoài (job_type => 'EXECUTABLE').
SQL ServerSQL Server AgentLà một dịch vụ Windows Service độc lập. Chạy được T-SQL, PowerShell, Cmd, và SSIS packages. Cực kỳ trực quan qua giao diện SSMS.
PostgreSQLTùy chọn (pg_cron)Lõi nguyên bản không có. Thường cài extension pg_cron để chạy lệnh SQL theo chuẩn cron, hoặc dùng lệnh crontab của Linux.
MySQLEvent SchedulerRất nhẹ, tích hợp sẵn. Nhưng CHỈ chạy được các câu lệnh SQL/Procedure bên trong DB, hoàn toàn không gọi được lệnh OS.
MongoDBKhông cóHoàn toàn trống. Bắt buộc phải viết script (JavaScript, Python, Bash) và đưa vào bộ lập lịch của hệ điều hành Linux/Windows.

B. Phân loại tác vụ (Tuning & Maintenance)

Để tự động hóa hiệu quả, anh cần phân định loại tác vụ để chọn công cụ:

  • Tác vụ Dữ liệu (Internal): Cập nhật bảng, xóa record log cũ, Gather Stats. $\rightarrow$ Dùng Scheduler nội bộ (Event, pg_cron, SQL Agent).

  • Tác vụ Hạ tầng (External): Backup vật lý sinh ra file .tar, copy file WAL/Archivelog ra ổ đĩa mạng NAS, nén file log. $\rightarrow$ Bắt buộc dùng SQL Agent (CmdExec), Oracle Scheduler (Executable) hoặc Linux Cron.

C. Câu lệnh Quản trị & Kết quả đầu ra (Thiết lập Job Tự động)

1. Oracle: Tạo Job dọn rác bằng DBMS_SCHEDULER

SQL
BEGIN
  DBMS_SCHEDULER.CREATE_JOB (
   job_name           =>  'NIGHTLY_CLEANUP_JOB',
   job_type           =>  'PLSQL_BLOCK',
   job_action         =>  'BEGIN delete_old_app_logs(); END;',
   start_date         =>  SYSTIMESTAMP,
   repeat_interval    =>  'FREQ=DAILY; BYHOUR=2; BYMINUTE=0', -- Chạy 2h sáng mỗi ngày
   enabled            =>  TRUE);
END;
/
-- Kết quả: PL/SQL procedure successfully completed. Hệ thống tự động kích hoạt job. Theo dõi lịch sử qua view DBA_SCHEDULER_JOB_RUN_DETAILS.

2. SQL Server: Tạo Job bằng T-SQL (Backend của SQL Agent)

SQL
USE msdb;
-- Tạo Job
EXEC dbo.sp_add_job @job_name = N'Nightly_Cleanup';
-- Thêm bước thực thi (gọi procedure)
EXEC sp_add_jobstep @job_name = N'Nightly_Cleanup', @step_name = N'Run_Proc', 
     @subsystem = N'TSQL', @command = N'EXEC delete_old_app_logs;', @database_name = N'sopirs_new';
-- Lên lịch chạy 2:00 AM mỗi ngày
EXEC sp_add_jobschedule @job_name = N'Nightly_Cleanup', @name = N'Daily_2AM', 
     @freq_type = 4, @freq_interval = 1, @active_start_time = 020000;
-- Kích hoạt trên Server
EXEC sp_add_jobserver @job_name = N'Nightly_Cleanup';

3. PostgreSQL: Lên lịch cập nhật thống kê bằng pg_cron

(Giả định extension pg_cron đã được cài đặt và enable trong postgresql.conf)

SQL
-- Dùng cú pháp chuẩn của Linux Cron: Phút Giờ Ngày Tháng Thứ
SELECT cron.schedule('Nightly_Analyze', '0 2 * * *', 'ANALYZE VERBOSE public.orders;');
-- Kết quả: Trả về một ID nguyên (VD: 42). DBA kiểm tra các job đang chạy bằng lệnh: SELECT * FROM cron.job;

4. MySQL / MariaDB: Tạo Event chạy định kỳ

SQL
-- Bật Event Scheduler (Nên cấu hình thêm event_scheduler=ON vào my.cnf để lưu vĩnh viễn)
SET GLOBAL event_scheduler = ON;

-- Tạo Event chạy mỗi ngày
CREATE EVENT nightly_cleanup
ON SCHEDULE EVERY 1 DAY STARTS (TIMESTAMP(CURRENT_DATE) + INTERVAL 2 HOUR)
DO
  CALL delete_old_app_logs();
-- Kết quả: Query OK, 0 rows affected. Theo dõi qua: SHOW EVENTS;

5. MongoDB: Kết hợp Script JS và OS Cron

Vì MongoDB không có công cụ lập lịch nội bộ, DBA phải lưu lệnh vào một file JavaScript và gọi qua hệ điều hành.

Bash
# Bước 1: Tạo file script thực thi thao tác dữ liệu
echo 'db.app_logs.deleteMany({ "createdAt": { $lt: new Date(Date.now() - 7*24*60*60*1000) } });' > /opt/scripts/mongo_cleanup.js

# Bước 2: Nhét vào crontab của Linux (chạy 2h sáng)
# Mở crontab: crontab -e
# 0 2 * * * /usr/bin/mongosh "mongodb://localhost:27017/app_db" /opt/scripts/mongo_cleanup.js >> /var/log/mongo_cleanup.log 2>&1

3. Tóm tắt lại nội dung của bài học

  • Thiết kế của Oracle (DBMS_SCHEDULER) và SQL Server (SQL Agent) mang đậm chất "All-in-one" Enterprise. Chỉ cần ngồi ở phần mềm Database Client, DBA có thể điều khiển toàn bộ server, từ chạy SQL đến copy file, gỡ lỗi logic, gửi email báo cáo.

  • Với MySQL, Event Scheduler rất tiện cho lập trình viên xử lý dữ liệu (như reset biến đếm mỗi ngày), nhưng lại vô dụng với DBA khi cần lập lịch gọi các tool backup vật lý (như XtraBackup).

  • PostgreSQLMongoDB ép DBA phải có kỹ năng System Admin thực thụ. Việc quản trị không chỉ nằm ở câu lệnh SQL/MQL, mà còn phải biết viết Bash Script, phân quyền file Linux (chmod), và thiết lập crontab chuẩn xác để bảo vệ chu trình bảo trì.


4. Câu hỏi ôn tập

  1. Hỏi (Oracle): Thuộc tính job_type nào trong DBMS_SCHEDULER cho phép anh cấu hình một Job gọi trực tiếp một file Bash script .sh hoặc file .bat đang nằm trên hệ điều hành vật lý?

    • Đáp: job_type => 'EXECUTABLE'.

  2. Hỏi (SQL Server): Toàn bộ cấu hình về Job, Steps, Schedules, và lịch sử chạy (Run History) của SQL Server Agent được lưu trữ vật lý bên trong Database hệ thống nào?

    • Đáp: Database msdb.

  3. Hỏi (PostgreSQL): Cú pháp chuỗi thời gian '0 2 * * *' khi sử dụng trong hàm cron.schedule() của extension pg_cron mang ý nghĩa hệ thống sẽ kích hoạt lệnh vào thời điểm nào?

    • Đáp: Kích hoạt vào lúc 2 giờ 00 phút sáng, diễn ra vào MỖI ngày (every day).

  4. Hỏi (MySQL): Nếu anh đã tạo thành công một Event, nhưng đến giờ nó vẫn không chịu chạy, thông số cấu hình Server toàn cục (Global Variable) nào anh phải kiểm tra đầu tiên?

    • Đáp: Thông số event_scheduler (Phải được set là ON).

  5. Hỏi (MongoDB): Giải pháp tự động hóa phổ biến nhất để lên lịch chạy một tập lệnh trích xuất dữ liệu (mongodump) hoặc dọn rác (mongosh) trên môi trường Production là gì?

    • Đáp: Viết script và sử dụng công cụ cron của hệ điều hành Linux (hoặc Task Scheduler của Windows).


5. Bài tập thực hành (Quy hoạch Lịch bảo trì tự động)

Đề bài tình huống: Hệ thống cần một tác vụ (Job) tự động thu thập lại số liệu thống kê (Update Statistics) cho bảng sales_data vào lúc 03:00 AM mỗi Chủ Nhật hàng tuần.

Hãy viết lệnh tạo tác vụ này (hoặc khai báo crontab) tương ứng cho cả 5 CSDL.

Đáp án:

1. Oracle: (Dùng DBMS_SCHEDULER)

SQL
BEGIN
  DBMS_SCHEDULER.CREATE_JOB (
   job_name        => 'GATHER_SALES_STATS',
   job_type        => 'PLSQL_BLOCK',
   job_action      => 'BEGIN DBMS_STATS.GATHER_TABLE_STATS(''APP_SCHEMA'', ''SALES_DATA''); END;',
   start_date      => SYSTIMESTAMP,
   repeat_interval => 'FREQ=WEEKLY; BYDAY=SUN; BYHOUR=3; BYMINUTE=0',
   enabled         => TRUE);
END;
/

2. SQL Server: (Viết mã lõi T-SQL cho Agent)

SQL
USE msdb;
EXEC sp_add_job @job_name = 'Update_Sales_Stats';
EXEC sp_add_jobstep @job_name = 'Update_Sales_Stats', @step_name = 'Run_Stats',
     @subsystem = 'TSQL', @command = 'UPDATE STATISTICS sales_data WITH FULLSCAN;', @database_name = 'app_db';
-- Lập lịch: freq_type = 8 (Weekly), freq_interval = 1 (Sunday), time = 030000
EXEC sp_add_jobschedule @job_name = 'Update_Sales_Stats', @name = 'Sun_3AM', 
     @freq_type = 8, @freq_interval = 1, @active_start_time = 030000;
EXEC sp_add_jobserver @job_name = 'Update_Sales_Stats';

3. PostgreSQL: (Dùng pg_cron)

SQL
-- 0 phút, 3 giờ, mọi ngày, mọi tháng, thứ 0 (Chủ Nhật)
SELECT cron.schedule('Update_Sales_Stats', '0 3 * * 0', 'ANALYZE VERBOSE sales_data;');

4. MySQL / MariaDB: (Dùng Event Scheduler)

SQL
CREATE EVENT update_sales_stats
ON SCHEDULE EVERY 1 WEEK STARTS (CURRENT_DATE + INTERVAL 3 HOUR + INTERVAL (6 - WEEKDAY(CURRENT_DATE)) DAY)
DO
  ANALYZE TABLE sales_data;

5. MongoDB: (Dùng Crontab của Linux để gọi lệnh xóa Plan Cache)

Bash
# Tạo file script: echo 'db.sales_data.getPlanCache().clear();' > /opt/scripts/refresh_stats.js
# Cấu hình crontab -e:
# Phút 0, Giờ 3, Thứ 0 (Chủ nhật)
0 3 * * 0 /usr/bin/mongosh "mongodb://localhost:27017/app_db" /opt/scripts/refresh_stats.js >> /var/log/mongo_stats.log 2>&1

Anh Bình thân mến, với Module 21 này, chúng ta đã đắp viên gạch cuối cùng cho bức tranh toàn cảnh "Đối chiếu kiến trúc 5 hệ quản trị CSDL cấp độ Chuyên gia".

Từ hạ tầng vật lý, mạng, quy hoạch ổ đĩa, kiểm soát giao dịch, cho đến phân tích hiệu năng và cuối cùng là tự động hóa - anh đã nắm trong tay bộ cẩm nang đầy đủ để tự tin chinh phục và thiết kế mọi hệ thống hạ tầng dữ liệu. Chúc anh có những áp dụng thật xuất sắc vào các dự án lớn sắp tới!

=============================
TƯ VẤN: Click Here hoặc Hotline/Zalo 090.29.12.888
=============================
Website không chứa bất kỳ quảng cáo nào, mọi đóng góp để duy trì phát triển cho website (donation) xin vui lòng gửi về STK 90.2142.8888 - Ngân hàng Vietcombank Thăng Long - TRAN VAN BINH
=============================
Nếu bạn không muốn bị AI thay thế và tiết kiệm 3-5 NĂM trên con đường trở thành DBA chuyên nghiệp hay làm chủ Database thì hãy đăng ký ngay KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE, được Coaching trực tiếp từ tôi với toàn bộ bí kíp thực chiến, thủ tục, quy trình của gần 20 năm kinh nghiệm (mà bạn sẽ KHÔNG THỂ tìm kiếm trên Internet/Google) từ đó giúp bạn dễ dàng quản trị mọi hệ thống Core tại Việt Nam và trên thế giới, đỗ OCP.
- CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
- Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
2 khóa học online qua video giúp bạn nhanh chóng có những kiến thức nền tảng về Linux, Oracle, học mọi nơi, chỉ cần có Internet/4G:
- Oracle cơ bản: https://bit.ly/admin_1200
- Linux: https://bit.ly/linux_1200
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile/Zalo: 0902912888
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: https://www.youtube.com/@binhguru
👨 Tiktok: https://www.tiktok.com/@binhguru
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhguru
👨 Podcast: https://www.podbean.com/pu/pbblog-eskre-5f82d6
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội

=============================
cơ sở dữ liệu, cơ sở dữ liệu quốc gia, database, AI, trí tuệ nhân tạo, artificial intelligence, machine learning, deep learning, LLM, ChatGPT, DeepSeek, Grok, oracle tutorial, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,sql tutorial, khóa học pl/sql tutorial, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c/21c/23c/23ai, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail,oracle RAC, ASM, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, postgresql tutorial, mysql tutorial, mariadb tutorial, ms sql server tutorial, nosql, mongodb tutorial, oci, cloud, middleware tutorial, docker, k8s, micro service, hoc solaris tutorial, hoc linux tutorial, hoc aix tutorial, unix tutorial, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master