ESC را فشار دهید تا بسته شود

زمیوس آموزش، یادگیری و سرگرمی

آموزش جامع DBMS_SCHEDULER در اوراکل با مثال‌های کاربردی

مقدمه : استفاده از پکیج 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 تجربه دارید و از آن استفاده می کنید در بخش نظرات، تجربه های ارزشمندتان را با ما به اشتراک بگذارید! 🚀

 

میثم راد

من یه برنامه نویسم که حسابی با دیتابیس اوراکل رفیقم! از اونایی ام که تا چیزی رو کامل نفهمم،ول کن نیستم، یادگرفتن برام مثل بازیه، و نوشتن اینجا کمک می کنه تا چیزایی که یاد گرفتم رو با بقیه به شریک بشم، با هم پیشرفت کنیم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *