بررسی تغییرات dbms_job در اوراکل 19c

تا قبل از اوراکل نسخه 10g، برای ایجاد جاب در محیط دیتابیس، از بسته dbms_job استفاده می شد در نسخه 10g بهبودی در این زمینه ایجاد شد و اوراکل با ارائه بسته dbms_scheduler، بسیاری از نقاط ضعف dbms_job را پوشش داد و عملا استفاده از این بسته را به حداقل رساند.

اما با این حال، کاربران می توانند کماکان از این بسته(dbms_job) برای تعریف جاب جدید و یا مدیریت جابهای قبلی(جابهای ایجاد شده در نسخه های قدیمی تر) استفاده کنند و حتی اوراکل هم برای زمانبندی بعضی از کارها، از همین بسته استفاده می کند.

برای مثال، در زمان ایجاد MV)MATERIALIZED VIEW)، اگر ساعت و بازه زمانی ای برای بروزرسانی خودکار MV تعریف شود، اوراکل جابی از نوع dbms_job را برای بروزرسانی MATERIALIZED VIEW ایجاد می کند:

SQL> CREATE MATERIALIZED VIEW “USEF”.”MVTEST”

BUILD IMMEDIATE 

REFRESH FORCE

START WITH to_date(’10-Jul-2019 02:08:26 PM’,’dd-Mon-yyyy HH:MI:SS AM’)

NEXT sysdate + 1

ENABLE QUERY REWRITE

AS  select * from jj;

با اجرای این دستور، جاب شماره 7603 ایجاد شده است:

SQL>select job,schema_user,interval,what from dba_jobs where schema_user=’USEF’;

در اوراکل 18c تغییری در این رفتار ایجاد شد و اوراکل برای بروزرسانی MATERIALIZED VIEW، دیگر از dbms_job استفاده نمی کند:

SQL> CREATE MATERIALIZED VIEW “USEF”.”MVTEST”

SQL> select job,schema_user,interval,what from dba_jobs where schema_user=’USEF’;

no rows selected

select OWNER,JOB_NAME,JOB_ACTION,REPEAT_INTERVAL from dba_scheduler_jobs where owner=’USEF’;

در اوراکل 19c هم تغییر رفتارهایی در مورد بسته dbms_job ایجاد شد که در ادامه این متن، به بررسی این تغییرات می پردازیم.

قصد داریم در دیتابیسی با نسخه 18c، جابی را با کمک بسته dbms_job ایجاد کنیم و بعد از ارتقای این دیتابیس به نسخه 19c، بررسی کنیم چه تغییری در این جاب ایجاد می شود.

پس با اجرای دستور زیر، جابی را ایجاد می کنیم این جاب پروسیجر myproc1 را در بازه زمانی یک دقیقه اجرا می کند.

–Oracle 18c

SQL> var job VARCHAR2(2000)

SQL> begin sys.dbms_job.submit(job => :job,what => ‘myproc1;’,interval => ‘sysdate+1/24/60’);commit;end;

  2  /

PL/SQL procedure successfully completed

job

———

2

شماره جاب ایجاد شده برابر با دو می باشد همچنین ویوی dba_jobs، اطلاعاتی را در مورد این جاب نمایش خواهد داد:

select job,schema_user,interval,what from dba_jobs;

در این دیتابیس، کاربر usef صرفا همین جاب را ایجاد کرده است و جابی دیگری حتی از نوع scheduler ندارد:

select count(*) from DBA_SCHEDULER_JOBS where owner=’USEF’;

0

بعد از ساخت جاب توسط کاربر usef، دیتابیس را از نسخه 18c به نسخه 19c ارتقا می دهیم و مجددا وضعیت جاب ایجاد شده را مورد بازبینی قرار می دهیم:

select job,schema_user,interval,what from dba_jobs;

همانطور که می بینید، ویوی dba_jobs کماکان اطلاعات جاب شماره دو را نمایش می دهد اما با رجوع به ویوی DBA_SCHEDULER_JOBS، به نکته قابل تاملی برمی خوریم:

select count(*) from DBA_SCHEDULER_JOBS where owner=’USEF’;

1

اشاره شده بود که قبل از ارتقا به نسخه 19c، برای کاربر usef جابی از نوع scheduler تعریف نشده است اما بعد از ارتقا، خروجی این دستور عدد یک را برمی گرداند!! با اجرای دستور زیر، مشخصات این جاب را می بینیم:

select OWNER,JOB_NAME,JOB_ACTION,REPEAT_INTERVAL from dba_scheduler_jobs where owner=’USEF’;

بله درست می بینید! مشابه جاب ایجاد شده با کمک بسته dbms_job، در این قسمت هم جابی وجود دارد که در همان بازه زمانی قرار است پروسیجر myrpoc1 را اجرا کند!

با دو ویوی dba_jobs و DBA_SCHEDULER_JOBS زمان بعدی اجرای این جاب و آخرین زمان اجرای ان را مقایسه می کنیم:

select s.LAST_DATE,s.NEXT_DATE from dba_jobs s;

select p.last_start_date,p.next_run_date from dba_scheduler_jobs p where p.job_name=’DBMS_JOB$_2′;

هر دو ویو تاریخ یکسانی را برمی گردانند! همچنین این جاب، از طریق هر دو بسته dbms_job و dbms_scheduler قابل اجرا می باشد:

SQL> exec dbms_scheduler.run_job(job_name => ‘DBMS_JOB$_2’);

PL/SQL procedure successfully completed

SQL> exec dbms_job.run(job => 2);

PL/SQL procedure successfully completed

با کمک بسته dbms_job، تغییری را در نوع عملی که قرار است جاب اجرا کند(what)، ایجاد می کنیم، این تغییر در قسمت job_acion اسکچولر هم اعمال خواهد شد:

SQL> exec dbms_job.what(job => 2,what => ‘proc5’);

PL/SQL procedure successfully completed

SQL> commit;

Commit complete

select (select job_action from dba_scheduler_jobs p where p.job_name=’DBMS_JOB$_2′) scheduler, (select what from dba_jobs s) dba_jobs from dual;

همانطور که می بینید، معادل جابهای ایجاد شده از طریق dbms_job، جابی هم از طریق بسته dbms_scheduler ایجاد خواهد شد و مدیریت این جاب، از طریق هر کدام از این بسته ها قابل انجام خواهد بود. همچنین جابهایی که به تازگی در اوراکل نسخه 19c ایجاد می شوند(از طریق بسته dbms_job) هم همین ساختار را دارند:

SQL> var job VARCHAR2(2000)

SQL> begin sys.dbms_job.submit(job => :job,what => ‘proc19c;’,interval => ‘sysdate+10’);commit;end;

  2  /

PL/SQL procedure successfully completed

job

———

22

select (select job_name from dba_scheduler_jobs p where p.job_name like ‘%22’) scheduler, (select job from dba_jobs s where job=22) dba_jobs from dual;

در نسخه 19c جدولی با نام scheduler$_dbmsjob_map به جداول دیتادیکشنری اضافه شده است که می توان از طریق آن، تعیین نمود که کدام جاب به کدام اسکچولر مپ شده است:

select * from sys.scheduler$_dbmsjob_map;

این جدول اطلاعات جابهای حذف شده را هم نمایش خواهد داد.

Comment (1)

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

نشانی ایمیل شما منتشر نخواهد شد.