content top
מדריך: ניטור המקום הפנוי בדיסק – חלק שני

מדריך: ניטור המקום הפנוי בדיסק – חלק שני

בחלק הקודם של המדריך הצגנו אפשרות ניטור של הדיסק באמצעות כלי מערכת ההפעלה.

כעת נעבור לשיטה השניה, באמצעות פרוצדורות מובנות ב SQL Server.

 

הפרוצדורה xp_fixeddrives מביאה לנו את רשימת הדיסקים ואת המקום הפנוי בהם (ב MB).

image

 

הפרוצדורה מאפשרת לנו לקבל מידע על הכוננים שיש לנו ועל המקום הפנוי בכל כונן. אבל אם נרצה לקבל מידע על סה"כ המקום בכונן (או פרטים מורכבים יותר) נוכל להשתמש בסדרת פרוצדורות מסוג OLE Automation שמאפשרות לנו לקבל מידע אם להפעיל רכיבים בעלי ממשק מסוג OLE.

השיטה כאן נראת מורכבת בהתחלה אבל לאחר תרגול ניתן לגלות את אינסוף האפשרויות שטמונות בה.

לצורך השיטה יש:

  1. ליצור אובייקט (למעשה מצביע) לביצוע פעולות על ה File System.
  2. להתמקם על ישות בתוך האובייקט באמצעות מצביע נוסף, במקרה שלנו הכונן שאנחנו רוצים לנתח.
  3. לקבל את התכונה הרצויה מהאובייקט המבוקש, במקרה שלנו גודל הכונן שעליו התמקמנו.
  4. לבטל את ההצבעה לאובייקט שיצרנו ב 1.

לצורך ביצוע הפעולות עלינו לוודא שSQL Server אכן מאשר ביצוע פעולות OLE וזאת ע"י הרצת סט הפקודות:

sp_configure 'show advanced options', 1;

GO

RECONFIGURE;

GO

sp_configure 'Ole Automation Procedures', 1;

GO

RECONFIGURE;

 

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



declare


@ObjectToken int,


@DriveID int,


@TotalDiskSize varchar(20)


 

והפקודות שנריץ (לפי סדר הסעיפים שהגדרנו):

exec sp_OACreate 'Scripting.FileSystemObject', @ObjectToken OUT


exec sp_OAMethod @ObjectToken, 'GetDrive', @DriveID OUT, 'C'


exec sp_OAGetProperty @DriveID, ‘TotalSize’, @TotalDiskSize OUT


exec sp_OADestroy @ObjectToken

 

התוצאה הסופית:

image

 

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



create function dbo.getDriveTotalSize(@Drive char(1)) returns bigInt


begin


declare


@ObjectToken int,


@DriveID int,


@TotalDiskSize varchar(20)


exec sp_OACreate 'Scripting.FileSystemObject', @ObjectToken OUT


exec sp_OAMethod @ObjectToken, 'GetDrive', @DriveID OUT, @Drive


exec sp_OAGetProperty @DriveID, 'TotalSize', @TotalDiskSize OUT


exec sp_OADestroy @ObjectToken


return(cast(@TotalDiskSize as bigint))


end


 

והשתמשתי בה בשאילתא הבאה (בצירוף הפרוצדורה xp_fixeddrives) כדי לקבל את כל המידע שמעניין אותי על הכוננים שיש לי:



declare @Drives table (Drive char(1) NOT NULL, FreeSpaceMB int NULL);


insert @Drives(Drive, FreeSpaceMB) exec master.dbo.xp_fixeddrives;


with DrivesInfo(Drive, TotalSpaceMB, FreeSpaceMB) as


(


select Drive,dbo.getDriveTotalSize(Drive)/1024/1024 as TotalSpaceMB,FreeSpaceMB


from @Drives


)


select Drive, TotalSpaceMB, FreeSpaceMB, 100*FreeSpaceMB/TotalSpaceMB FreeSpacePCT


from DrivesInfo


 

 

הסקריפט מחזיר את התוצאה הבאה:

image

 

 

אם יש חריגה בגודל – ניתן לטפל בו באמצעות סקריפט שמקטין נפחים במסדי הנתונים הרלוונטים או שולח דוא"ל.

 

לסיכום

ניתן לבחור במתן התראות ע"י מערכת ההפעלה או TSQL כדי להגיב על חריגה במקום החופשי בדיסקים שלנו.

יש מספר רב של דרכים שלא הצגתי ויכולות לאפשר את קבלת אותו מידע בדיוק, למשל:

שימוש בAlert מסוג WMI (בSQL Server agent), שימוש ב SSIS להרצת ה OLE או שימוש בכלים קנויים (מה שמלכתחילה הטיפ נועד למנוע).

תהנו.


3 תגובות על “מדריך: ניטור המקום הפנוי בדיסק – חלק שני”

  1. מאת פלג:

    1)יותר נכון לנטר דיסק בדרך הראשונה שציינת.
    2)מדובר בחור אבטחה, מאחר ושימוש ב
    exec sp_OACreate 'Scripting.FileSystemObject', @ObjectToken OUT
    פשוט פותח פתח לצרות. (SAME SAME FOR xp_cmdshell)
    3)יש טענות על בעיות של זכרון עקב שימוש בפונקציה הזו.
    4)אם כבר אתה רוצה עדין לעשות את זה באמצעות ה SQL, תכתוב CLR.

  2. מאת שי אנגלברג:

    החל מ2008 R2 SP1, (קיימת גם ב 2012) נוספה פונקציה חדשה – sys.dm_os_volume_stats (http://msdn.microsoft.com/en-us/library/hh223223.aspx)

    פונקציה זו מאפשרת לנו לראות את המקופ הםנוי בכל תיקייה בה יושב FILE של אחד ה DB שלנו.
    היתרון של הפונקציה הזו הוא שהיא מתחשבת ספציפית בתיקייות ולא בכוננים ומתייחסת נקודתית לקבצי ה DB.
    את ההבדל ניתן לראות במקרה שתיקיית ה DB שלנו מוגדרת כ MOUNTPOINT.

    מאוד נוח לשימוש, מומלץ.

  3. בהמשך להערתו של שי אנגלברג, החל מגרסה 2008 R2 , ניתן להריץ את השאילתא:
    SELECT distinct volume_mount_point, total_bytes, available_bytes
    FROM sys.master_files AS f
    CROSS APPLY sys.dm_os_volume_stats(f.database_id, f.file_id);
    כדי לקבל לכל אחד מהדיסקים את השטח הכללי והשטח הפנוי.

כתיבת תגובה

האימייל לא יוצג באתר. (*) שדות חובה מסומנים

seven − two =