DBMS_SCHEDULER – חלק 2 - ilDBA Portal

DBMS_SCHEDULER – חלק 2

05/05/2013 | פורסם על ידי

בפרק הקודם סקרנו את ה- DBMS_SCHEDULER, כיצד יוצרים ג'וב, כיצד משייכים אליו Program ו- Scheduler.
תזכורת לחלק הראשון : על dbms_scheduler – תיזמונים במסד נתונים אורקל
בחלק 2 נסקור כיצד בעזרת Chains ניתן ליצור מערכת תהליכים מורכבת בעלת תלויות וגם כיצד ניתן לייחס הגדרות זהות לג'ובים רבים על ידי שיוך ל- Job Class.

Chains

כאשר נדרשנו לייצר תהליך אחד על פי כללי זמן ריצה מסוימים כל מה שהיינו צריכים לעשות זה ליצור ג'וב אחד. ולציין בו מה להריץ, בין אם ההפניה נמצאת בהגדרה של הג'וב לבין אם הוא מכיל הפניה לאובייקט מסוג PROGRAM. קיימים מצבים בהם נרצה ליצור ריבוי של תהליכים שרצים בעלי תלויות ביניהם.
בדוגמה הבאה, יש לנו 3 פרוצדורות, אשר אמורות לרוץ באופן הבא:

  1. התהליך מתחיל מהריצה של הפרוצדורה GET_NEW_EMPLOYES.
  2. בתנאי והפרוצדורה הסתיימה בצורה תקינה , תורץ הפרוצדורה UPDATE_SALARIES.
  3. בתנאי והפרוצדורה נכשלה, תורץ הפרוצדורה REPORT_ERROR.


 

בחבילת ה-DBMS_SCHEDULER קיים אובייקט מסוג CHAIN אשר מאפשר הקמה של תוכניות בעלות תלויות בין Programs.
על מנת להגדיר תוכנית המשתמשת ב- Chain נצטרך להכיר שני אובייקטים נוספים:
Chain Step – אובייקט המכיל הפנייה לאובייקט Program
Chain Rule – אובייקט המורכב מ-

  1. Condition – משמש בתור תנאי ריצה.
  2. Action – מה לבצע במצב בו ה-Condition שלו מחזיר True.

נתחיל מהקמה של Chain חדש:

BEGIN
  DBMS_SCHEDULER.create_chain (
    chain_name          => 'NEW_EMPLOYES_PROCEDURE_CHAIN');

  DBMS_SCHEDULER.ENABLE ('NEW_EMPLOYES_PROCEDURE_CHAIN');
END;
/ 

השלב הבא זה להגדיר Chain Step עבור כל Program עם שיוך ל- Chain שיצרנו בסעיף הקודם.
על מנת שיהיה ניתן להתייחס לכל Step ב- Chain Rules, כל Chain Step מקבל שם ייחודי.

BEGIN
  DBMS_SCHEDULER.define_chain_step (
    chain_name   => 'NEW_EMPLOYES_PROCEDURE_CHAIN',
    step_name    => 'NEW_EMPLOYES_STEP_1',
    program_name => 'GET_NEW_EMPLOYES_PROGRAM');

  DBMS_SCHEDULER.define_chain_step (
    chain_name   => 'NEW_EMPLOYES_PROCEDURE_CHAIN',
    step_name    => 'NEW_EMPLOYES_STEP_2',
    program_name => 'UPDATE_SALARIES_PROGRAM');

  DBMS_SCHEDULER.define_chain_step (
    chain_name   => 'NEW_EMPLOYES_PROCEDURE_CHAIN',
    step_name    => 'NEW_EMPLOYES_STEP_3',
    program_name => 'REPORT_ERROR_PROGRAM');
END;
/

לאחר שהגדרנו את ה- Chain Steps אנחנו נרצה לבנות את ה- Chain Rules על מנת לקבוע את התנאים של איזה Step ירוץ ובאיזה תנאי.
כל Chain Rule צריך להכיל תנאי תחילת ריצה תחת פרמטר condition, על מנת ש- Rule מסוים יפעל נדרש שה- Condition שלו יהיה True, בדוגמה שלנו אנחנו צריכים ש- NEW_EMPLOYES_STEP_1 יתחיל לרוץ בתחילת התוכנית, לכן נציין שה- Condition שלו הוא פשוט TRUE.

BEGIN
  DBMS_SCHEDULER.define_chain_rule (
    chain_name => 'NEW_EMPLOYES_PROCEDURE_CHAIN',
    condition  => 'TRUE',
    action     => 'START "NEW_EMPLOYES_STEP_1"');
END;
/

* דוגמאות נוספות לסוגי Condition עבור Chain Rules:
http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_sched.htm#CHDBAFJE
בשלב הבא אנחנו נצטרך  לבדוק האם ה- Step הצליח או נכשל ובהתאם להפעיל את Step 2 במקרה והצליח או Step 3 במקרה ונכשל.

BEGIN
  DBMS_SCHEDULER.define_chain_rule (
    chain_name => 'NEW_EMPLOYES_PROCEDURE_CHAIN',
    condition  => '"NEW_EMPLOYES_STEP_1" COMPLETED',
    action     => 'START "NEW_EMPLOYES_STEP_2"');

  DBMS_SCHEDULER.define_chain_rule (
    chain_name => 'NEW_EMPLOYES_PROCEDURE_CHAIN',
    condition  => '"NEW_EMPLOYES_STEP_1" FAILED',
    action     => 'START "NEW_EMPLOYES_STEP_3"');
END;
/ 

בסוף על מנת שנוכל לסגור את ה- Chain אנחנו חייבים לציין את הערך END תחת פרמטר Action. ריצת התוכנית לא תסתיים עד שתתקבל פעולת ה- END אלא תעבור למצב Stalled אשר בו הוא פשוט ימשיך להמתין.
לכן חשוב לבנות Step אשר סוגר את התוכנית.
במקרה שלנו התוכנית צריכה להיסגר בתום ריצה של אחד משני ה- Step-ים:

BEGIN
  DBMS_SCHEDULER.define_chain_rule (
    chain_name => 'NEW_EMPLOYES_PROCEDURE_CHAIN',
    condition  =>
'"NEW_EMPLOYES_STEP_2" COMPLETED OR "NEW_EMPLOYES_STEP_3" COMPLETED',
    action     => 'END');
END;
/ 

לאחר שכל ה- Chain מוכן אנחנו צריכים ג'וב אשר יפעיל את ה- Chain, את זה נשיג על ידי ציון בפרמטר job_type הערך 'CHAIN' ותחת job_action יופיע שם ה- Chain.

BEGIN
  DBMS_SCHEDULER.CREATE_JOB (
    job_name        => 'NEW_EMPLOYES_PROCEDURE_JOB',
    job_type        => 'CHAIN',
    job_action      => 'NEW_EMPLOYES_PROCEDURE_CHAIN',
    start_date => to_date('29-JUL-12 14:42','DD-MON-YY HH24:MI'),
      repeat_interval => 'freq=daily; byminute=0; bysecond=0;',
      end_date => null,
      enabled => TRUE);
END;
/

על מנת לצפות במצב ריצה של הג'וב והתקדמות ה- Step- ים:

SELECT chain_name, 
       step_name, 
       state 
FROM   dba_scheduler_running_chains; 

CHAIN_NAME                        STEP_NAME                  STATE
---------------------------------------------------------------------
NEW_EMPLOYES_PROCEDURE_CHAIN   NEW_EMPLOYES_STEP_1        SUCCEEDED
NEW_EMPLOYES_PROCEDURE_CHAIN   NEW_EMPLOYES_STEP_2        SUCCEEDED
NEW_EMPLOYES_PROCEDURE_CHAIN   NEW_EMPLOYES_STEP_3        NOT_STARTED 

JOB CLASS


ה- Job Class מאפשר הגדרת מאפיינים אשר יהיו אחידים לכל ג'וב אשר משיוך לאותו ה- Job Class. כל Job יכול להיות משויך ל- Job Class  אחד בלבד.
את ה- Job Class נגדיר על ידי ציון פרמטר  job_class בעת ביצוע CREATE_JOB:

begin
      DBMS_SCHEDULER.CREATE_JOB_CLASS (
            job_class_name            => 'HEAVY_LOADS',
            resource_consumer_group   => null,
            service                   => 'HEAVY_SCHEDULES_INSTANCES',
            logging_level             => DBMS_SCHEDULER.LOGGING_RUNS,
            log_history               => 7,
            comments                  => NULL);
end;
/

או לחלופין ניתן לשנות את השיוך באופן הבא:

begin
DBMS_SCHEDULER.SET_ATTRIBUTE (
name => 'UPDATE_ALL_SALARIES',
attribute => 'job_class' ,
value => 'HEAVY_LOADS ');
end;
/ 

ב- Job Class אשר בדוגמה הגדרנו פרמטרים הקובעים את המאפיינים המשותפים שישמשו את הג'ובים אשר משויכים ל- Job Class הזה, להלן מאפיינים שניתן להגדיר ב Job Class:

  1. שימוש ב- Service למען ייעוד Instance-ים מסוימים עבור הג'וב:
    מול איזה Service לעבוד, עוזר במיוחד בסביבת RAC שבה ניתן לציין שהג'וב יכול לרוץ רק על ה- Instance- ים שמוגדרים ב- Service.
    בסביבת RAC, כאשר היינו רוצים ב- DBMS_JOB לעשות חלוקת עומסים מסוימת האפשרות שלנו הייתה לקבוע על איזה Instance הג'וב יכול לרוץ. בשיטה הזאת היה ניתן להקדיש Instance מסוים לריצת ג'ובים בזמן ששאר ה- Instance- ים פנויים לעבודות אחרות.  ב- DBMS_SCHEDULER שיכללו את זה בכך שאפשרו להגדיר Service ברמת ה- Class, כל ג'וב המשויך ל- Class הזה, ירוץ רק על ה- Instance שיתקבל בהגדרות ה- Service.
  2. * שימוש ב- Resource Management:
    הקצאת ותעדוף משאבי מערכת עבור הג'וב בהתאם לשיוך ל- Resource Consumer Group.
    ה- DBMS_SCHEDULER מתממשק עם Resource Management באורקל. למי שלא מכיר, Resource Management מאפשר הקמת מדיניות של תעדוף וחלוקה של משאבים כגון אחוז ניצול CPU ורמת פרלליות על ידי חלוקה לקבוצות הנקראות  Resource Consumer Group, כאשר לכל קבוצה כזאת יכולים להשתייך משתמשים, Session- ים וג'ובים.
    *מאחר ומדובר בנושא שלם אני מעדיף לא להיכנס לזה אבל בסוף המאמר מופיע לינק להסבר מורחב.
    ** לא ניתן לשלב שימוש ב SERVICE ביחד עם RESOURCE MANAGEMENT.
  3. תעדוף ג'ובים
    בהגדרות הג'וב יש פרמטר הנקרא JOB_PRIORITY, הפרמטר יכול להכיל ערכים בין 1-5 (כברירת מחדל 3), פרמטר זה מאפשר לתעדף תחילת ריצה של ג'ובים המשויכים לאותו Class. כלומר במקרה ויש מספר ג'ובים תחת אותו Class בעלי תחילת ריצה זהה סדר הריצה יושפע לפי גודל הערך של JOB_PRIORITY, סדר הריצה יקבע מהערך הנמוך לגבוהה.
  4. תיעוד לוגים:
    ניתן לקבוע ברמת ה- Class מה תהיה רמת תיעוד לוגים וכמות הימים שיש לשמור אותם.
    הפרמטר LOGGING_LEVEL יכול להכיל אחד מהערכים הבאים:
  • DBMS_SCHEDULER.LOGGING_OFF – לא ייווצרו לוגים עבור שום ג'וב המשויך ל- Job Class.
  • DBMS_SCHEDULER.LOGGING_RUNS – ירשם בלוג כל ריצה של כל ג'וב המשויך ל- Job Class.
  • DBMS_SCHEDULER.LOGGING_FAILED_RUNS (11g) – ירשם בלוג רק הריצות הנכשלות של הג'ובים המשויכים ל- Job Class.
  • DBMS_SCHEDULER.LOGGING_FULL – יחד עם האופציה LOGGING_RUNS יתווספו גם רישומים בלוג עבור כל פעולת הגדרה של הג'וב כגון יצירה מחיקה ביטול וכולי…

הפרמטר LOG_HISTORY מציין כמה ימים לשמור את הלוגים.

SELECT job_name, 
       status, 
       log_date 
FROM   dba_scheduler_job_log 
WHERE  job_name = 'NEW_EMPLOYES_PROCEDURE_JOB' 
ORDER  BY log_date ; 

JOB_NAME                          STATUS           LOG_DATE
--------------------------------------------
NEW_EMPLOYES_PROCEDURE_JOB        SUCCEEDED        18-AUG-12 

סיכום

ראינו כיצד ניתן להקים גו'ב מורכב הבנוי ממספר תהליכים (job_steps) שרצים בתוכו על פי כללים מוגדרים ( job_rule). ראינו איזה מאפיינים זהים ניתן לתת לג'ובים השייכים לאותו ה- Job Class.
כלים אלה בתוספת למה שראינו בחלק 1 נותן הרבה מאוד כוח עבור הקמת סביבות של תזמון תהליכים.
כמובן, קיימות עוד יכולות רבות למנגנון של DBMS_SCHEDULER ובכל גרסה מתווספות עוד יכולות, אבל זה מעבר ליכולות של שני המאמרים האלה לכסות את כל היכולות לכן להלן לינק ל-   Oracle Documentation של  DBMS_SCHEDULER המכיל תיעוד של כלל היכולות:
http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_sched.htm#CIHHBGGI
תודה שקראתם אני מקווה שזה עזר לכם,
וגם תודה רבה לדניאל חביב שייעץ בכתיבת שני המאמרים.
תודה,
דימיטרי אברוטין.
בעל הסמכת OCP (Oracle Certified Professional)
ניסיון שנתיים אזרחי + שירות צבאי בממר"ם
עובד היום בתור DBA במפעל הפיס

The following two tabs change content below.

דימיטרי אברוטין

Latest posts by דימיטרי אברוטין (see all)

2 תגובות ל- “DBMS_SCHEDULER – חלק 2”

השאר תגובה:

שם (חובה):
אימייל (לא יפורסם) (חובה):
תגובה (חובה):

*



מאמרים קשורים

Baruch Osoveskiy

תיקון מהיר לדיסק איטי

  רציתי לשתף אתכם בתקלה שהיתה לי ובפיתרון שלה. לפעמים אני רוצה לבדוק גירסה חדשה או יכולת שלא מתועדת מספיק בספרות, ואז אני מסתפק בהקמה של סביבה ווירטואלית בדרך כלל על חומרה זולה (לפעמים זולה [...]
OS

OS Background operations

אורי לרנר בטיפ קצר ושימושי על העברת פעולות לרקע במערכת [...]
רשימת

רשימת הפיצ'רים החדשים של אורקל 12.1

אורקל פרסמו את הספרות הרשמית לגרסה 12.1 שיצאה לאחרונה וזמינה להורדה. בין שאר הספרים (החשובים כל אחד שלעצמו), פורסם הספר המסקרן ביותר בעיני – Oracle Database 12c Release 1 (12.1) New Features. זהו ספר שראוי שכל DBA [...]
גרסת

גרסת אורקל 12c זמינה להורדה

בשעה טובה ולאחר המתנה סופר ארוכה, גרסת אורקל 12c (גרסה 12.1) זמינה סוף סוף להורדה רשמית מהאתר של אורקל. הגרסה החדשה מנסה לתת פתרונות לעולם ה"ענן" – ומוסיפה פיצ'רים חדשים שבאים לתת מענה בדיוק [...]
Copyright 2019 ilDBA Portal. Brought to you by Brillix - Israel Leading DBA company. Sponsored by: DBSnaps - Database Video Tutorialss
Website Security Test
%d בלוגרים אהבו את זה: