הבלוג של גרי רשף

02/11/2011

אילו ג'ובים רצים כרגע?

שייך לקטגוריה: Uncategorized — גרי רשף @ 18:42

כיצד נדע אילו ג'ובים רצים או האם ג'וב מסויים רץ כרגע?
בדרך כלל ניגש ב-SSMS לסעיף Jobs (ב-SQL Server Agent) ונגיע להיסטוריה על ידי קליק ימני על הסעיף או על הג'וב הספציפי:

clip_image002

הבעייה היא שכך נגיע לרשימת הג'ובים שרצו והסתיימו, אך לא לאלו שרצים כרגע.
במקרה הטוב, אם לג'וב יש מספר צעדים (Steps) נוכל לראות את אלו שרצו וללמוד מכך על מה שרץ כרגע,
אך מה עם ג'ובים שיש להם רק צעד אחד או שהם עדיין בצעד הראשון?
האובייקטים השונים המטפלים בג'ובים, ההגדרות שלהם, ההיסטוריה, ההרשאות וכו'- נמצאים בדטבייס msdb; אולם בטבלאות נמצא את המידע המוצג ויזואלית ב-SSMS ולא את מה שאנחנו מחפשים.
המידע המבוקש נמצא בפרוצדורות מערכת בדטבייס הנ"ל- sp_help_job או sp_help_jobactivity שנעזרות בפרוצדורות Extended, ועם קצת יצרתיות נוכל להפוך אותן לשליפת Select שניתן לתחקר על ידי מיון / סינון / פילטור, ולבצע Join עם אובייקטים נוספים כדי להגיע לכל המידע הדרוש.
בשלב ראשון יש לבצע באופן חד פעמי הרשאה להרצת Ad Hoc Distributed Queries:

SP_Configure 'Ad Hoc Distributed Queries',1;
Go

Reconfigure With Override;
Go

וכעת לשליפה עצמה:

Select  HJ.name JobName,
        HJ.description JobDescription,
        JS.step_name StepName,
        JS.database_name [DB_Name],
        Cast(JS.command As XML) SQL,
        HJ.current_retry_attempt RetryAttempt,
        HJA.Start_execution_date StartJob,
        IsNull(HJA.last_executed_step_date,HJA.Start_execution_date) StartJobStep
From    OpenRowSet('SQLNCLI','Server=(Local);Trusted_Connection=Yes','Set FmtOnly Off Exec msdb.dbo.sp_help_job') HJ
Inner Join OpenRowSet('SQLNCLI','Server=(Local);Trusted_Connection=Yes','Set FmtOnly Off Exec msdb.dbo.sp_help_jobactivity') HJA
        On HJ.job_id=HJA.job_id
Inner Join msdb.dbo.sysjobsteps JS
        On HJ.job_id=JS.job_id
        And HJ.current_execution_step Like '%('+JS.step_name+')%'
Where   HJ.current_execution_status=1
        And HJA.start_execution_date Is Not Null
        And HJA.stop_execution_date Is Null;

עם המזל שלנו- אף ג'וב לא רץ כרגע, ואיך נוכל לדעת שזה באמת עובד?

ניצור בזריזות ג'וב בשם TryJob, ובו שני צעדים (Step1, Step2) שמופיעה בהם הפקודה:

WaitFor Delay '00:01'

(זו פעולת סרק שרצה במשך דקה ומסתיימת בהצלחה)

ונשמור אותו.

נפעיל את הג'וב (לא חייבים לתזמן אותו לשם כך):

Exec msdb..sp_start_job 'TryJob';
Go

וישר אחר כך את השליפה הנ"ל:

clip_image004

כעבור כדקה נריץ שוב וכעת נראה ש-Step2 רץ.

זו גרסה ראשונה ומינימלית, ובהמשך ארחיב אותה כך שתכלול מידע נוסף.

מי שרוצה- מוזמן לעשות זאת בעצמו.

ערכת עיצוב: Shocking Blue Green. בלוג בוורדפרס.קום.

Follow

Get every new post delivered to your Inbox.

הצטרפו אל 25 שכבר עוקבים אחריו