MSSQL Sever 效能,磁碟等監控建立(一) 伺服器磁碟,使用量監控
阿新 • • 發佈:2019-01-24
今天公司需要做MSSQL Sever 伺服器各項指標,效能的監控. 這次是伺服器各磁碟的使用量,剩餘空間等監控.寫了一段指令碼.本著和大家交流學習的目的,望看到此文章的朋友對於文中不足或者錯誤的地方不吝指正.
此段指令碼針對於單臺伺服器查詢. 如果在一個伺服器叢集或者多臺裝置統計時,可以選擇linked server 或者查旬結果bcp到一個公共的共享區域,再彙總進行統計.出於安全性和許可權控制,我採用的是後者,公司不允許建立link server. 但是我想應該還有更好的更方便的方法.
指令碼如下:
--*************************************************************************************** --F.HY(2014/5/04) --Target:Ready for SQL Traffic Test --This script is to calculate SQL SERVER DISK FULL SIZE, FREE SPACE --*************************************************************************************** USE master Go IF EXISTS (SELECT name FROM tempdb..sysobjects WHERE name = '#_DriveSpace') DROP TABLE #_DriveSpace IF EXISTS (SELECT name FROM tempdb..sysobjects WHERE name = '#_DriveInfo') DROP TABLE #_DriveInfo IF EXISTS (SELECT name FROM tempdb.sys.tables WHERE name = 'Temp_DriveInfo') DROP TABLE tempdb..Temp_DriveInfo DECLARE @Result INT , @objFSO INT , @Drv INT , @cDrive VARCHAR(20) , @Size VARCHAR(50) , @Free VARCHAR(50) , @Label VARCHAR(20) CREATE TABLE #_DriveSpace ( DriveLetter CHAR(1) not null , FreeSpace VARCHAR(10) not null ) CREATE TABLE #_DriveInfo ( DriveLetter CHAR(1) , TotalSpace float , FreeSpace float , Label varchar(10) ) INSERT INTO #_DriveSpace EXEC master.dbo.xp_fixeddrives -- Iterate through drive letters. DECLARE curDriveLetters CURSOR FOR SELECT driveletter FROM #_DriveSpace DECLARE @DriveLetter char(1) OPEN curDriveLetters FETCH NEXT FROM curDriveLetters INTO @DriveLetter WHILE (@@fetch_status <> -1) BEGIN IF (@@fetch_status <> -2) BEGIN SET @cDrive = 'GetDrive("' + @DriveLetter + '")' EXEC @Result = sp_OACreate 'Scripting.FileSystemObject', @objFSO OUTPUT print @Result IF @Result = 0 EXEC @Result = sp_OAMethod @objFSO, @cDrive, @Drv OUTPUT IF @Result = 0 EXEC @Result = sp_OAGetProperty @Drv,'TotalSize', @Size OUTPUT IF @Result = 0 EXEC @Result = sp_OAGetProperty @Drv,'FreeSpace', @Free OUTPUT IF @Result = 0 EXEC @Result = sp_OAGetProperty @Drv,'VolumeName', @Label OUTPUT IF @Result <> 0 EXEC sp_OADestroy @Drv EXEC sp_OADestroy @objFSO SET @Size = (CONVERT(BIGINT,@Size) / 1048576 ) SET @Free = (CONVERT(BIGINT,@Free) / 1048576 ) INSERT INTO #_DriveInfo VALUES (@DriveLetter, @Size, @Free, @Label) END FETCH NEXT FROM curDriveLetters INTO @DriveLetter END CLOSE curDriveLetters DEALLOCATE curDriveLetters --PRINT 'Drive information for server ' + @@SERVERNAME + '.' --PRINT '' -- Produce report. --INSERT INTO MonitorDB..SERVER_DISKSPACE SELECT @@SERVERNAME as ServerName ,DriveLetter ,Label ,ROUND(TotalSpace/1024.0,3) AS [TotalSpace(GB)] ,ROUND(FreeSpace/1024.0,3) AS [FreeSpace(GB)] ,ROUND((TotalSpace - FreeSpace)/1024.0,3) AS [UsedSpace(GB)] ,ROUND((FreeSpace / TotalSpace) * 100.0,2) AS [PercentageFree(%)], CONVERT(varchar(100), GETDATE(), 20) AS [CheckTime] INTO Tempdb..Temp_DriveInfo FROM #_DriveInfo ORDER BY [DriveLetter] ASC GO DROP TABLE #_DriveSpace DROP TABLE #_DriveInfo GO --****************************************** --BCP OUT Result into txt --****************************************** --DECLARE @Bcp_Command_out NVARCHAR(200),@S_Name NVARCHAR(50); --SET @S_Name = @@SERVERNAME --+ '_'+ convert(varchar(19),getdate(),12); --SET @Bcp_Command_out = 'BCP Tempdb..Temp_DriveInfo out Address_Here'+ @S_Name + '_DriveInfo.txt -c -T' --Update suitable folder path for bcp command --EXEC XP_CMDSHELL @Bcp_Command_out --DROP TABLE tempdb..Temp_DriveInfo --GO