1. 程式人生 > >MSSQL Sever 效能,磁碟等監控建立(一) 伺服器磁碟,使用量監控

MSSQL Sever 效能,磁碟等監控建立(一) 伺服器磁碟,使用量監控

  今天公司需要做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