SQL Server性能计数器部署(批量)

一、计数器部署项目介绍

SQL Server每个服务器,日常需要监控的计数器指标高达上百,若一个个手动添加非常麻烦。此项目通过命令行工具针对指定计数器集成部署,提高部署效率。此包括开发数据库互联(ODBC)配置,通过ODBC访问监控服务器的数据库,将计数器信息传送到数据库中。同时还会详细讲解选取了哪些计数器,这些数据库的作用;以及如何利用相关的命令来实现批量部署。

二、计数器部署

计数器部署基本包括以下几个步骤:

  1. 筛选指定计数器名称输出到指定txt文件中:TypePerf.exe使用命令查找计数器
  2. 部署ODBC配置:开放数据库互联ODBC配置;通过 ODBC直接访问远程监控服务器数据库SQLPerfData, 由于是远程访问,若服务器宕机,监控服务器故障等等都将导致连接断开;连接断开将导致本地计数器停止。因此需要实时启动计数器,以保证计数器及时收集。本文通过系统任务调用vb脚本启动计数器。停止并删除原有计数器
  3.  新建最新的计数器(新建过程调用已有的txt文件):PerfMon.exe通过命令管理计数器若是域环境新建计数器的时候要执行启动账户为域账户;需要确保当前服务器账户在目标服务器中存在,且密码相同。
  4. 启动性能计数器
  5. 创建系统任务(五分钟执行一次,每次调用vb脚本,自动启动计数器)

例:部署服务器名称为117-27-139-236的计数器

步骤一、计数器初始化(若只是添加计数器,则不需要执行此步骤)

EXEC [dbo].[spb_PerfConfigure_New] '117-27-139-236'

得出以下结果:

clip_image001

 1 ALTER proc [dbo].[spb_PerfConfigure_New]
 2 @machinename sysname
 3 as
 4 SET NOCOUNT ON 
 5 DECLARE @MSG VARCHAR(MAX)
 6 SET @MSG=''
 7 IF NOT EXISTS(SELECT TOP 1 1 FROM SQLPerfData.dbo.CounterDetails WITH(NOLOCK) WHERE MachineName='\'+@machinename)
 8 BEGIN
 9   SELECT @MSG=@MSG+'结果01:'+@machinename+'服务器未收集任何计数器'+char(10)
10   GOTO RES
11 END
12 
13 BEGIN TRY
14     BEGIN TRAN
15     --删除SQLPerfData.dbo.CounterDetails
16     DELETE FROM SQLPerfData.dbo.CounterDetails
17     WHERE MachineName='\'+@machinename
18 
19     INSERT INTO SQLPerfDataStat.dbo.CounterDetails_Collect_bak
20     SELECT * FROM SQLPerfDataStat.dbo.CounterDetails_Collect
21     WHERE MachineName=@machinename
22 
23     DELETE FROM SQLPerfDataStat.dbo.CounterDetails_Collect
24     WHERE MachineName=@machinename
25 
26     DELETE FROM SQLPerfDataStat.[dbo].[CounterDetails_Dts]
27     WHERE MachineName=@machinename
28     COMMIT 
29 SELECT @MSG=@MSG+'结果01:'+@machinename+'原计数器已经删除完成'+char(10)
30 END TRY
31 BEGIN CATCH
32 SELECT @MSG='数据删除失败'+ERROR_MESSAGE()
33 IF @@TRANCOUNT>0
34 ROLLBACK;
35 THROW 50000,@MSG,1
36 END CATCH
37 
38 RES:
39 SELECT @MSG=@MSG+'结果02:'+'在服务器['+@machinename+']上执行以下脚本,后按步骤操作'+CHAR(10)
40 +'USE CONFIGDB
41 GO
42 EXEC [DBO].[spb_PerfConfigure]' ;
43 
44 THROW 50000,@MSG,1
spb_PerfConfigure_New

步骤二、生成部署脚本(从步骤一结果拷贝脚本到指定服务器执行。)

USE CONFIGDB
GO
EXEC [DBO].[spb_PerfConfigure]

得出以下结果:

clip_image002

  1 /****************************** 功能描述:<性能计数器部署>
  2 *   创建者:<HuangCH〉
  3 *   创建日期:<2014-09-22>
  4 *   备注说明:<手动执行>
  5 ##########
  6 Change Log
  7 ##########
  8 Date                 Changer             Description
  9 --------------------------------------------------
 10 <2014-09-24>        <HuangCH>            <新建>
 11 --------------------------------------------------
 12 ***************************/
 13 ALTER Proc [dbo].[spb_PerfConfigure]
 14 as
 15 
 16 SET NOCOUNT ON
 17 DECLARE @CMD VARCHAR(8000)
 18 DECLARE @Path VARCHAR(8000)
 19 DECLARE @RetCode INT
 20 DECLARE @ServerName VARCHAR(128)
 21 SELECT @ServerName = CASE 
 22                        WHEN Charindex('',@@SERVERNAME) > 0 THEN LEFT(@@SERVERNAME,Charindex('',@@SERVERNAME) - 1)
 23                        ELSE @@SERVERNAME
 24                      END
 25 
 26 
 27 --确认路径是否存在
 28 SELECT @Path = 'C:Perf_'+@ServerName+'_请勿删除'
 29 SELECT @CMD='DIR '+@Path
 30 EXEC @RetCode=MASTER.DBO.XP_CMDSHELL @CMD
 31 IF @RetCode=1
 32 BEGIN 
 33     SELECT @CMD='MD '+@Path
 34     EXEC @RetCode=MASTER.DBO.XP_CMDSHELL @CMD
 35 END
 36 
 37 IF OBJECT_ID('TEMPDB.DBO.TABLEOUT') IS NOT NULL
 38 BEGIN
 39   DROP TABLE TEMPDB.DBO.TABLEOUT
 40 END
 41 CREATE TABLE TEMPDB.DBO.TABLEOUT (vars VARCHAR(max))
 42 
 43 ----删除自动启动bat
 44 --SELECT @CMD = 'DEL C:Perf_'+@ServerName+'_请勿删除PerfAutoStart.bat'
 45 --EXEC @RetCode=MASTER.DBO.XP_CMDSHELL @CMD;
 46 
 47 ----添加自动启动脚本bat
 48 --TRUNCATE TABLE TEMPDB.DBO.TABLEOUT
 49 --INSERT INTO TEMPDB.DBO.TABLEOUT(VARS)
 50 --SELECT '@echo off'
 51 --UNION all
 52 --SELECT 'Logman Start Perf_'+@ServerName
 53 
 54 --SELECT @Path = 'C:Perf_'+@ServerName+'_请勿删除PerfAutoStart.bat'
 55 --SELECT @CMD='BCP TEMPDB.DBO.TABLEOUT OUT ' + @Path + ' -T -c -CRAW -S' + @@SERVERNAME
 56 --EXEC @RetCode=MASTER.DBO.XP_CMDSHELL @CMD;
 57 
 58 
 59 --删除自动启动vb
 60 SELECT @CMD = 'DEL C:Perf_'+@ServerName+'_请勿删除PerfAutoStart.vbs'
 61 EXEC @RetCode=MASTER.DBO.XP_CMDSHELL @CMD;
 62 
 63 --添加自动启动脚本vb
 64 TRUNCATE TABLE TEMPDB.DBO.TABLEOUT
 65 INSERT INTO TEMPDB.DBO.TABLEOUT(VARS)
 66 SELECT 'set ws=wscript.createobject("wscript.shell")'
 67 --UNION all
 68 --SELECT 'ws.run "PerfAutoStart.bat /start",0'
 69 UNION all
 70 SELECT 'ws.run "Logman Start Perf_'+@ServerName+'",0'
 71 
 72 
 73 SELECT @Path = 'C:Perf_'+@ServerName+'_请勿删除PerfAutoStart.vbs'
 74 SELECT @CMD='BCP TEMPDB.DBO.TABLEOUT OUT ' + @Path + ' -T -c -CRAW -S' + @@SERVERNAME
 75 EXEC @RetCode=MASTER.DBO.XP_CMDSHELL @CMD;
 76 
 77 
 78 
 79 --所有计数器临时存放
 80 IF OBJECT_ID('TEMPDB.DBO.TempPerf') IS NOT NULL
 81 BEGIN
 82   DROP TABLE TEMPDB.DBO.TempPerf
 83 END
 84 CREATE TABLE TEMPDB.DBO.TempPerf (VarStr VARCHAR(max))
 85 --计数器筛选存放
 86 IF OBJECT_ID('TEMPDB.DBO.Perf') IS NOT NULL
 87 BEGIN
 88   DROP TABLE TEMPDB.DBO.Perf
 89 END
 90 CREATE TABLE TEMPDB.DBO.Perf (VarStr VARCHAR(max))
 91 
 92 IF OBJECT_ID('CONFIGDB.DBO.PerfConfigSetting') IS NOT NULL
 93 BEGIN
 94   TRUNCATE TABLE CONFIGDB.DBO.PerfConfigSetting
 95 END
 96 ELSE
 97 BEGIN
 98   CREATE TABLE CONFIGDB.DBO.PerfConfigSetting (VarStr VARCHAR(max))
 99 END
100 
101 INSERT INTO  TEMPDB.DBO.TempPerf
102 EXEC( 'Master..XP_CMDSHELL ''TypePerf -qx''')
103 
104 --Step1:通用性能计数器
105 INSERT INTO TempDB.dbo.Perf(VarStr)
106 SELECT VarStr
107 FROM TempDB.dbo.TempPerf(NOLOCK) 
108 WHERE
109      --Cpu
110      (VarStr LIKE 'Processor(_Total)%'        
111               AND (VarStr LIKE '% Processor Time'
112                    OR VarStr LIKE '% Privileged Time'
113                    )
114               AND VarStr LIKE '%(_Total)%'
115           )
116      OR VarStr ='SystemProcessor Queue Length' 
117      --Memory
118      OR (VarStr LIKE 'Memory%' 
119               AND (VarStr LIKE '%Committed Bytes'
120                    OR VarStr LIKE '%Commit Limit'
121                    OR VarStr LIKE '%Available Mbytes'                       
122                    OR VarStr LIKE '%Cache Bytes'
123                    OR VarStr LIKE '%Page Faults/sec'
124                    OR VarStr LIKE '%Pages/sec'
125                    OR  VarStr LIKE '%Free System Page Table Entries'
126                    )        
127           )
128      --PhysicalDisk
129      OR(VarStr LIKE 'PhysicalDisk%' 
130             AND (
131                 (
132                     VarStr LIKE '%Avg. Disk sec/Read'
133                 AND VarStr NOT LIKE '%(_Total)%'                    
134                 )
135             OR (
136                     VarStr LIKE '%Avg. Disk sec/Write'
137                 AND VarStr NOT LIKE '%(_Total)%'
138                 )
139             OR (
140                     VarStr LIKE '%Avg. Disk sec/Transfer'
141                 AND VarStr NOT LIKE '%(_Total)%'
142                 )
143             OR (
144                     VarStr LIKE '%Avg. Disk Queue Length'
145                 AND VarStr NOT LIKE '%(_Total)%'
146                 )
147                 )
148           )
149      --LogicDisk
150      OR(VarStr LIKE 'logicalDisk%' 
151           AND (VarStr LIKE '%% Free Space'
152               OR VarStr LIKE '%Free Megabytes'
153               OR VarStr LIKE '%Disk Read Bytes/sec'
154               OR VarStr LIKE '%Disk Write Bytes/sec'
155               OR VarStr LIKE '%Disk Transfers/sec'
156               OR VarStr LIKE '%Free Megabytes'
157               )
158           AND VarStr NOT LIKE '%(_Total)%'
159           )
160      --SQLServer
161      OR(VarStr LIKE '%:Buffer Manager%' 
162           AND (VarStr LIKE '%Buffer cache hit ratio'
163               OR VarStr LIKE '%Page life expectancy'
164               OR VarStr LIKE '%Checkpoint pages/sec'
165               OR VarStr LIKE '%Lazy writes/sec'
166               OR VarStr LIKE '%Free pages'
167               OR VarStr LIKE '%Database pages'
168               OR VarStr LIKE '%Page reads/sec'
169               OR VarStr LIKE '%Page writes/sec'
170               OR VarStr LIKE '%Stolen pages'
171               )
172           )
173      OR (VarStr LIKE '%:Memory Manager%' 
174            AND (
175                      VarStr LIKE '%Total Server Memory (KB)'
176                 OR      VarStr LIKE '%Target Server Memory (KB)'
177                 OR      VarStr LIKE '%Memory Grants Pending'--指定等待工作空间内存授权的进程总数。
178                 --OR      VarStr LIKE '%Optimizer Memory (KB)'--指定服务器正用于查询优化的动态内存总数。
179                 --OR      VarStr LIKE '%SQL Cache Memory (KB)'--指定服务器正用于动态 SQL 缓存的动态内存总数。
180                 --OR      VarStr LIKE '%Lock Memory (KB)'--指定服务器用于锁的动态内存总量。
181                 --OR      VarStr LIKE '%Connection Memory (KB)'--指定服务器正用来维护连接的动态内存的总量。
182                 --OR      VarStr LIKE '%Granted Workspace Memory (KB)')--指定当前授予执行哈希、排序、大容量复制和索引创建操作等进程的内存总量。
183                 )
184      OR (VarStr LIKE '%:General Statistics%' 
185           AND (VarStr LIKE '%Processes blocked' 
186               OR VarStr LIKE '%User Connections'
187               OR VarStr LIKE '%Logins/sec'
188               OR VarStr LIKE '%Logouts/sec'
189               OR VarStr LIKE '%Temp Tables For Destruction'
190           )
191           )
192 
193      OR (VarStr LIKE '%:Wait Statistics%'
194      AND (
195               (
196               VarStr LIKE '%(平均等待时间(ms))Page IO latch waits'
197               OR VarStr LIKE '%(平均等待时间(ms))Page latch waits'
198               OR VarStr LIKE '%(平均等待时间(ms))Lock waits'
199               OR VarStr LIKE '%(平均等待时间(ms))Log write waits'
200               )
201 
202           OR (
203               VarStr LIKE '%(Average wait time (ms))Page IO latch waits'
204               OR VarStr LIKE '%(Average wait time (ms))Page latch waits'
205               OR VarStr LIKE '%(Average wait time (ms))Lock waits'
206               OR VarStr LIKE '%(Average wait time (ms))Log write waits'
207               )
208           )
209           )
210      OR (VarStr LIKE '%:Access Methods%' 
211           AND (VarStr LIKE '%Page Splits/sec'
212               OR VarStr LIKE '%Workfiles Created/sec'
213               OR VarStr LIKE '%Worktables Created/sec'
214               )
215           )
216      OR (VarStr LIKE '%:SQL Statistics%' 
217           AND (VarStr LIKE '%Batch Requests/sec'
218               OR VarStr LIKE '%SQL Compilations/sec'
219               OR VarStr LIKE '%SQL Re-Compilations/sec'
220               )
221           )
222      OR (VarStr LIKE '%:Locks%'
223             AND( 
224                 ( VarStr LIKE '%(_Total)%'
225                     AND(
226                         VarStr LIKE '%Lock Timeouts/sec'
227                         OR VarStr LIKE '%Lock Requests/sec'
228                         OR VarStr LIKE '%Lock Wait Time (ms)'            
229                         OR VarStr LIKE '%Lock Waits/sec'
230                         )
231                     )
232                 --OR (   (  
233                 --        VarStr LIKE '%(Key)%'
234                 --        OR VarStr LIKE '%(Metadata)%'
235                 --        OR VarStr LIKE '%(Object)%'
236                 --        OR VarStr LIKE '%(Page)%'
237                 --        OR VarStr LIKE '%(RID)%'
238                 --        )
239                 --    AND(VarStr LIKE '%Lock Wait Time (ms)'            
240                 --        OR VarStr LIKE '%Lock Waits/sec'
241                 --        )
242                     )
243                 )
244           OR (VarStr LIKE '%Number of Deadlocks/sec%' AND VarStr LIKE '%(_Total)%')
245           )
246     or( VarStr LIKE '%:Databases%'    
247           And (
248             --   VarStr LIKE '%Data File(s) Size (KB)'
249                --or VarStr LIKE '%Log File(s) Size (KB)'
250                 VarStr LIKE '%Transactions/sec'
251                --or VarStr LIKE '%Bulk Copy Rows/sec'
252                or VarStr LIKE '%Log Flushes/sec'
253                --or VarStr LIKE '%Log Flush Wait Time'
254                or VarStr LIKE '%Log Flush Waits/sec'
255                --or VarStr LIKE '%Log Flush Write Time (ms)'
256                )
257           And VarStr not like '%:Databases(tempdb)\%'
258           And VarStr not like '%:Databases(model)\%'
259           And VarStr not like '%:Databases(master)\%'
260           And VarStr not like '%:Databases(msdb)\%'
261           And VarStr not like '%:Databases(configdb)\%'
262           And VarStr not like '%:Databases(mssqlsystemresource)\%'
263           AND VarStr not LIKE '%(_Total)%'
264           )
265     or varstr like '%:TransactionsTransactions'
266 ORDER BY VarStr
267 --Step2:网络监控
268 DECLARE @Wmic TABLE(ID INT IDENTITY(1,1),ReMark VARCHAR(MAX)) 
269 INSERT INTO @Wmic EXEC Master..Xp_cmdshell 'wmic nicconfig get DNSHostName,Description,IPAddress,MACAddress,Index,InterfaceIndex /value'
270 ;WITH Y1 AS(
271 SELECT Id
272     ,REPLACE(LTRIM(RTRIM(LEFT(ReMark,CHARINDEX('"}',ReMark)-1))),'IPAddress={"','') AS IPAddress
273 FROM @Wmic
274 WHERE ReMark LIKE 'IPAddress={"%' 
275 )
276 ,Y2 AS(
277 SELECT A.ID
278     ,A.IPAddress
279     ,REPLACE(REPLACE(REPLACE(REPLACE(LTRIM(RTRIM(REPLACE(B.ReMark,'Description=',''))),'/','_'),'#','_'),CHAR(10),''),CHAR(13),'')AS Desc1
280     ,LTRIM(RTRIM(REPLACE(C.ReMark,'MACAddress=','')))AS MACAddress
281 FROM Y1    A
282 CROSS APPLY(SELECT TOP 1 Id,ReMark
283             FROM @Wmic
284             WHERE Id <A.ID
285                 AND (ReMark LIKE 'Description=%')
286             ORDER BY Id DESC
287             )B  
288 CROSS APPLY(SELECT TOP 1 Id,ReMark
289             FROM @Wmic
290             WHERE Id >A.ID
291                 AND (ReMark LIKE 'MACAddress=%')
292             )C  
293 )
294 ,Y3 AS(
295 SELECT DISTINCT A.*
296     ,B.ID AS ID_B
297     ,REPLACE(REPLACE(REPLACE(REPLACE(LTRIM(RTRIM(REPLACE(C.ReMark,'Description=',''))),'/','_'),'#','_'),CHAR(10),''),CHAR(13),'')AS Desc2
298 FROM Y2 A
299 INNER JOIN @Wmic B ON B.ReMark LIKE '%'+A.MACAddress AND A.ID<>B.ID 
300 CROSS APPLY(SELECT TOP 1 Id,ReMark
301             FROM @Wmic
302             WHERE Id <B.ID
303                 AND (ReMark LIKE 'Description=%')
304             ORDER BY Id DESC
305             )C  
306 )
307 ,Y4 AS(
308 SELECT A.*
309     ,CAST(REPLACE(REPLACE(LTRIM(RTRIM(REPLACE(B.ReMark,'Index=',''))),CHAR(10),''),CHAR(13),'')AS INT)AS IndexId
310     ,CAST(REPLACE(REPLACE(LTRIM(RTRIM(REPLACE(C.ReMark,'InterfaceIndex=',''))),CHAR(10),''),CHAR(13),'')AS INT)AS InterfaceIndex
311 FROM Y3 A 
312 CROSS APPLY(SELECT TOP 1 ReMark
313             FROM @Wmic
314             WHERE Id >A.ID_B
315                 AND (ReMark LIKE 'Index=%')
316             )B  
317 CROSS APPLY(SELECT TOP 1 ReMark
318             FROM @Wmic
319             WHERE Id >A.ID_B
320                 AND (ReMark LIKE 'InterfaceIndex=%')
321             )C  
322 WHERE A.Desc1<>A.Desc2
323 )
324 ,Y5 AS(
325 SELECT ROW_NUMBER()OVER(ORDER BY IndexId,InterfaceIndex)AS Rnt,* 
326 FROM Y4 
327 )
328 ,Y6 AS(
329 SELECT Rnt,IPAddress,Desc1,MACAddress
330     ,CASE WHEN Rnt=1 THEN Desc2 ELSE Desc2+' _'+RTRIM(CAST(Rnt AS CHAR))END AS Desc2
331 FROM Y5 
332 UNION 
333 SELECT 1,IPAddress,Desc1,MACAddress,Desc2
334 FROM Y3
335 WHERE Desc1=Desc2
336 )
337 ,Y7 AS(
338 SELECT VarStr
339 FROM TempDB.dbo.TempPerf(NOLOCK)
340 WHERE VarStr LIKE '
etwork interface%'
341     AND (VarStr LIKE '%Current Bandwidth'
342         OR VarStr LIKE '%Bytes Received/sec'
343         OR VarStr LIKE '%Bytes Sent/sec'
344         OR VarStr LIKE '%Bytes Total/sec'
345         OR VarStr LIKE '%Output Queue Length'
346         OR VarStr LIKE '%Packets Outbound Discarded'
347         OR VarStr LIKE '%Packets Outbound Errors'
348         OR VarStr LIKE '%Packets Received Discarded'
349         OR VarStr LIKE '%Packets Received Errors'
350         )
351 )
352 ,Y8 AS(
353 SELECT A.*,B.*
354 FROM Y7 A
355 INNER JOIN Y6 B ON 1=1 
356     AND REPLACE(REPLACE(A.VarStr,'[','('),']',')') LIKE '%('+B.Desc2+'%'
357 )
358 INSERT INTO TempDB.dbo.Perf(VarStr)
359 SELECT DISTINCT VarStr 
360 FROM Y8
361 --添加
362 --INSERT INTO CONFIGDB.DBO.PerfConfigSetting
363 --SELECT *FROM TempDB.dbo.Perf
364 
365 --删除计数器配置文件
366 SELECT @CMD = 'DEL C:Perf_'+@ServerName+'_请勿删除首次部署_PerfConfigure_' + @ServerName + '_*.txt'
367 EXEC @RetCode=MASTER.DBO.XP_CMDSHELL @CMD
368 --导出计数器配置文件
369 SELECT @Path = 'C:Perf_'+@ServerName+'_请勿删除首次部署_PerfConfigure_' + @ServerName + '_' + REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(19),Getdate(),21),'-',''),':',''),' ','') + '.txt'
370 SELECT @CMD='BCP TEMPDB.DBO.Perf OUT ' + @Path + ' -T -c -CRAW -S' + @@SERVERNAME
371 EXEC @RetCode=MASTER.DBO.XP_CMDSHELL @CMD
372 
373 --添加部署脚本
374 TRUNCATE TABLE TEMPDB.DBO.TABLEOUT
375 INSERT INTO TEMPDB.DBO.TABLEOUT(VARS)
376 SELECT '@echo off'
377 UNION all
378 --SELECT 'echo 正在删除同名称Cliconfg...'
379 --UNION all 
380 --SELECT 'reg delete  "HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSSQLServerClientConnectTo" /v SQLPerforMance /f'
381 --UNION all 
382 --SELECT 'echo -'
383 --UNION all 
384 --SELECT 'echo 正在添加Cliconfg部署...'
385 --UNION all 
386 --SELECT 'reg add  "HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSSQLServerClientConnectTo" /v SQLPerforMance /t REG_SZ /d DBNMPNTW,\117-27-139-236PIPEsqlquery'
387 --UNION all 
388 --SELECT 'echo -'
389 --UNION all 
390 SELECT 'echo 正在部署ODBC...'
391 UNION all
392 SELECT 'odbcconf CONFIGSYSDSN "Sql Server" "DSN=Perf_'+@ServerName+'|SERVER=10.195.0.136,55944|Database=SQLPerfData|Trusted_Connection=yes"'
393 UNION all
394 SELECT 'echo -'
395 UNION all
396 SELECT 'echo 正在停止已经存在的计数器...'
397 UNION all
398 SELECT 'Logman Stop Perf_'+@ServerName
399 UNION all
400 SELECT 'echo -'
401 UNION all
402 SELECT 'echo 正在删除已经存在的计数器...'
403 UNION all
404 SELECT 'Logman Delete Perf_'+@ServerName
405 UNION all
406 SELECT 'echo -'
407 UNION all
408 SELECT 'echo 正在部署新计数器...'
409 UNION all
410 SELECT 'Logman Create counter Perf_'+@ServerName+' -si 00:00:15 -cf "' + @Path + '" -o Perf_'+@ServerName + '!Perf_'+@ServerName + ' -f sql -v mmddhhmm '+CASE WHEN Serverproperty('ISClustered') = 1 or Serverproperty('IsHadrEnabled')=1 THEN '-u fzcyjhadministrator "sql.jdyou.org.Sqldata"' ELSE  '' END
411 UNION all
412 SELECT 'echo -'
413 UNION all
414 SELECT 'echo 正在初始化并启动计数器...'
415 UNION all
416 SELECT 'Logman Start Perf_'+@ServerName
417 UNION all
418 SELECT 'echo -'
419 UNION all
420 SELECT 'echo 完成计数器部署'
421 UNION all
422 SELECT 'echo -'
423 UNION all
424 SELECT 'echo 正在删除系统任务计划...'
425 UNION all
426 SELECT 'schtasks /delete /tn "[请勿删除]Perf_'+@ServerName+'_计数器自动启动" /f'
427 UNION all
428 SELECT 'echo -'
429 UNION all
430 SELECT 'echo 正在创建系统任务计划...'
431 UNION all
432 SELECT 'schtasks /create /sc MINUTE /mo 5 /st 00:05:00 /tn "[请勿删除]Perf_'+@ServerName+'_计数器自动启动" /tr C:Perf_'+@ServerName+'_请勿删除PerfAutoStart.vbs /ru "System"'
433 --UNION all
434 --SELECT 'echo 添加开机启动...'
435 --UNION all
436 --SELECT 'reg add HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRun /v Perf_'+@ServerName+'_计数器自动启动vbs /d '+@Path
437 UNION all
438 SELECT 'echo -'
439 UNION all
440 SELECT 'echo. & pause'
441 
442 --删除部署文件
443 SELECT @CMD = 'DEL C:Perf_'+@ServerName+'_请勿删除首次部署_执行脚本_' + @ServerName + '_*.bat'
444 EXEC @RetCode=MASTER.DBO.XP_CMDSHELL @CMD;
445 --添加部署文件
446 SELECT @Path = 'C:Perf_'+@ServerName+'_请勿删除首次部署_执行脚本_' + @ServerName + '_' + REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(19),Getdate(),21),'-',''),':',''),' ','') + '.bat'
447 SELECT @CMD='BCP TEMPDB.DBO.TABLEOUT OUT ' + @Path + ' -T -c -CRAW -S' + @@SERVERNAME
448 EXEC @RetCode=MASTER.DBO.XP_CMDSHELL @CMD;
449 
450 
451 DECLARE @INFO VARCHAR(MAX)
452 --群集环境
453 IF  Serverproperty('ISClustered') = 1
454   BEGIN
455     DECLARE @CurNode VARCHAR(128)
456     DECLARE @ALLNode VARCHAR(128)
457     SELECT TOP 1 @CurNode=NodeName FROM sys.dm_os_cluster_nodes WITH(NOLOCK)
458     WHERE is_current_owner=1
459     SET @INFO='恭喜!!!成功在群集主节点服务器['+@CurNode+']生成部署文件。'+CHAR(10)+'请按以下步骤执行部署:'
460     SELECT @INFO=@INFO
461           +CHAR(10)+'部署节点['+NodeName+']:从主节点提取以上生成的部署文件'
462           +CHAR(10)+'步骤一(部署):在['+NodeName+']节点执行Bat文件 :'+@path
463 
464           +CHAR(10)+'步骤二(检测_5分钟):在[117-27-139-236]监控服务器上执行 : EXEC [SQLPerfData].[dbo].[spb_PerfConfigure_Check] '''+NodeName+''''
465           +CHAR(10)
466     FROM sys.dm_os_cluster_nodes WITH(NOLOCK) 
467   END
468 ELSE
469 BEGIN
470     SET @INFO='恭喜!!!成功在服务器本地生成部署文件!'+CHAR(10)+'请按以下步骤执行部署:'
471       +CHAR(10)+'步骤一(部署):在['+@ServerName+']服务器执行Bat文件 :'+@path
472       +CHAR(10)+'步骤二(检测_5分钟):在[117-27-139-236]监控服务器上执行 : EXEC [SQLPerfData].[dbo].[spb_PerfConfigure_Check] '''+@ServerName+''''
473 END;
474 THROW 50000,@INFO,1
spb_PerfConfigure

步骤三、部署性能计数器(按步骤二结果的步骤执行。执行首次部署的Bat文件。)

部署需要在当前节点上执行封装脚本,执行完成后,会输出制定的配置文件,如果是群集环境,则需要分别在每个相关节点执行此配置脚本。

clip_image004

如下结果,部署成功

clip_image006

步骤四、检测部署结果

 1 ALTER proc [dbo].[spb_PerfConfigure_Check]
 2 @MachineName sysname
 3 as
 4 --执行数据同步
 5 exec [SQLPerfDataStat].dbo.spb_Perf_Sync_Setting
 6 --declare @MachineName sysname='117-27-139-236'
 7 
 8 DECLARE @RES_T TABLE(CHECK_CLASS NVARCHAR(100),CHECK_INFO NVARCHAR(MAX),ERRORMSG NVARCHAR(MAX))
 9 DECLARE @MSG VARCHAR(MAX)
10 SET @MSG=''
11 --是否存在未添加计数器
12 IF NOT EXISTS (
13 SELECT TOP 1 1  FROM [SQLPerfData].dbo.CounterDetails WITH(NOLOCK)
14 WHERE MachineName='\'+@MachineName
15 )
16 BEGIN
17  SELECT '启动情况' CHECK_CLASS,'计数器未启动' AS CHECK_INFO
18 END
19 ELSE 
20 BEGIN
21  SELECT '启动情况' CHECK_CLASS,'计数器已启动' AS CHECK_INFO
22 END
23 
24 --是否存在未添加计数器
25 IF EXISTS(
26 SELECT TOP 1 1 
27 FROM [SQLPerfDataStat].dbo.CounterTypeDetails  B 
28 LEFT JOIN (
29 SELECT DISTINCT ObjectName,CounterName 
30 FROM [SQLPerfDataStat].dbo.CounterDetails_Collect
31 WHERE MachineName=@MachineName) AA 
32 ON AA.ObjectName=B.ObjectName AND AA.CounterName=B.CounterName
33 WHERE AA.ObjectName IS NULL 
34 )
35 BEGIN
36     SELECT @MSG=@MSG +B.ObjectName+''+B.CounterName +'; '
37     FROM [SQLPerfDataStat].dbo.CounterTypeDetails  B 
38     LEFT JOIN (
39     SELECT DISTINCT ObjectName,CounterName 
40     FROM [SQLPerfDataStat].dbo.CounterDetails_Collect
41     WHERE MachineName=@MachineName) AA 
42     ON AA.ObjectName=B.ObjectName AND AA.CounterName=B.CounterName
43     WHERE AA.ObjectName IS NULL 
44   
45     SELECT '对象添加情况' CHECK_CLASS,'未完整添加计数器' CHECK_INFO,@MSG as ERRORMSG
46 END
47 ELSE
48 BEGIN
49     SELECT '对象添加情况' CHECK_CLASS,'完整添加计数器' CHECK_INFO
50 END
51 
52 --察看近五分钟收集情况
53 DECLARE @NOWDATE DATETIME
54 SET @NOWDATE=CONVERT(VARCHAR(16),GETDATE(),120)--当前时间
55 WAITFOR DELAY '00:05:00'--5分钟之后
56 
57 DECLARE @I_COUNT INT
58 DECLARE @C_COUNT INT
59 SELECT @C_COUNT=COUNT(CounterID)
60 FROM [SQLPerfDataStat].dbo.CounterDetails_Collect A
61 WHERE A.MachineName=@MachineName
62 DECLARE @I INT 
63 SET @I=0
64 WHILE @I<5
65 BEGIN
66   SELECT @I_COUNT=COUNT(CounterID)
67   FROM  [SQLPerfDataStat].[dbo].[CounterData_OneMinute] B 
68   WHERE  B.CounterDateTime=DATEADD(MI,-@I,@NOWDATE)
69   AND B.CounterID IN(SELECT CounterID FROM [SQLPerfDataStat].dbo.CounterDetails_Collect A  WHERE A.MachineName=@MachineName)
70 
71   IF @C_COUNT=@I_COUNT
72   BEGIN
73     INSERT INTO @RES_T
74     SELECT ''+cast(@I+1 as varchar(20))+'分钟计数器收集情况' CHECK_CLASS,'收集正常' CHECK_INFO,'当前要求:'+CONVERT(VARCHAR(28),@C_COUNT)+'收集个数:'+CONVERT(VARCHAR(28),@I_COUNT)
75   END
76   ELSE
77   BEGIN
78     INSERT INTO @RES_T
79     SELECT ''+cast(@I+1 as varchar(20))+'分钟计数器收集情况' CHECK_CLASS,'收集不正常' CHECK_INFO,'当前要求:'+CONVERT(VARCHAR(28),@C_COUNT)+'收集个数:'+CONVERT(VARCHAR(28),@I_COUNT)
80   END
81   
82   SET @I=@I+1
83 END
84 SELECT * FROM @RES_T
spb_PerfConfigure_Check

可能需要执行五分钟。后面几分钟收集即可认为是正常。

clip_image007

原文地址:https://www.cnblogs.com/chhuang/p/4170253.html