
مقدمه : استفاده از پکیج DBMS_SCHEDULER در اوراکل چه اهمیتی دارد؟
در دنیای پایگاه داده اوراکل، خودکارسازی فرآیندها یکی از مهمترین وظایف توسعهدهندگان و DBAهاست.
Oracle با ارائه پکیج DBMS_SCHEDULER
این امکان را فراهم کرده تا بتوانیم تسکهای مختلف را در زمان مشخص اجرا کنیم، با قابلیتهایی بسیار پیشرفتهتر از پکیج قدیمیتر DBMS_JOB
.
در این مقاله آموزش اوراکل، به صورت کامل و کاربردی، با پکیج DBMS_SCHEDULER آشنا میشویم.
از مفاهیم پایه شروع میکنیم و به مثالهای واقعی، ساخت jobها، استفاده از chain، مانیتورینگ و نکات حرفهای میرسیم.
اگر می خواهید در مورد پکیج DBMS_RANDOM در بخش آموزش PL/SQL بیشتر آشنا بشید نوشته زیر را مطالعه کنید:
در این نوشته شما می خوانید
DBMS_SCHEDULER چیست؟
DBMS_SCHEDULER
پکیجی از PL/SQL است که برای زمانبندی اجرای اتوماتیک وظایف در Oracle استفاده میشود.
این پکیج امکان تعریف jobهایی با زمانبندی دقیق، اجرای ترتیبی عملیات (chain)، تنظیم اولویتها و منابع را فراهم میکند.
اجزای اصلی Scheduler در Oracle
- Job: وظیفهای که باید اجرا شود.
- Program: تعریف نوع عملکرد (PL/SQL، پروسیجر یا اسکریپت سیستم).
- Schedule: زمانبندی اجرای job.
- Chain: زنجیرهای از تسکها که به ترتیب و با منطق مشخص اجرا میشوند.
- Job Class: گروهبندی jobها برای مدیریت بهتر منابع.
- Window: بازه زمانی خاص برای اجرای jobها.
مثال اول: ایجاد یک Job ساده در Oracle
BEGIN
DBMS_SCHEDULER.create_job (
job_name => 'job_simple_test',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN DBMS_OUTPUT.PUT_LINE(''Hello Oracle
Scheduler!''); END;',
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=MINUTELY; INTERVAL=5',
enabled => TRUE
);
END;
/
توضیح:
- در این job، یک پیغام هر ۵ دقیقه چاپ میشود.
- نوع job از نوع
PLSQL_BLOCK
است. enabled => TRUE
یعنی job بلافاصله فعال خواهد بود.
مثال دوم: ساخت Job با Program و Schedule جداگانه
۱. ساخت Program
BEGIN
DBMS_SCHEDULER.create_program (
program_name => 'prog_backup_table',
program_type => 'STORED_PROCEDURE',
program_action => 'MY_SCHEMA.BACKUP_TABLE_PROC',
number_of_arguments => ۰,
enabled => TRUE
);
END;
/
۲. ساخت Schedule
BEGIN
DBMS_SCHEDULER.create_schedule (
schedule_name => 'daily_schedule_3am',
start_date => TO_TIMESTAMP_TZ('2025-04-10 03:00:00 +03:30',
'YYYY-MM-DD HH24:MI:SS TZH:TZM'),
repeat_interval => 'FREQ=DAILY',
comments => 'Run Daily,Saat e 3 am'
);
END;
/
۳. ساخت Job نهایی
BEGIN
DBMS_SCHEDULER.create_job (
job_name => 'job_backup_daily',
program_name => 'prog_backup_table',
schedule_name => 'daily_schedule_3am',
enabled => TRUE
);
END;
/
مانیتورینگ Jobها
برای بررسی وضعیت jobها، از کوئریهای زیر استفاده کن:
SELECT job_name, enabled, state, last_start_date, next_run_date
FROM dba_scheduler_jobs
WHERE owner = 'MY_SCHEMA';
برای دیدن لاگ اجرا:
SELECT job_name, status, actual_start_date, run_duration
FROM dba_scheduler_job_run_details
WHERE job_name = 'JOB_BACKUP_DAILY'
ORDER BY log_date DESC;
غیرفعالسازی و حذف Job
غیرفعال کردن Job:
BEGIN
DBMS_SCHEDULER.disable('job_backup_daily');
END;
/
حذف Job:
BEGIN
DBMS_SCHEDULER.drop_job('job_backup_daily');
END;
/
BEGIN
DBMS_SCHEDULER.create_chain (
chain_name => 'daily_etl_chain',
rule_set_name => NULL,
evaluation_interval => NULL,
comments => 'Calculate ETL Daily'
);
DBMS_SCHEDULER.define_chain_step('daily_etl_chain', 'step1',
'PROC_EXTRACT');
DBMS_SCHEDULER.define_chain_step('daily_etl_chain', 'step2',
'PROC_LOAD');
DBMS_SCHEDULER.define_chain_rule('daily_etl_chain',
condition => 'TRUE', action => 'START step1');
DBMS_SCHEDULER.define_chain_rule('daily_etl_chain',
condition => 'step1 COMPLETED', action => 'START step2');
DBMS_SCHEDULER.define_chain_rule('daily_etl_chain',
condition => 'step2 COMPLETED', action => 'END');
DBMS_SCHEDULER.enable('daily_etl_chain');
END;
/
نکات مهم در پکیج DBMS_SCHEDULER
- برای تست سریع jobها از
RUN_JOB
استفاده کن:
EXEC DBMS_SCHEDULER.run_job('job_simple_test');
- برای مشاهده خطاها:
SELECT * FROM DBA_SCHEDULER_JOB_RUN_DETAILS WHERE status = 'FAILED';
اگر job اجرا نمیشه، بررسی کن که job فعال باشه و زمان شروع اون از گذشته شروع شده باشه.
مقایسه DBMS_JOB و DBMS_SCHEDULER
ویژگی | DBMS_JOB | DBMS_SCHEDULER |
---|---|---|
قابلیت Chain | ندارد | دارد (با chain و step) |
تعریف Schedule مجزا | ندارد (داخل job تعریف میشود) | دارد (قابل اشتراکگذاری) |
انواع Job | فقط PL/SQL | PL/SQL، پروسیجر، OS Command |
قابلیت تعریف Job Class | ندارد | دارد |
مانیتورینگ و لاگگیری | محدود | پیشرفته (با جزئیات کامل) |
پشتیبانی از Calendaring Expression | خیر | بله (مثل FREQ=DAILY) |
کاربرد توصیهشده | برای اسکریپتهای ساده | برای مدیریت پیشرفته زمانبندی |
سوالات متداول درباره پکیج DBMS_SCHEDULER در اوراکل
DBMS_SCHEDULER
نسخهی پیشرفتهتر DBMS_JOB
است که امکانات بیشتری مانند chain، job class، calendar expression و اجرای external scripts را فراهم میکند.
همچنین از نظر لاگگیری و مانیتورینگ بسیار دقیقتر و مناسبتر برای پروژههای بزرگ است.
بله، یکی از مزیتهای DBMS_SCHEDULER این است که میتوانید jobهایی از نوع 'EXECUTABLE'
تعریف کنید که اسکریپتهای سیستمعامل (مثل bash یا cmd) را اجرا میکنند.
البته باید تنظیمات external job
در Oracle انجام شده باشد.
این مشکل معمولاً به یکی از دلایل زیر برمیگردد:
- job هنوز
enabled
نشده start_date
آن در آینده تنظیم شده- job به حالت
broken
رفته - مجوز اجرای job توسط سیستم عامل صادر نشده (برای EXECUTABLE jobs)
- تنظیمات پالیسی منابع یا job class مانع اجرا شدهاند
بهترین راه، استفاده از ویوهای سیستمی مثل DBA_SCHEDULER_JOB_RUN_DETAILS
و DBA_SCHEDULER_JOBS
است.
این ویوها اطلاعاتی مثل زمان اجرا، وضعیت موفق یا ناموفق، مدت زمان اجرا و پیام خطا را ارائه میدهند.
همچنین میتوان با استفاده از log_table سفارشی، مانیتورینگ اختصاصی ایجاد کرد.
نتیجهگیری
با تسلط بر DBMS_SCHEDULER
، میتونی فرآیندهای روزمره رو اتومات کنی، منابع رو مدیریت کنی و پایداری سیستم رو بالا ببری. چه برای پشتیبانگیری، چه برای فرآیندهای ETL یا ارسال گزارش، این پکیج بهترین انتخابه.
📢 نظر شما چیست؟ اگر شما در استفاده از پکیج DBMS_SCHEDULER تجربه دارید و از آن استفاده می کنید در بخش نظرات، تجربه های ارزشمندتان را با ما به اشتراک بگذارید! 🚀
دیدگاهتان را بنویسید