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

14/11/2011

הפרדה בין קבצי Trace של ג'ובים

Filed under: Uncategorized — גרי רשף @ 19:58

כשמריצים ג'וב יש אפשרות להפנות את הפלט של הג'וב לקובץ או לטבלה (הכוונה להודעות המערכת כמו כמה שורות עודכנו בטבלה או הודעות שגיאה במקרה של תקלה, פקודות Print למעקב ששתלנו בקוד וכו'):

clip_image002

בדוגמה זו ה-Trace מופנה לקובץ: כך מקובל, בעיקר כשיש הרבה שורות פלט ולא רוצים להכביד על המערכת בפעולות כתיבה לטבלאות.
כפי שניתן לראות- אופציית Append output to existing file מאפשרת לנו לבחור אם ליצור בכל ריצה קובץ Trace חדש שידרוס את הקודם (כשהתיבה אינה מסומנת), או לעדכן את הקובץ הקיים.
לשתי האפשרויות חסרונות: אם נדרוס את הקובץ הקיים- לא נוכל לתחקר ריצות קודמות (נניח- הג'וב רץ כל שעה, בבוקר גילינו שהריצה של 3:00 בבוקר נכשלה, אבל כעת השעה 8:30 ואפשר לראות רק את הקובץ של ריצת 8:00 שהצליחה), ואם לא נדרוס ונעדכן את הקיים- נקבל קבצי ענק שיהיה קשה למצוא בהם את הידיים והרגליים.
פתרון אפשרי לבעייה הוא פרוצדורה רב שימושית שיש להוסיף בצעד האחרון של הג'וב, שתשנה את שם קובץ ה-Trace לשם שכולל את התאריך והשעה. במקרה כזה יהיה לכל ריצה של הג'וב קובץ משלה שנוכל לזהות אותו לפי השם או לפי שעת יצירת הקובץ:

CREATE Proc P_ChangeJobTraceFileName As
Declare @FileName Varchar(Max),
        @Command Varchar(8000),
        --@JobName Sysname,
        @jobID UniqueIdentifier,
        @SQL NVarchar(Max);

--זיהוי שם הג'וב
Set @SQL = 'SET @guid = Cast(' + SubString(App_Name(), 30, 34) + ' As UniqueIdentifier)';
Exec SP_ExecuteSQL @SQL, N'@guid UniqueIdentifier Out', @guid = @jobID Out;
--Set @jobName = (Select name From msdb..sysjobs Where job_id=@jobID);

--Trace-זיהוי שם קובץ ה
Select @FileName=output_file_name
From   msdb.dbo.sysjobsteps
Where  job_id=@jobID
Order By step_id Desc;

Print '@FileName='+IsNull(@FileName,'Null');

--שינוי שם הקובץ
Set @Command='Ren "'+@FileName+'" "'+Right(@FileName,CharIndex('\',Reverse(@FileName))-1)+'_'+Replace(Replace(Replace(Convert(Varchar(Max),GetDate(),120),'-',''),':',''),' ','_')+'.txt"';
Exec XP_CmdShell @Command;
GO

כפי שאפשר לראות הפרוצדורה נטולת פרמטרים, ולכן ניתן להשתמש בה As Is (כפי שנהוג לכתוב בכתבי האחריות לתוכנות):

היא מזהה את שם הג'וב שבו היא רצה,

מוצאת את שם קובץ ה-Trace בטבלאות המערכת,

יוצרת פקודת Ren לשינוי השם שלו לשם שכולל את התאריך והשעה,

ומפעילה את הפקודה בעזרת XP_CmdShell.

הערות: יש להקפיד שהפלט של הצעד בו הפרוצדורה מופעלת לא יופנה לקובץ ה-Trace אותו היא מנסה לשנות, ולא תיווצר שגיאה כי הוא נעול על ידיה.

בג'וב יש להפעיל את הפרוצדורה על ידי פקודת Exec MyDB.. P_ChangeJobTraceFileName.

אם לא רוצים להתחבר לשרת ולנבור במחיצות שלו- ניתן לקבל את שמות קבצי ה-Trace ממויינים בסדר יורד כך:

Exec XP_CmdShell 'Dir/O-N "C:\MyTraceFile*.txt"';
Go

ואת התוכן של קובץ ספציפי כך:

Exec XP_CmdShell 'Type "C:\MyTraceFile.txt_20111110_130059.txt"';
Go
מודעות פרסומת

להגיב »

עדיין אין תגובות.

RSS feed for comments on this post. TrackBack URI

כתיבת תגובה

הזינו את פרטיכם בטופס, או לחצו על אחד מהאייקונים כדי להשתמש בחשבון קיים:

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s

יצירה של אתר חינמי או בלוג ב־WordPress.com.

%d בלוגרים אהבו את זה: