SQL Server性能计数器部署(批量)
一、计数器部署项目介绍
SQL Server每个服务器,日常需要监控的计数器指标高达上百,若一个个手动添加非常麻烦。此项目通过命令行工具针对指定计数器集成部署,提高部署效率。此包括开发数据库互联(ODBC)配置,通过ODBC访问监控服务器的数据库,将计数器信息传送到数据库中。同时还会详细讲解选取了哪些计数器,这些数据库的作用;以及如何利用相关的命令来实现批量部署。
二、计数器部署
计数器部署基本包括以下几个步骤:
- 筛选指定计数器名称输出到指定txt文件中:TypePerf.exe使用命令查找计数器
- 部署ODBC配置:开放数据库互联ODBC配置;通过 ODBC直接访问远程监控服务器数据库SQLPerfData, 由于是远程访问,若服务器宕机,监控服务器故障等等都将导致连接断开;连接断开将导致本地计数器停止。因此需要实时启动计数器,以保证计数器及时收集。本文通过系统任务调用vb脚本启动计数器。停止并删除原有计数器
- 新建最新的计数器(新建过程调用已有的txt文件):PerfMon.exe通过命令管理计数器;若是域环境新建计数器的时候要执行启动账户为域账户;需要确保当前服务器账户在目标服务器中存在,且密码相同。
- 启动性能计数器
- 创建系统任务(五分钟执行一次,每次调用vb脚本,自动启动计数器)
例:部署服务器名称为117-27-139-236的计数器
步骤一、计数器初始化(若只是添加计数器,则不需要执行此步骤)
- EXEC [dbo].[spb_PerfConfigure_New] '117-27-139-236'
得出以下结果:
- ALTER proc [dbo].[spb_PerfConfigure_New]
- @machinename sysname
- as
- SET NOCOUNT ON
- DECLARE @MSG VARCHAR(MAX)
- SET @MSG=''
- IF NOT EXISTS(SELECT TOP 1 1 FROM SQLPerfData.dbo.CounterDetails WITH(NOLOCK) WHERE MachineName='\\'+@machinename)
- BEGIN
- SELECT @MSG=@MSG+'结果01:'+@machinename+'服务器未收集任何计数器'+char(10)
- GOTO RES
- END
- BEGIN TRY
- BEGIN TRAN
- --删除SQLPerfData.dbo.CounterDetails
- DELETE FROM SQLPerfData.dbo.CounterDetails
- WHERE MachineName='\\'+@machinename
- INSERT INTO SQLPerfDataStat.dbo.CounterDetails_Collect_bak
- SELECT * FROM SQLPerfDataStat.dbo.CounterDetails_Collect
- WHERE MachineName=@machinename
- DELETE FROM SQLPerfDataStat.dbo.CounterDetails_Collect
- WHERE MachineName=@machinename
- DELETE FROM SQLPerfDataStat.[dbo].[CounterDetails_Dts]
- WHERE MachineName=@machinename
- COMMIT
- SELECT @MSG=@MSG+'结果01:'+@machinename+'原计数器已经删除完成'+char(10)
- END TRY
- BEGIN CATCH
- SELECT @MSG='数据删除失败'+ERROR_MESSAGE()
- IF @@TRANCOUNT>0
- ROLLBACK;
- THROW 50000,@MSG,1
- END CATCH
- RES:
- SELECT @MSG=@MSG+'结果02:'+'在服务器['+@machinename+']上执行以下脚本,后按步骤操作'+CHAR(10)
- +'USE CONFIGDB
- GO
- EXEC [DBO].[spb_PerfConfigure]' ;
- THROW 50000,@MSG,1
spb_PerfConfigure_New
步骤二、生成部署脚本(从步骤一结果拷贝脚本到指定服务器执行。)
- USE CONFIGDB
- GO
- EXEC [DBO].[spb_PerfConfigure]
得出以下结果:
- /****************************** 功能描述:<性能计数器部署>
- * 创建者:<HuangCH〉
- * 创建日期:<2014-09-22>
- * 备注说明:<手动执行>
- ##########
- Change Log
- ##########
- Date Changer Description
- --------------------------------------------------
- <2014-09-24> <HuangCH> <新建>
- --------------------------------------------------
- ***************************/
- ALTER Proc [dbo].[spb_PerfConfigure]
- as
- SET NOCOUNT ON
- DECLARE @CMD VARCHAR(8000)
- DECLARE @Path VARCHAR(8000)
- DECLARE @RetCode INT
- DECLARE @ServerName VARCHAR(128)
- SELECT @ServerName = CASE
- WHEN Charindex('\',@@SERVERNAME) > 0 THEN LEFT(@@SERVERNAME,Charindex('\',@@SERVERNAME) - 1)
- ELSE @@SERVERNAME
- END
- --确认路径是否存在
- SELECT @Path = 'C:\Perf_'+@ServerName+'_请勿删除'
- SELECT @CMD='DIR '+@Path
- EXEC @RetCode=MASTER.DBO.XP_CMDSHELL @CMD
- IF @RetCode=1
- BEGIN
- SELECT @CMD='MD '+@Path
- EXEC @RetCode=MASTER.DBO.XP_CMDSHELL @CMD
- END
- IF OBJECT_ID('TEMPDB.DBO.TABLEOUT') IS NOT NULL
- BEGIN
- DROP TABLE TEMPDB.DBO.TABLEOUT
- END
- CREATE TABLE TEMPDB.DBO.TABLEOUT (vars VARCHAR(max))
- ----删除自动启动bat
- --SELECT @CMD = 'DEL C:\Perf_'+@ServerName+'_请勿删除\PerfAutoStart.bat'
- --EXEC @RetCode=MASTER.DBO.XP_CMDSHELL @CMD;
- ----添加自动启动脚本bat
- --TRUNCATE TABLE TEMPDB.DBO.TABLEOUT
- --INSERT INTO TEMPDB.DBO.TABLEOUT(VARS)
- --SELECT '@echo off'
- --UNION all
- --SELECT 'Logman Start Perf_'+@ServerName
- --SELECT @Path = 'C:\Perf_'+@ServerName+'_请勿删除\PerfAutoStart.bat'
- --SELECT @CMD='BCP TEMPDB.DBO.TABLEOUT OUT ' + @Path + ' -T -c -CRAW -S' + @@SERVERNAME
- --EXEC @RetCode=MASTER.DBO.XP_CMDSHELL @CMD;
- --删除自动启动vb
- SELECT @CMD = 'DEL C:\Perf_'+@ServerName+'_请勿删除\PerfAutoStart.vbs'
- EXEC @RetCode=MASTER.DBO.XP_CMDSHELL @CMD;
- --添加自动启动脚本vb
- TRUNCATE TABLE TEMPDB.DBO.TABLEOUT
- INSERT INTO TEMPDB.DBO.TABLEOUT(VARS)
- SELECT 'set ws=wscript.createobject("wscript.shell")'
- --UNION all
- --SELECT 'ws.run "PerfAutoStart.bat /start",0'
- UNION all
- SELECT 'ws.run "Logman Start Perf_'+@ServerName+'",0'
- SELECT @Path = 'C:\Perf_'+@ServerName+'_请勿删除\PerfAutoStart.vbs'
- SELECT @CMD='BCP TEMPDB.DBO.TABLEOUT OUT ' + @Path + ' -T -c -CRAW -S' + @@SERVERNAME
- EXEC @RetCode=MASTER.DBO.XP_CMDSHELL @CMD;
- --所有计数器临时存放
- IF OBJECT_ID('TEMPDB.DBO.TempPerf') IS NOT NULL
- BEGIN
- DROP TABLE TEMPDB.DBO.TempPerf
- END
- CREATE TABLE TEMPDB.DBO.TempPerf (VarStr VARCHAR(max))
- --计数器筛选存放
- IF OBJECT_ID('TEMPDB.DBO.Perf') IS NOT NULL
- BEGIN
- DROP TABLE TEMPDB.DBO.Perf
- END
- CREATE TABLE TEMPDB.DBO.Perf (VarStr VARCHAR(max))
- IF OBJECT_ID('CONFIGDB.DBO.PerfConfigSetting') IS NOT NULL
- BEGIN
- TRUNCATE TABLE CONFIGDB.DBO.PerfConfigSetting
- END
- ELSE
- BEGIN
- CREATE TABLE CONFIGDB.DBO.PerfConfigSetting (VarStr VARCHAR(max))
- END
- INSERT INTO TEMPDB.DBO.TempPerf
- EXEC( 'Master..XP_CMDSHELL ''TypePerf -qx''')
- --Step1:通用性能计数器
- INSERT INTO TempDB.dbo.Perf(VarStr)
- SELECT VarStr
- FROM TempDB.dbo.TempPerf(NOLOCK)
- WHERE
- --Cpu
- (VarStr LIKE '\Processor(_Total)%'
- AND (VarStr LIKE '% Processor Time'
- OR VarStr LIKE '% Privileged Time'
- )
- AND VarStr LIKE '%(_Total)%'
- )
- OR VarStr ='\System\Processor Queue Length'
- --Memory
- OR (VarStr LIKE '\Memory%'
- AND (VarStr LIKE '%Committed Bytes'
- OR VarStr LIKE '%Commit Limit'
- OR VarStr LIKE '%Available Mbytes'
- OR VarStr LIKE '%Cache Bytes'
- OR VarStr LIKE '%Page Faults/sec'
- OR VarStr LIKE '%Pages/sec'
- OR VarStr LIKE '%Free System Page Table Entries'
- )
- )
- --PhysicalDisk
- OR(VarStr LIKE '\PhysicalDisk%'
- AND (
- (
- VarStr LIKE '%Avg. Disk sec/Read'
- AND VarStr NOT LIKE '%(_Total)%'
- )
- OR (
- VarStr LIKE '%Avg. Disk sec/Write'
- AND VarStr NOT LIKE '%(_Total)%'
- )
- OR (
- VarStr LIKE '%Avg. Disk sec/Transfer'
- AND VarStr NOT LIKE '%(_Total)%'
- )
- OR (
- VarStr LIKE '%Avg. Disk Queue Length'
- AND VarStr NOT LIKE '%(_Total)%'
- )
- )
- )
- --LogicDisk
- OR(VarStr LIKE '\logicalDisk%'
- AND (VarStr LIKE '%% Free Space'
- OR VarStr LIKE '%Free Megabytes'
- OR VarStr LIKE '%Disk Read Bytes/sec'
- OR VarStr LIKE '%Disk Write Bytes/sec'
- OR VarStr LIKE '%Disk Transfers/sec'
- OR VarStr LIKE '%Free Megabytes'
- )
- AND VarStr NOT LIKE '%(_Total)%'
- )
- --SQLServer
- OR(VarStr LIKE '%:Buffer Manager%'
- AND (VarStr LIKE '%\Buffer cache hit ratio'
- OR VarStr LIKE '%\Page life expectancy'
- OR VarStr LIKE '%\Checkpoint pages/sec'
- OR VarStr LIKE '%\Lazy writes/sec'
- OR VarStr LIKE '%\Free pages'
- OR VarStr LIKE '%\Database pages'
- OR VarStr LIKE '%\Page reads/sec'
- OR VarStr LIKE '%\Page writes/sec'
- OR VarStr LIKE '%\Stolen pages'
- )
- )
- OR (VarStr LIKE '%:Memory Manager%'
- AND (
- VarStr LIKE '%\Total Server Memory (KB)'
- OR VarStr LIKE '%\Target Server Memory (KB)'
- OR VarStr LIKE '%\Memory Grants Pending'--指定等待工作空间内存授权的进程总数。
- --OR VarStr LIKE '%\Optimizer Memory (KB)'--指定服务器正用于查询优化的动态内存总数。
- --OR VarStr LIKE '%\SQL Cache Memory (KB)'--指定服务器正用于动态 SQL 缓存的动态内存总数。
- --OR VarStr LIKE '%\Lock Memory (KB)'--指定服务器用于锁的动态内存总量。
- --OR VarStr LIKE '%\Connection Memory (KB)'--指定服务器正用来维护连接的动态内存的总量。
- --OR VarStr LIKE '%\Granted Workspace Memory (KB)')--指定当前授予执行哈希、排序、大容量复制和索引创建操作等进程的内存总量。
- )
- OR (VarStr LIKE '%:General Statistics%'
- AND (VarStr LIKE '%\Processes blocked'
- OR VarStr LIKE '%\User Connections'
- OR VarStr LIKE '%\Logins/sec'
- OR VarStr LIKE '%\Logouts/sec'
- OR VarStr LIKE '%\Temp Tables For Destruction'
- )
- )
- OR (VarStr LIKE '%:Wait Statistics%'
- AND (
- (
- VarStr LIKE '%(平均等待时间(ms))\Page IO latch waits'
- OR VarStr LIKE '%(平均等待时间(ms))\Page latch waits'
- OR VarStr LIKE '%(平均等待时间(ms))\Lock waits'
- OR VarStr LIKE '%(平均等待时间(ms))\Log write waits'
- )
- OR (
- VarStr LIKE '%(Average wait time (ms))\Page IO latch waits'
- OR VarStr LIKE '%(Average wait time (ms))\Page latch waits'
- OR VarStr LIKE '%(Average wait time (ms))\Lock waits'
- OR VarStr LIKE '%(Average wait time (ms))\Log write waits'
- )
- )
- )
- OR (VarStr LIKE '%:Access Methods%'
- AND (VarStr LIKE '%\Page Splits/sec'
- OR VarStr LIKE '%\Workfiles Created/sec'
- OR VarStr LIKE '%\Worktables Created/sec'
- )
- )
- OR (VarStr LIKE '%:SQL Statistics%'
- AND (VarStr LIKE '%\Batch Requests/sec'
- OR VarStr LIKE '%\SQL Compilations/sec'
- OR VarStr LIKE '%\SQL Re-Compilations/sec'
- )
- )
- OR (VarStr LIKE '%:Locks%'
- AND(
- ( VarStr LIKE '%(_Total)%'
- AND(
- VarStr LIKE '%\Lock Timeouts/sec'
- OR VarStr LIKE '%\Lock Requests/sec'
- OR VarStr LIKE '%\Lock Wait Time (ms)'
- OR VarStr LIKE '%\Lock Waits/sec'
- )
- )
- --OR ( (
- -- VarStr LIKE '%(Key)%'
- -- OR VarStr LIKE '%(Metadata)%'
- -- OR VarStr LIKE '%(Object)%'
- -- OR VarStr LIKE '%(Page)%'
- -- OR VarStr LIKE '%(RID)%'
- -- )
- -- AND(VarStr LIKE '%\Lock Wait Time (ms)'
- -- OR VarStr LIKE '%\Lock Waits/sec'
- -- )
- )
- )
- OR (VarStr LIKE '%Number of Deadlocks/sec%' AND VarStr LIKE '%(_Total)%')
- )
- or( VarStr LIKE '%:Databases%'
- And (
- -- VarStr LIKE '%\Data File(s) Size (KB)'
- --or VarStr LIKE '%\Log File(s) Size (KB)'
- VarStr LIKE '%\Transactions/sec'
- --or VarStr LIKE '%\Bulk Copy Rows/sec'
- or VarStr LIKE '%\Log Flushes/sec'
- --or VarStr LIKE '%\Log Flush Wait Time'
- or VarStr LIKE '%\Log Flush Waits/sec'
- --or VarStr LIKE '%\Log Flush Write Time (ms)'
- )
- And VarStr not like '%:Databases(tempdb)\%'
- And VarStr not like '%:Databases(model)\%'
- And VarStr not like '%:Databases(master)\%'
- And VarStr not like '%:Databases(msdb)\%'
- And VarStr not like '%:Databases(configdb)\%'
- And VarStr not like '%:Databases(mssqlsystemresource)\%'
- AND VarStr not LIKE '%(_Total)%'
- )
- or varstr like '%:Transactions\Transactions'
- ORDER BY VarStr
- --Step2:网络监控
- DECLARE @Wmic TABLE(ID INT IDENTITY(1,1),ReMark VARCHAR(MAX))
- INSERT INTO @Wmic EXEC Master..Xp_cmdshell 'wmic nicconfig get DNSHostName,Description,IPAddress,MACAddress,Index,InterfaceIndex /value'
- ;WITH Y1 AS(
- SELECT Id
- ,REPLACE(LTRIM(RTRIM(LEFT(ReMark,CHARINDEX('"}',ReMark)-1))),'IPAddress={"','') AS IPAddress
- FROM @Wmic
- WHERE ReMark LIKE 'IPAddress={"%'
- )
- ,Y2 AS(
- SELECT A.ID
- ,A.IPAddress
- ,REPLACE(REPLACE(REPLACE(REPLACE(LTRIM(RTRIM(REPLACE(B.ReMark,'Description=',''))),'/','_'),'#','_'),CHAR(10),''),CHAR(13),'')AS Desc1
- ,LTRIM(RTRIM(REPLACE(C.ReMark,'MACAddress=','')))AS MACAddress
- FROM Y1 A
- CROSS APPLY(SELECT TOP 1 Id,ReMark
- FROM @Wmic
- WHERE Id <A.ID
- AND (ReMark LIKE 'Description=%')
- ORDER BY Id DESC
- )B
- CROSS APPLY(SELECT TOP 1 Id,ReMark
- FROM @Wmic
- WHERE Id >A.ID
- AND (ReMark LIKE 'MACAddress=%')
- )C
- )
- ,Y3 AS(
- SELECT DISTINCT A.*
- ,B.ID AS ID_B
- ,REPLACE(REPLACE(REPLACE(REPLACE(LTRIM(RTRIM(REPLACE(C.ReMark,'Description=',''))),'/','_'),'#','_'),CHAR(10),''),CHAR(13),'')AS Desc2
- FROM Y2 A
- INNER JOIN @Wmic B ON B.ReMark LIKE '%'+A.MACAddress AND A.ID<>B.ID
- CROSS APPLY(SELECT TOP 1 Id,ReMark
- FROM @Wmic
- WHERE Id <B.ID
- AND (ReMark LIKE 'Description=%')
- ORDER BY Id DESC
- )C
- )
- ,Y4 AS(
- SELECT A.*
- ,CAST(REPLACE(REPLACE(LTRIM(RTRIM(REPLACE(B.ReMark,'Index=',''))),CHAR(10),''),CHAR(13),'')AS INT)AS IndexId
- ,CAST(REPLACE(REPLACE(LTRIM(RTRIM(REPLACE(C.ReMark,'InterfaceIndex=',''))),CHAR(10),''),CHAR(13),'')AS INT)AS InterfaceIndex
- FROM Y3 A
- CROSS APPLY(SELECT TOP 1 ReMark
- FROM @Wmic
- WHERE Id >A.ID_B
- AND (ReMark LIKE 'Index=%')
- )B
- CROSS APPLY(SELECT TOP 1 ReMark
- FROM @Wmic
- WHERE Id >A.ID_B
- AND (ReMark LIKE 'InterfaceIndex=%')
- )C
- WHERE A.Desc1<>A.Desc2
- )
- ,Y5 AS(
- SELECT ROW_NUMBER()OVER(ORDER BY IndexId,InterfaceIndex)AS Rnt,*
- FROM Y4
- )
- ,Y6 AS(
- SELECT Rnt,IPAddress,Desc1,MACAddress
- ,CASE WHEN Rnt=1 THEN Desc2 ELSE Desc2+' _'+RTRIM(CAST(Rnt AS CHAR))END AS Desc2
- FROM Y5
- UNION
- SELECT 1,IPAddress,Desc1,MACAddress,Desc2
- FROM Y3
- WHERE Desc1=Desc2
- )
- ,Y7 AS(
- SELECT VarStr
- FROM TempDB.dbo.TempPerf(NOLOCK)
- WHERE VarStr LIKE '\network interface%'
- AND (VarStr LIKE '%Current Bandwidth'
- OR VarStr LIKE '%Bytes Received/sec'
- OR VarStr LIKE '%Bytes Sent/sec'
- OR VarStr LIKE '%Bytes Total/sec'
- OR VarStr LIKE '%Output Queue Length'
- OR VarStr LIKE '%Packets Outbound Discarded'
- OR VarStr LIKE '%Packets Outbound Errors'
- OR VarStr LIKE '%Packets Received Discarded'
- OR VarStr LIKE '%Packets Received Errors'
- )
- )
- ,Y8 AS(
- SELECT A.*,B.*
- FROM Y7 A
- INNER JOIN Y6 B ON 1=1
- AND REPLACE(REPLACE(A.VarStr,'[','('),']',')') LIKE '%('+B.Desc2+'%'
- )
- INSERT INTO TempDB.dbo.Perf(VarStr)
- SELECT DISTINCT VarStr
- FROM Y8
- --添加
- --INSERT INTO CONFIGDB.DBO.PerfConfigSetting
- --SELECT *FROM TempDB.dbo.Perf
- --删除计数器配置文件
- SELECT @CMD = 'DEL C:\Perf_'+@ServerName+'_请勿删除\首次部署_PerfConfigure_' + @ServerName + '_*.txt'
- EXEC @RetCode=MASTER.DBO.XP_CMDSHELL @CMD
- --导出计数器配置文件
- SELECT @Path = 'C:\Perf_'+@ServerName+'_请勿删除\首次部署_PerfConfigure_' + @ServerName + '_' + REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(19),Getdate(),21),'-',''),':',''),' ','') + '.txt'
- SELECT @CMD='BCP TEMPDB.DBO.Perf OUT ' + @Path + ' -T -c -CRAW -S' + @@SERVERNAME
- EXEC @RetCode=MASTER.DBO.XP_CMDSHELL @CMD
- --添加部署脚本
- TRUNCATE TABLE TEMPDB.DBO.TABLEOUT
- INSERT INTO TEMPDB.DBO.TABLEOUT(VARS)
- SELECT '@echo off'
- UNION all
- --SELECT 'echo 正在删除同名称Cliconfg...'
- --UNION all
- --SELECT 'reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\ConnectTo" /v SQLPerforMance /f'
- --UNION all
- --SELECT 'echo -'
- --UNION all
- --SELECT 'echo 正在添加Cliconfg部署...'
- --UNION all
- --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'
- --UNION all
- --SELECT 'echo -'
- --UNION all
- SELECT 'echo 正在部署ODBC...'
- UNION all
- SELECT 'odbcconf CONFIGSYSDSN "Sql Server" "DSN=Perf_'+@ServerName+'|SERVER=10.195.0.136,55944|Database=SQLPerfData|Trusted_Connection=yes"'
- UNION all
- SELECT 'echo -'
- UNION all
- SELECT 'echo 正在停止已经存在的计数器...'
- UNION all
- SELECT 'Logman Stop Perf_'+@ServerName
- UNION all
- SELECT 'echo -'
- UNION all
- SELECT 'echo 正在删除已经存在的计数器...'
- UNION all
- SELECT 'Logman Delete Perf_'+@ServerName
- UNION all
- SELECT 'echo -'
- UNION all
- SELECT 'echo 正在部署新计数器...'
- UNION all
- 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
- UNION all
- SELECT 'echo -'
- UNION all
- SELECT 'echo 正在初始化并启动计数器...'
- UNION all
- SELECT 'Logman Start Perf_'+@ServerName
- UNION all
- SELECT 'echo -'
- UNION all
- SELECT 'echo 完成计数器部署'
- UNION all
- SELECT 'echo -'
- UNION all
- SELECT 'echo 正在删除系统任务计划...'
- UNION all
- SELECT 'schtasks /delete /tn "[请勿删除]Perf_'+@ServerName+'_计数器自动启动" /f'
- UNION all
- SELECT 'echo -'
- UNION all
- SELECT 'echo 正在创建系统任务计划...'
- UNION all
- SELECT 'schtasks /create /sc MINUTE /mo 5 /st 00:05:00 /tn "[请勿删除]Perf_'+@ServerName+'_计数器自动启动" /tr C:\Perf_'+@ServerName+'_请勿删除\PerfAutoStart.vbs /ru "System"'
- --UNION all
- --SELECT 'echo 添加开机启动...'
- --UNION all
- --SELECT 'reg add HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run /v Perf_'+@ServerName+'_计数器自动启动vbs /d '+@Path
- UNION all
- SELECT 'echo -'
- UNION all
- SELECT 'echo. & pause'
- --删除部署文件
- SELECT @CMD = 'DEL C:\Perf_'+@ServerName+'_请勿删除\首次部署_执行脚本_' + @ServerName + '_*.bat'
- EXEC @RetCode=MASTER.DBO.XP_CMDSHELL @CMD;
- --添加部署文件
- SELECT @Path = 'C:\Perf_'+@ServerName+'_请勿删除\首次部署_执行脚本_' + @ServerName + '_' + REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(19),Getdate(),21),'-',''),':',''),' ','') + '.bat'
- SELECT @CMD='BCP TEMPDB.DBO.TABLEOUT OUT ' + @Path + ' -T -c -CRAW -S' + @@SERVERNAME
- EXEC @RetCode=MASTER.DBO.XP_CMDSHELL @CMD;
- DECLARE @INFO VARCHAR(MAX)
- --群集环境
- IF Serverproperty('ISClustered') = 1
- BEGIN
- DECLARE @CurNode VARCHAR(128)
- DECLARE @ALLNode VARCHAR(128)
- SELECT TOP 1 @CurNode=NodeName FROM sys.dm_os_cluster_nodes WITH(NOLOCK)
- WHERE is_current_owner=1
- SET @INFO='恭喜!!!成功在群集主节点服务器['+@CurNode+']生成部署文件。'+CHAR(10)+'请按以下步骤执行部署:'
- SELECT @INFO=@INFO
- +CHAR(10)+'部署节点['+NodeName+']:从主节点提取以上生成的部署文件'
- +CHAR(10)+'步骤一(部署):在['+NodeName+']节点执行Bat文件 :'+@path
- +CHAR(10)+'步骤二(检测_5分钟):在[117-27-139-236]监控服务器上执行 : EXEC [SQLPerfData].[dbo].[spb_PerfConfigure_Check] '''+NodeName+''''
- +CHAR(10)
- FROM sys.dm_os_cluster_nodes WITH(NOLOCK)
- END
- ELSE
- BEGIN
- SET @INFO='恭喜!!!成功在服务器本地生成部署文件!'+CHAR(10)+'请按以下步骤执行部署:'
- +CHAR(10)+'步骤一(部署):在['+@ServerName+']服务器执行Bat文件 :'+@path
- +CHAR(10)+'步骤二(检测_5分钟):在[117-27-139-236]监控服务器上执行 : EXEC [SQLPerfData].[dbo].[spb_PerfConfigure_Check] '''+@ServerName+''''
- END;
- THROW 50000,@INFO,1
spb_PerfConfigure
步骤三、部署性能计数器(按步骤二结果的步骤执行。执行首次部署的Bat文件。)
部署需要在当前节点上执行封装脚本,执行完成后,会输出制定的配置文件,如果是群集环境,则需要分别在每个相关节点执行此配置脚本。
如下结果,部署成功
步骤四、检测部署结果
- ALTER proc [dbo].[spb_PerfConfigure_Check]
- @MachineName sysname
- as
- --执行数据同步
- exec [SQLPerfDataStat].dbo.spb_Perf_Sync_Setting
- --declare @MachineName sysname='117-27-139-236'
- DECLARE @RES_T TABLE(CHECK_CLASS NVARCHAR(100),CHECK_INFO NVARCHAR(MAX),ERRORMSG NVARCHAR(MAX))
- DECLARE @MSG VARCHAR(MAX)
- SET @MSG=''
- --是否存在未添加计数器
- IF NOT EXISTS (
- SELECT TOP 1 1 FROM [SQLPerfData].dbo.CounterDetails WITH(NOLOCK)
- WHERE MachineName='\\'+@MachineName
- )
- BEGIN
- SELECT '启动情况' CHECK_CLASS,'计数器未启动' AS CHECK_INFO
- END
- ELSE
- BEGIN
- SELECT '启动情况' CHECK_CLASS,'计数器已启动' AS CHECK_INFO
- END
- --是否存在未添加计数器
- IF EXISTS(
- SELECT TOP 1 1
- FROM [SQLPerfDataStat].dbo.CounterTypeDetails B
- LEFT JOIN (
- SELECT DISTINCT ObjectName,CounterName
- FROM [SQLPerfDataStat].dbo.CounterDetails_Collect
- WHERE MachineName=@MachineName) AA
- ON AA.ObjectName=B.ObjectName AND AA.CounterName=B.CounterName
- WHERE AA.ObjectName IS NULL
- )
- BEGIN
- SELECT @MSG=@MSG +B.ObjectName+'\'+B.CounterName +'; '
- FROM [SQLPerfDataStat].dbo.CounterTypeDetails B
- LEFT JOIN (
- SELECT DISTINCT ObjectName,CounterName
- FROM [SQLPerfDataStat].dbo.CounterDetails_Collect
- WHERE MachineName=@MachineName) AA
- ON AA.ObjectName=B.ObjectName AND AA.CounterName=B.CounterName
- WHERE AA.ObjectName IS NULL
- SELECT '对象添加情况' CHECK_CLASS,'未完整添加计数器' CHECK_INFO,@MSG as ERRORMSG
- END
- ELSE
- BEGIN
- SELECT '对象添加情况' CHECK_CLASS,'完整添加计数器' CHECK_INFO
- END
- --察看近五分钟收集情况
- DECLARE @NOWDATE DATETIME
- SET @NOWDATE=CONVERT(VARCHAR(16),GETDATE(),120)--当前时间
- WAITFOR DELAY '00:05:00'--5分钟之后
- DECLARE @I_COUNT INT
- DECLARE @C_COUNT INT
- SELECT @C_COUNT=COUNT(CounterID)
- FROM [SQLPerfDataStat].dbo.CounterDetails_Collect A
- WHERE A.MachineName=@MachineName
- DECLARE @I INT
- SET @I=0
- WHILE @I<5
- BEGIN
- SELECT @I_COUNT=COUNT(CounterID)
- FROM [SQLPerfDataStat].[dbo].[CounterData_OneMinute] B
- WHERE B.CounterDateTime=DATEADD(MI,-@I,@NOWDATE)
- AND B.CounterID IN(SELECT CounterID FROM [SQLPerfDataStat].dbo.CounterDetails_Collect A WHERE A.MachineName=@MachineName)
- IF @C_COUNT=@I_COUNT
- BEGIN
- INSERT INTO @RES_T
- SELECT '第'+cast(@I+1 as varchar(20))+'分钟计数器收集情况' CHECK_CLASS,'收集正常' CHECK_INFO,'当前要求:'+CONVERT(VARCHAR(28),@C_COUNT)+'收集个数:'+CONVERT(VARCHAR(28),@I_COUNT)
- END
- ELSE
- BEGIN
- INSERT INTO @RES_T
- SELECT '第'+cast(@I+1 as varchar(20))+'分钟计数器收集情况' CHECK_CLASS,'收集不正常' CHECK_INFO,'当前要求:'+CONVERT(VARCHAR(28),@C_COUNT)+'收集个数:'+CONVERT(VARCHAR(28),@I_COUNT)
- END
- SET @I=@I+1
- END
- SELECT * FROM @RES_T
spb_PerfConfigure_Check
可能需要执行五分钟。后面几分钟收集即可认为是正常。
SQL Server性能计数器部署(批量)的更多相关文章
- SQL Server性能计数器收集汇总方案(Reporting Service)
通过收集计数器信息,并将计数器信息汇总为不同粒度存储,以Reporting Service报表服务器显示.以下是计数器收集汇总的基本架构. 笔者需要收集的SQL Server计数器包括:SQL Ser ...
- sql server 使用SqlBulkCopy批量插入数据库
sql server sqlbulkcopy 批量数据插入数据库使用的是System.Data.SqlClient中的 SqlBulkCopy批量数据插入数据库 sql server 使用SqlBul ...
- SQL Server Bulk Insert批量数据导入
SQL Server的Bulk Insert语句可以将本地或远程的数据文件批量导入到数据库中,速度非常的快.远程文件必须共享才行,文件路径须使用通用约定(UNC)名称,即"\\服务器名或IP ...
- sql Server如何执行批量插入和批量删除
平时我们sql server执行查询语句都是通过 insert into 表名(字段名,字段名) values(插入值,插入值) --单条插入语句--- insert into Reader(read ...
- SQL Server快速部署作业到多台服务器
问题: 需要在很多的SQL Server服务器上创建相同的作业.我们可以一台一台的运行相同的脚本创建作业,但是有没有什么简便的做法呢? 解决方法: 可能很多人都没有注意到可以用多服务器环境管理SQL ...
- sql server用户密码批量MD5加密
nodejs自带加密模块md5加密: var crypto = require('crypto'); function cryptoMD5(content){ var md5 = crypto.cre ...
- .netcore中使用EFCore连接SQL Server并部署至Ubuntu
前面一篇记录了如何在windows下开发asp.net core程序,并部署至ubuntu系统中.但仅仅是建立了一个demo项目,项目本身并没有实现多少功能.多数时候,我们的项目是要和数据库打交道.E ...
- 怎样获取Windows平台下SQL server性能计数器值
转载自工作伙伴Garrett, Helen "SQL Server Performance Counter captures" Capturing Windows Performa ...
- 找回丢失的SQL Server性能计数器
There was one time when I was delivering a Service using a tool that gathers performance data throug ...
随机推荐
- WPF 自定义CheckBox样式
自定义CheckBox样式,mark一下,方便以后参考复用 设计介绍: 1.一般CheckBox模板太难看了,肯定要重写其中的模板 2.模板状态为未选中状态和选中状态,设置为默认未选中就好了. 默认状 ...
- Centos7 关闭防火墙
CentOS 7.0默认使用的是firewall作为防火墙,使用iptables必须重新设置一下 1.直接关闭防火墙 systemctl stop firewalld.service #停止firew ...
- linux shell字符串内置的常用操作(获取长度、查找、替换)
在编写shell程序时,经常会涉及到字符串相关操作.有许多命令语句,如awk,sed都能够做字符串各种操作. 事实上shell内置一系列操作符号,能够达到相似效果,使用内部操作符会省略启动外部程序等时 ...
- [No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图
行结束符和空白选项 在项目的生命周期中,有时可能会将行结束符由 CRLF 改为 LF,或者修改一段代码的缩进.不幸的是这样将会使大量的代码行被标记为已修改,尽管代码本身并没有被修改.这里列出的选项将会 ...
- 安全测试 - 端口嗅探工具Nmap
Nmap 在官网下载nmap端口检测工具https://nmap.org/,nmap是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端. 使用: 通过cmd命令:nmap www.5i5j.c ...
- 理解SVG的viewport,viewBox,preserveAspectRatio
万丈高楼平地起,基础很重要. viewport 表示SVG可见区域的大小,或者可以想象成舞台大小,画布大小. <svg width="500" height="30 ...
- [LeetCode] Combine Two Tables 联合两表
Table: Person +-------------+---------+ | Column Name | Type | +-------------+---------+ | PersonId ...
- Jenkins入门系列之——02第二章 Jenkins安装与配置
2014-12-08:已不再担任SCM和CI的职位,Jenkins的文章如无必要不会再维护. 写的我想吐血,累死了. 网页看着不爽的,自己去下载PDF.有问题请留言! Jenkins入门系列之——03 ...
- C 语言学习 第六次作业总结
本次作业,同学们开始学习函数.通过之前和同学们的沟通,似乎同学们在这里遇到的问题比较多.下面,我先帮同学们整理下函数的相关知识点. 什么是函数 首先,需要明确的是,什么是函数.所谓函数,也就是一段有名 ...
- 【WPF】 返回随机颜色,Random r= new Random() 不能放在函数里!