通过收集计数器信息,并将计数器信息汇总为不同粒度存储,以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 --监控
spb_Perf_CounterDataCollect

相关文章:

  • 2021-11-28
  • 2022-01-09
  • 2022-12-23
  • 2022-12-23
  • 2022-02-01
  • 2021-07-10
  • 2021-12-17
  • 2022-12-23
猜你喜欢
  • 2021-09-07
  • 2022-12-23
  • 2022-12-23
  • 2022-02-28
  • 2022-01-07
  • 2022-03-03
  • 2022-01-09
相关资源
相似解决方案