| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- <#
- .SYNOPSIS
- Collect performance counter statistics for SQL Server
- .VERSION
- 1.0
- .DESCRIPTION
- Collects SQL performance data and stores metrics in local instance database for later extraction
- .NOTES
- Requires : PowerShell V2+,.NET 2+, dependent on scripts Out-DataTable.ps1 and Write-DataTable.ps1
-
- This script uses the current user's credentials for authentication to the local SQL Server instance, so please ensure your Windows
- login has permissions to both the SQL instance and the Windows OS prior to script execution.
- .EXAMPLE
- Simple usage, using default mandatory parameters
- PS C:\foo> .\Get-SQLPerfCounters.ps1 -S 'SQLInstance' -D 'dba_local' -T 'PerformanceCounter'
- ----
- server : SQLInstanceName
- destDatabase : dba_local
- destDatabaseTable : PerformanceCounter
- ----
- .PARAMETER server
- Use physical name for standalone installs or virtual name for cluster installations. If this is a named instance, add
- the instance name to this string (e.g. parikslaptop\test ).
- .PARAMETER destDatabase
- Database name where PerformanceCounter table is located
- .PARAMETER destDatabaseTable
- Table name where performance counter data is stored
- #>
- param (
- [Parameter(Position=0, Mandatory=$true)]
- [Alias('S')]
- [ValidateLength(1, 50)]
- [string] $server,
- [Parameter(Position=1, Mandatory=$false)]
- [Alias('D')]
- [ValidateLength(1, 50)]
- [string]$destDatabase = "dba_local",
- [Parameter(Position=2, Mandatory=$false)]
- [Alias('T')]
- [ValidateLength(1, 50)]
- [string]$destDatabaseTable = "PerformanceCounter"
- )
- try{
- <#
- if(![System.Diagnostics.EventLog]::SourceExists("SQLPerfCounters"))
- {[System.Diagnostics.EventLog]::CreateEventSource("SQLPerfCounters","Application")}
- #>
- $scriptDir = Split-Path -parent $MyInvocation.MyCommand.Path
- $dt = $null
-
- .$scriptDir\Out-DataTable.ps1
- .$scriptDir\Write-DataTable.ps1
-
- $dbConn = New-Object Data.SqlClient.SqlConnection;
- $dbConn.ConnectionString = "Data Source=$server;Initial Catalog=dba_local;Integrated Security=True;"
- $dbConn.Open()
- $dbCmd = New-Object Data.SqlClient.SqlCommand "SELECT counter_name FROM PerformanceCounterList WHERE is_captured_ind = 1", $dbConn
- $dr = $dbCmd.ExecuteReader()
- [string[]]$perfList = @()
- if($dr.HasRows){
-
- $server2 = $server -replace "\\.*$", ""
- $instance = $server.split('\')[1]
- if($instance -eq $null){$instance = 'SQLServer'}
- while ($dr.Read()){$perfList += $dr["counter_name"]}
-
- $gc = (get-counter -counter $perfList)
-
- foreach($g in $gc.CounterSamples){
- $hProp = @{"CounterName" = $g.Path -replace ".*$instance\:|^`\`\`\`\$server2`\`\","";"CounterValue" = $g.CookedValue;"TimeStamp" = $g.TimeStamp}
- $ctr = New-Object -TypeName PSObject -Property $hProp | Select-Object CounterName, CounterValue, TimeStamp
- $dt += $ctr | Out-DataTable
- }
-
- Write-DataTable -ServerInstance $server -Database $destDatabase -TableName $destDatabaseTable -Data $dt -ErrorAction "Stop"
- }
- }
- catch{
- [string]$LogName = "Application"
- [string]$src = "SQLPerfCounters"
- $evnID = 10
- $errMssg = $_.Exception.GetBaseException().Message
- [string]$entryType = "Error"
- $errParms = @{'LogName'=$LogName;'Source'=$src;'EventID'=$evnID;'EntryType'=$entryType;'Message'=$errMssg}
- Write-Output @errParms
- $errMssg
- exit 1
- }
- finally{
- if($dr){$dr.Close()}
- if($dbCmd){$dbCmd.Dispose()}
- if($dbConn){$dbConn.Close();$dbConn.Dispose()}
- }
|