1、背景
隨着時間的推移,我們的DW會越來越大,也就意味着磁盤空間會越來越小,那如果哪一天留意不當,就會造成磁盤空間的不足而導致ETL失敗,最終影響我們的系統的數據正確性和使用,更嚴重的有可能導致物理磁盤損壞,所以對於物理磁盤空間的監控必不可少。
下面的方法就是利用SSIS中的WMI數據讀取器任務去每天查詢物理磁盤的空餘空間,當不足時發郵件以提示管理員。
2、步驟
2.1、新建一個SSIS包,從工具欄上拖拉一個[WMI 數據讀取任務]到控制流,雙擊編輯組件屬性
新建變量
變量名 | 類型 | 用途 |
DiskUsageRet | string | 用於存儲結果集 |
Flag | int | 用於判斷磁盤空間的剩餘空間是否不滿足要求 |
在[WmiConnection]欄,新建個WMI連接管理器
在[服務和命名空間]選項中,[服務器名稱]輸入你要監視的服務器的\\ + IP地址,命名空間默認即可
P.S:如果[服務器名稱]爲本機地址,則必須使用windows身份驗證,如果使用用戶憑據,則有可能會出現如下圖錯誤,如果是遠程的服務器地址,則需要使用相應的用戶名和密碼登錄
配置完畢後點擊測試,看是否驗證通過
2.2、在在組件的屬性編輯界面,[WMI選項]中,設置[WqlQuerySource]爲以下語句
該語句是查詢對應磁盤的剩餘空間,剩餘空間單位是Bit,所以需要我們後面自行換算。當然Win32_LogicalDisk有很多其他的字段,你可以輸入select * from Win32_LogicalDisk,並且在對應的OutputType設置[數據表],在OverwriteDestination設置[覆蓋目標],並將結果映射到變量中,最後用腳本組件,查看變量中的返回結果,你就可以大概知道其中的關鍵字段有哪些,代表何種含義,以下是本人查詢結果,全部字段:
所有字段 | Access, Availability, BlockSize, Caption, Compressed, ConfigManagerErrorCode, ConfigManagerUserConfig, CreationClassName, Description, DeviceID, DriveType, ErrorCleared, ErrorDescription, ErrorMethodology, FileSystem, FreeSpace, InstallDate, LastErrorCode, MaximumComponentLength, MediaType, Name, NumberOfBlocks, PNPDeviceID, PowerManagementCapabilities, PowerManagementSupported, ProviderName, Purpose, QuotasDisabled, QuotasIncomplete, QuotasRebuilding, Size, Status, StatusInfo, SupportsDiskQuotas, SupportsFileBasedCompression, SystemCreationClassName, SystemName, VolumeDirty, VolumeName, VolumeSerialNumber |
每個字段對應的值 | 0, , , C:, False, , , Win32_LogicalDisk, Local Fixed Disk, C:, 3, , , , NTFS, 13594468352, , , 255, 12, C:, , , , , , , True, False, False, 80533680128, , , True, True, Win32_ComputerSystem, JOHN-PC, False, OS, F636E868 |
關鍵屬性講解:
WmiConnection | 連接WMI服務器對象,需要我們創建一個WMI連接 |
WqlQuerySourceType | 查詢語句存放類型(地方) |
WqlQuerySource | 查詢語句,根據存放類型的不同,這裏會有相應的變換,如果存放類型選擇文件,這裏就需要選擇對應的語句文件 |
OutputType | 查詢結果輸入形式。 數據表:一個完整的數據表結果集 屬性名稱和值:以一個屬性名稱和一個值一行的結果集形式返回,如:FreeSpace, 13587701760 屬性值:單純範圍查詢字段的值集合 |
OverWriteDestination | 寫入目標的方式。
保留原始值:保留目標中的原始值 覆蓋目標:將結果覆蓋目標中的值 追加到目標:將結果值追加到目標 |
DestinationType | 目標類型。
變量:結果保存到變量 文件連接:將結果保存到文件 |
Destination | 目標對象
根據DestinationType不同,設置不同 |
2.3、將我們的查詢結果保存到變量之後,我們就可以利用腳本組件,判斷變量中的結果,以檢視磁盤查詢的空間是否滿足要求
編輯腳本,其中的main方法如下:
public void Main() {
double unit = 1024 * 1024 * 1024; //查詢的space是以b爲單位的,必須將其換算成G,這裏判斷是否小於20G double diskspace = Convert.ToDouble(Dts.Variables["DiskUsageRet"].Value) / unit / 20; if (diskspace < 1) { Dts.Variables["Flag"].Value = 1; // MessageBox.Show("空間不足20G", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); } else {
Dts.Variables["Flag"].Value = 0; // MessageBox.Show("空間大於20G", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } //MessageBox.Show(Dts.Variables["DiskUsageRet"].Value.ToString()); Dts.TaskResult = (int)ScriptResults.Success; }
最後我們在寫一個發送郵件的腳本,對於結果發送郵件即可
public void Main() { MailMessage mymail = new MailMessage("xxxx@126.com", "[email protected]", "服務器C盤空間不足", "服務器C盤空間不足,請檢查"); SmtpClient smtp = new SmtpClient("smtp.126.com"); smtp.Credentials = new NetworkCredential("xxxx@126.com", "密碼"); smtp.Send(mymail); Dts.TaskResult = (int)ScriptResults.Success; }
最終但我們的空間不滿足檢查要求的時候,我們就可以收到郵件提醒了