一、计数器部署项目介绍

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的计数器

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

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

得出以下结果:

  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

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

  1. USE CONFIGDB
  2. GO
  3. EXEC [DBO].[spb_PerfConfigure]

得出以下结果:

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

spb_PerfConfigure

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

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

如下结果,部署成功

步骤四、检测部署结果

  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

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

SQL Server性能计数器部署(批量)的更多相关文章

  1. SQL Server性能计数器收集汇总方案(Reporting Service)

    通过收集计数器信息,并将计数器信息汇总为不同粒度存储,以Reporting Service报表服务器显示.以下是计数器收集汇总的基本架构. 笔者需要收集的SQL Server计数器包括:SQL Ser ...

  2. sql server 使用SqlBulkCopy批量插入数据库

    sql server sqlbulkcopy 批量数据插入数据库使用的是System.Data.SqlClient中的 SqlBulkCopy批量数据插入数据库 sql server 使用SqlBul ...

  3. SQL Server Bulk Insert批量数据导入

    SQL Server的Bulk Insert语句可以将本地或远程的数据文件批量导入到数据库中,速度非常的快.远程文件必须共享才行,文件路径须使用通用约定(UNC)名称,即"\\服务器名或IP ...

  4. sql Server如何执行批量插入和批量删除

    平时我们sql server执行查询语句都是通过 insert into 表名(字段名,字段名) values(插入值,插入值) --单条插入语句--- insert into Reader(read ...

  5. SQL Server快速部署作业到多台服务器

    问题: 需要在很多的SQL Server服务器上创建相同的作业.我们可以一台一台的运行相同的脚本创建作业,但是有没有什么简便的做法呢? 解决方法: 可能很多人都没有注意到可以用多服务器环境管理SQL ...

  6. sql server用户密码批量MD5加密

    nodejs自带加密模块md5加密: var crypto = require('crypto'); function cryptoMD5(content){ var md5 = crypto.cre ...

  7. .netcore中使用EFCore连接SQL Server并部署至Ubuntu

    前面一篇记录了如何在windows下开发asp.net core程序,并部署至ubuntu系统中.但仅仅是建立了一个demo项目,项目本身并没有实现多少功能.多数时候,我们的项目是要和数据库打交道.E ...

  8. 怎样获取Windows平台下SQL server性能计数器值

    转载自工作伙伴Garrett, Helen "SQL Server Performance Counter captures" Capturing Windows Performa ...

  9. 找回丢失的SQL Server性能计数器

    There was one time when I was delivering a Service using a tool that gathers performance data throug ...

随机推荐

  1. WPF 自定义CheckBox样式

    自定义CheckBox样式,mark一下,方便以后参考复用 设计介绍: 1.一般CheckBox模板太难看了,肯定要重写其中的模板 2.模板状态为未选中状态和选中状态,设置为默认未选中就好了. 默认状 ...

  2. Centos7 关闭防火墙

    CentOS 7.0默认使用的是firewall作为防火墙,使用iptables必须重新设置一下 1.直接关闭防火墙 systemctl stop firewalld.service #停止firew ...

  3. linux shell字符串内置的常用操作(获取长度、查找、替换)

    在编写shell程序时,经常会涉及到字符串相关操作.有许多命令语句,如awk,sed都能够做字符串各种操作. 事实上shell内置一系列操作符号,能够达到相似效果,使用内部操作符会省略启动外部程序等时 ...

  4. [No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

    行结束符和空白选项 在项目的生命周期中,有时可能会将行结束符由 CRLF 改为 LF,或者修改一段代码的缩进.不幸的是这样将会使大量的代码行被标记为已修改,尽管代码本身并没有被修改.这里列出的选项将会 ...

  5. 安全测试 - 端口嗅探工具Nmap

    Nmap 在官网下载nmap端口检测工具https://nmap.org/,nmap是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端. 使用: 通过cmd命令:nmap www.5i5j.c ...

  6. 理解SVG的viewport,viewBox,preserveAspectRatio

    万丈高楼平地起,基础很重要. viewport 表示SVG可见区域的大小,或者可以想象成舞台大小,画布大小. <svg width="500" height="30 ...

  7. [LeetCode] Combine Two Tables 联合两表

    Table: Person +-------------+---------+ | Column Name | Type | +-------------+---------+ | PersonId ...

  8. Jenkins入门系列之——02第二章 Jenkins安装与配置

    2014-12-08:已不再担任SCM和CI的职位,Jenkins的文章如无必要不会再维护. 写的我想吐血,累死了. 网页看着不爽的,自己去下载PDF.有问题请留言! Jenkins入门系列之——03 ...

  9. C 语言学习 第六次作业总结

    本次作业,同学们开始学习函数.通过之前和同学们的沟通,似乎同学们在这里遇到的问题比较多.下面,我先帮同学们整理下函数的相关知识点. 什么是函数 首先,需要明确的是,什么是函数.所谓函数,也就是一段有名 ...

  10. 【WPF】 返回随机颜色,Random r= new Random() 不能放在函数里!