通过收集计数器信息,并将计数器信息汇总为不同粒度存储,以Reporting Service报表服务器显示。以下是计数器收集汇总的基本架构。
笔者需要收集的SQL Server计数器包括:SQL Server计数器属性详解
一、SQL Server计数器基本架构图
1、 生产服务器通过ODBCSQL Server性能计数器部署(批量)
2、 通过作业调用存储过程spb_Perf_CounterDataCollect将数据从SQLPerfData写入SQLPerfDataStat数据库。
1 /****************************** 功能描述:<性能计数器15秒统计> 2 * 创建者:<HuangCH〉 3 * 创建日期:<2014-09-22> 4 * 备注说明:<根据具体业务而定,每分钟一次> 5 ########## 6 Change Log 7 ########## 8 Date Changer Description 9 -------------------------------------------------- 10 <2014-09-22> <HuangCH> <新建> 11 -------------------------------------------------- 12 ***************************/ 13 ALTER PROC [dbo].[spb_Perf_CounterDataCollect] 14 as 15 --定义当前时间 16 SET NOCOUNT ON 17 DECLARE @FifteenSec DATETIME 18 ,@OneMinute DATETIME 19 ,@FiveMinute DATETIME 20 ,@HalfHour DATETIME 21 ,@OneHour DATETIME 22 ,@SixHour DATETIME 23 ,@OldFifteenSec DATETIME 24 25 DECLARE @MaxRecordIndex INT 26 DECLARE @MinRecordIndex INT 27 28 SET @FifteenSec=CONVERT(VARCHAR(23),GETDATE(),120) 29 SET @OneMinute=CONVERT(VARCHAR(16),@FifteenSec,120) 30 SET @FiveMinute=Dateadd(mi,Datepart(mi,@OneMinute) / 5 * 5 - Datepart(mi,@OneMinute),@OneMinute) 31 SET @HalfHour=Dateadd(mi,Datepart(mi,@OneMinute) / 30 * 30 - Datepart(mi,@OneMinute),@OneMinute) 32 SET @OneHour=CONVERT(VARCHAR(14),@FifteenSec,120)+'00:00' 33 SET @SixHour=Dateadd(HH,Datepart(mi,@OneHour) / 30 * 30 - Datepart(mi,@OneHour),@OneHour) 34 35 ------进入循环收集处理----------------------------------------------- 36 37 DECLARE @MachineName SYSNAME 38 DECLARE CUR_COUNTERDATA CURSOR FOR 39 SELECT DISTINCT MachineName 40 FROM [dbo].[CounterDetails_Collect] WITH(NOLOCK) 41 OPEN CUR_COUNTERDATA 42 FETCH NEXT FROM CUR_COUNTERDATA INTO @MachineName 43 44 WHILE @@FETCH_STATUS=0 45 BEGIN 46 47 IF NOT EXISTS (SELECT TOP 1 1 FROM [dbo].[CounterDetails_Dts] WHERE [MachineName]=@MachineName) 48 BEGIN 49 --添加未插入的数据 50 51 INSERT INTO [dbo].[CounterDetails_Dts] 52 SELECT @MachineName,0,@FifteenSec,@OneMinute,@FiveMinute,@HalfHour,@OneHour,@SixHour,@OneMinute,@OneMinute,@FifteenSec 53 54 FETCH NEXT FROM CUR_COUNTERDATA INTO @MachineName 55 CONTINUE 56 END 57 58 SELECT @MinRecordIndex=[LastRecordIndex],@OldFifteenSec=LastFifteenSec FROM [dbo].[CounterDetails_Dts] WITH(NOLOCK) 59 WHERE [MachineName]=@MachineName 60 61 62 IF DATEDIFF(MI,@OldFifteenSec,@FifteenSec)>25 63 BEGIN 64 SET @MinRecordIndex=0 65 END 66 67 SELECT @MaxRecordIndex=MAX([RecordIndex]),@FifteenSec=MAX(CONVERT(DATETIME,LEFT(A.CounterDateTime,23))) 68 FROM [SQLPerfData].[dbo].[CounterData] A WITH(NOLOCK) 69 WHERE CounterID=(SELECT TOP 1 CounterID FROM [dbo].[CounterDetails_Collect] B WITH(NOLOCK) WHERE B.MachineName=@MachineName) 70 AND [RecordIndex]>@MinRecordIndex 71 72 --若由于重启导致index恢复,则要重新计算 73 IF @MaxRecordIndex IS NULL 74 BEGIN 75 76 SET @MaxRecordIndex=@MinRecordIndex--上次最大值 77 SELECT @MinRecordIndex=NumberOfRecords FROM --当前最大值 78 ( 79 SELECT ROW_NUMBER() OVER(ORDER BY LogStartTime DESC) ROW_ID,NumberOfRecords 80 FROM [SQLPerfData].[dbo].[DisplayToID] 81 WHERE GUID IN( 82 SELECT DISTINCT A.GUID FROM [SQLPerfData].[dbo].[CounterData] A WITH(NOLOCK) 83 JOIN [dbo].[CounterDetails_Collect] B WITH(NOLOCK) ON A.CounterID=B.CounterID 84 WHERE B.MachineName=@MachineName) 85 ) AA 86 WHERE ROW_ID=1 87 88 --删除已经收集的 89 DELETE A FROM [SQLPerfData].[dbo].[CounterData] A WITH(NOLOCK) 90 JOIN [dbo].[CounterDetails_Collect] B WITH(NOLOCK) ON A.CounterID=B.CounterID 91 WHERE A.[RecordIndex]>@MinRecordIndex AND A.[RecordIndex]<=@MaxRecordIndex AND B.MachineName=@MachineName 92 93 --恢复当前有效值 94 SET @MaxRecordIndex=@MinRecordIndex 95 SET @MinRecordIndex=0 96 END 97 98 99 IF @MaxRecordIndex IS NOT NULL 100 BEGIN 101 BEGIN TRY 102 --BEGIN TRAN 103 ----收集 104 INSERT INTO [dbo].[CounterData_FifteenSeconds](CounterID,CounterDateTime,CounterValue) 105 SELECT A.CounterID,CONVERT(DATETIME,LEFT(A.CounterDateTime,23)),A.CounterValue 106 FROM [SQLPerfData].[dbo].[CounterData] A WITH(NOLOCK) 107 JOIN [dbo].[CounterDetails_Collect] B WITH(NOLOCK) ON A.CounterID=B.CounterID 108 WHERE A.[RecordIndex]>@MinRecordIndex AND A.[RecordIndex]<=@MaxRecordIndex AND B.MachineName=@MachineName 109 110 UPDATE [dbo].[CounterDetails_Dts] 111 SET LastFifteenSec=@FifteenSec,[LastRecordIndex]=@MaxRecordIndex 112 WHERE MachineName=@MachineName 113 --COMMIT 114 END TRY 115 BEGIN CATCH 116 IF @@TRANCOUNT>0 117 COMMIT; 118 --THROW 119 END CATCH 120 121 --更新 122 /* 123 UPDATE [dbo].[CounterDetails_Dts] 124 SET LastFifteenSec=@FifteenSec,[LastRecordIndex]=@MaxRecordIndex 125 WHERE [CounterID]=@CounterID */ 126 127 --删除30分钟内的数据 128 129 130 END 131 132 DELETE A 133 FROM [CounterData_FifteenSeconds] A 134 JOIN [dbo].[CounterDetails_Collect] B WITH(NOLOCK) ON A.CounterID=B.CounterID 135 WHERE B.MachineName=@MachineName AND CounterDateTime<DATEADD(WEEK,-1,@FifteenSec) 136 137 FETCH NEXT FROM CUR_COUNTERDATA INTO @MachineName 138 END 139 CLOSE CUR_COUNTERDATA 140 DEALLOCATE CUR_COUNTERDATA 141 142 --监控