SQL Server自动化运维系列——监控性能指标脚本(Power Shell)
需求描述
一般在生产环境中,有时候需要自动的检测指标值状态,如果发生异常,需要提前预警的,比如发邮件告知,本篇就介绍如果通过Power shell实现状态值监控
监控值范围
根据经验,作为DBA一般需要监控如下系统能行指标
- cpu:
- \Processor(_Total)\% Processor Time
- \Processor(_Total)\% Privileged Time
- \SQLServer:SQL Statistics\Batch Requests/sec
- \SQLServer:SQL Statistics\SQL Compilations/sec
- \SQLServer:SQL Statistics\SQL Re-Compilations/sec
- \System\Processor Queue Length
- \System\Context Switches/sec
- Memory:
- \Memory\Available Bytes
- \Memory\Pages/sec
- \Memory\Page Faults/sec
- \Memory\Pages Input/sec
- \Memory\Pages Output/sec
- \Process(sqlservr)\Private Bytes
- \SQLServer:Buffer Manager\Buffer cache hit ratio
- \SQLServer:Buffer Manager\Page life expectancy
- \SQLServer:Buffer Manager\Lazy writes/sec
- \SQLServer:Memory Manager\Memory Grants Pending
- \SQLServer:Memory Manager\Target Server Memory (KB)
- \SQLServer:Memory Manager\Total Server Memory (KB)
- Disk:
- \PhysicalDisk(_Total)\% Disk Time
- \PhysicalDisk(_Total)\Current Disk Queue Length
- \PhysicalDisk(_Total)\Avg. Disk Queue Length
- \PhysicalDisk(_Total)\Disk Transfers/sec
- \PhysicalDisk(_Total)\Disk Bytes/sec
- \PhysicalDisk(_Total)\Avg. Disk sec/Read
- \PhysicalDisk(_Total)\Avg. Disk sec/Write
- SQL Server:
- \SQLServer:Access Methods\FreeSpace Scans/sec
- \SQLServer:Access Methods\Full Scans/sec
- \SQLServer:Access Methods\Table Lock Escalations/sec
- \SQLServer:Access Methods\Worktables Created/sec
- \SQLServer:General Statistics\Processes blocked
- \SQLServer:General Statistics\User Connections
- \SQLServer:Latches\Total Latch Wait Time (ms)
- \SQLServer:Locks(_Total)\Lock Timeouts (timeout > )/sec
- \SQLServer:Locks(_Total)\Lock Wait Time (ms)
- \SQLServer:Locks(_Total)\Number of Deadlocks/sec
- \SQLServer:SQL Statistics\Batch Requests/sec
- \SQLServer:SQL Statistics\SQL Re-Compilations/sec
上述指标含义,可以参照我上一篇文章:SQL Server需要监控哪些计数器
监控脚本
- $server = "(local)"
- $uid = "sa"
- $db="master"
- $pwd="password"
- $mailprfname = "SendEmail"
- $recipients = "787449667@qq.com"
- $subject = "数据库指标异常了!"
- $computernamexml = "f:\computername.xml"
- $alter_cpuxml = "f:\alter_cpu.xml"
- function GetServerName($xmlpath)
- {
- $xml = [xml] (Get-Content $xmlpath)
- $return = New-Object Collections.Generic.List[string]
- for($i = ;$i -lt $xml.computernames.ChildNodes.Count;$i++)
- {
- if ( $xml.computernames.ChildNodes.Count -eq )
- {
- $cp = [string]$xml.computernames.computername
- }
- else
- {
- $cp = [string]$xml.computernames.computername[$i]
- }
- $return.Add($cp.Trim())
- }
- $return
- }
- function GetAlterCounter($xmlpath)
- {
- $xml = [xml] (Get-Content $xmlpath)
- $return = New-Object Collections.Generic.List[string]
- $list = $xml.counters.Counter
- $list
- }
- function CreateAlter($message)
- {
- $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
- $CnnString ="Server = $server; Database = $db;User Id = $uid; Password = $pwd"
- $SqlConnection.ConnectionString = $CnnString
- $CC = $SqlConnection.CreateCommand();
- if (-not ($SqlConnection.State -like "Open")) { $SqlConnection.Open() }
- $cc.CommandText=" EXEC msdb..sp_send_dbmail
- @profile_name = '$mailprfname'
- ,@recipients = '$recipients'
- ,@body = '$message'
- ,@subject = '$subject'
- "
- $cc.ExecuteNonQuery()|out-null
- $SqlConnection.Close();
- }
- $names = GetServerName($computernamexml)
- $pfcounters = GetAlterCounter($alter_cpuxml)
- foreach($cp in $names)
- {
- $p = New-Object Collections.Generic.List[string]
- $report = ""
- foreach ($pfc in $pfcounters)
- {
- $b = ""
- $counter ="\\"+$cp+$pfc.get_InnerText().Trim()
- $p.Add($counter)
- }
- $count = Get-Counter $p
- for ($i = ; $i -lt $count.CounterSamples.Count; $i++)
- {
- $v = $count.CounterSamples.Get($i).CookedValue
- $pfc = $pfcounters[$i]
- #$pfc.get_InnerText()
- $b = ""
- $lg = ""
- if($pfc.operator -eq "lt")
- {
- if ($v -ge [double]$pfc.alter)
- {$b = "alter"
- $lg = "Greater Than"}
- }
- elseif ($pfc.operator -eq "gt")
- {
- if( $v -le [double]$pfc.alter)
- {$b = "alter"
- $lg = "Less Than"}
- }
- if($b -eq "alter")
- {
- $path = "\\"+$cp+$pfc.get_InnerText()
- $item = "{0}:{1};{2} Threshold:{3}" -f $path,$v.ToString(),$lg,$pfc.alter.Trim()
- $report += $item + "`n"
- }
- }
- if($report -ne "")
- {
- #生产警告 参数 计数器,阀值,当前值
- CreateAlter $report
- }
- }
其中涉及到2个配置文件:computernamexml,alter_cpuxml分别如下:
- <computernames>
- <computername>
- wuxuelei-pc
- </computername>
- </computernames>
- <Counters>
- <Counter alter = "" operator = "gt" >\Processor(_Total)\% Processor Time</Counter>
- <Counter alter = "" operator = "gt" >\Processor(_Total)\% Privileged Time</Counter>
- <Counter alter = "" operator = "gt" >\SQLServer:SQL Statistics\Batch Requests/sec</Counter>
- <Counter alter = "" operator = "gt" >\SQLServer:SQL Statistics\SQL Compilations/sec</Counter>
- <Counter alter = "" operator = "gt" >\SQLServer:SQL Statistics\SQL Re-Compilations/sec</Counter>
- <Counter alter = "" operator= "lt" >\System\Processor Queue Length</Counter>
- <Counter alter = "" operator= "lt" >\System\Context Switches/sec</Counter>
- </Counters>
其中 alter 就是阀值,如第一条,如果 阀值 > 性能计数器值,就会发出警告。
其实这种自定义配置的方式,实现了灵活多变的自动化监控标准:
1、比如可以检测磁盘空间大小
2、检测运行峰值状态
3、定时的根据历史运行值,更改生产系统中的阀值大小,也就是所谓的运行基线
警告实现方式
1、SQL Agent配置Job方式实现
2、计划任务
以上两种配置方式,可以灵活掌握,操作还是蛮简单的,如果不会,可自行google。当然,如果不想干预正常的生产系统,可以添加一个Server专门用来自动化运维检测来用,实现远程监控。
后续文章中会分析关于Power Shell的远程调用,并且能实现事故当前状态下,自动化截图....自动Send Email......为DBA现场取证第一手材料...方便诊断问题...
效果图如下
以上只提供实现方式,如需要内容更新,自己灵活更新。
脚本下载地址http://files.cnblogs.com/zhijianliutang/DBALter.zip
SQL Server自动化运维系列——监控性能指标脚本(Power Shell)的更多相关文章
- SQL Server自动化运维系列——监控跑批Job运行状态(Power Shell)
需求描述 在我们的生产环境中,大部分情况下需要有自己的运维体制,包括自己健康状态的检测等.如果发生异常,需要提前预警的,通知形式一般为发邮件告知. 在上一篇文章中已经分析了SQL SERVER中关于邮 ...
- SQL Server自动化运维系列——监控磁盘剩余空间及SQL Server错误日志(Power Shell)
需求描述 在我们的生产环境中,大部分情况下需要有自己的运维体制,包括自己健康状态的检测等.如果发生异常,需要提前预警的,通知形式一般为发邮件告知. 在所有的自检流程中最基础的一个就是磁盘剩余空间检测. ...
- SQL Server自动化运维系列 - 监控磁盘剩余空间及SQL Server错误日志(Power Shell)
需求描述 在我们的生产环境中,大部分情况下需要有自己的运维体制,包括自己健康状态的检测等.如果发生异常,需要提前预警的,通知形式一般为发邮件告知. 在所有的自检流程中最基础的一个就是磁盘剩余空间检测. ...
- SQL Server 自动化运维系列 - 监控磁盘剩余空间及SQL Server错误日志(Power Shell)
需求描述 在我们的生产环境中,大部分情况下需要有自己的运维体制,包括自己健康状态的检测等.如果发生异常,需要提前预警的,通知形式一般为发邮件告知. 在所有的自检流程中最基础的一个就是磁盘剩余空间检测. ...
- SQL Server自动化运维系列——关于邮件通知那点事(.Net开发人员的福利)
需求描述 在我们的生产环境中,大部分情况下需要有自己的运维体制,包括自己健康状态的检测等.如果发生异常,需要提前预警的,通知形式一般为发邮件告知. 邮件作为一种非常便利的预警实现方式,在及时性和易用性 ...
- SQL Server自动化运维系列——关于数据收集(多服务器数据收集和性能监控)
需求描述 在生产环境中,很多情况下需要采集数据,用以定位问题或者形成基线. 关于SQL Server中的数据采集有着很多种的解决思路,可以采用Trace.Profile.SQLdiag.扩展事件等诸多 ...
- SQL Server自动化运维系列 - 多服务器数据收集和性能监控
需求描述 在生产环境中,很多情况下需要采集数据,用以定位问题或者形成基线. 关于SQL Server中的数据采集有着很多种的解决思路,可以采用Trace.Profile.SQLdiag.扩展事件等诸多 ...
- SQL Server 自动化运维系列 - 多服务器数据收集和性能监控
需求描述 在生产环境中,很多情况下需要采集数据,用以定位问题或者形成基线. 关于SQL Server中的数据采集有着很多种的解决思路,可以采用Trace.Profile.SQLdiag.扩展事件等诸多 ...
- SQL Server自动化运维系列——批量执行SQL脚本(Power Shell)
需求描述 一般在生产环境中,在投产的情况下,需要批量的来执行SQL脚本文件,来完成整个投产,如果投产文件比较多的情况下,无疑这是一个比较痛苦的过程,所以本篇通过PowerShell脚本来批量完成. 监 ...
随机推荐
- Equals和ReferenceEquals
稍微分析下一下两个方法的区别: public static bool Equals(object objA, object objB); public static bool ReferenceEqu ...
- TCP的定时器
TCP的定时器 在TCP协议中有的时候需要定期或者按照某个算法对某个事件进行触发,那么这个时候,TCP协议是使用定时器进行实现的.在TCP中,会有四种定时器: 重传定时器 坚持定时器 保活定时器 2M ...
- Net设计模式实例之建造者模式(Builder Pattern)
一.建造者模式简介(Brief Introduction) 建造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示. 建造者模式的优点是 ...
- JavaScript中的匿名函数及函数的闭包
1.匿名函数 函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途.匿名函数:就是没有函数名的函数. 1.1 函数的定义,首先简单介绍一下函数的定义,大致可分为三种方式 第一种: ...
- 基于STM32Cube的DAC数模转化
1. STM32Cube配置 1.1 DAC配置 1.2 TIM6 配置 1.3 利用Cube产生工程程序,MDK打开软件 在主循环上添加语句: HAL_TIM_Base_S ...
- overflow
1. 隐藏x轴滚动条,垂直有滚动条: <body> <div style="width:100px;height:150px;overflow:scroll;overflo ...
- windows phone 水印TextBox
原文来自:wp教程网 原理:在失去焦点和获取焦点的时候,判断Text值是否为空或者是否与水印值相同,然后修改TextBox中的Text和Foreground. 代码如下: /* =========== ...
- java 字符串操作和日期操作
一.字符串操作 创建字符串 String s2 = new String("Hello World"); String s1 = "Hello World"; ...
- 深入.NET和C#的小型汽车租赁系统的框架
前言:写这个小型系统之前呢,我们应该要猜测可能要用到哪些知识点. 那么对于这个小型系统:主要用到了如下的知识: 封装,集合(ArrayList和HashTable)和泛型和非泛型集合(泛型:List ...
- MVC中实现Area几种方法
概述 ASP.NET MVC中,是依靠某些文件夹以及类的固定命名规则去组织model实体层,views视图层和控制层的.如果是大规模的应用程序,经常会由不同功能的模块组成,而每个功能模块 ...