PowerShell-Skript für eine effektive SQL Server-Zustandsüberwachung

Die wichtigsten Erkenntnisse

  • PowerShell-Skripte rationalisieren die Überwachung vom SQL Server-Zustand und verbessern Genauigkeit und betriebliche Effizienz.
  • Anpassbare Parameter im Skript ermöglichen eine personalisierte Überwachung von Datenbankdiensten, Speicherplatz und Latenz.
  • Durch die automatische Überwachung wird das Risiko von Serverausfallzeiten und Leistungsproblemen verringert.
  • Das Skript prüft, ob Sie über Administratorrechte verfügen, die für den Zugriff auf Systeminformationen und die Durchführung bestimmter Vorgänge erforderlich sind.
  • Die Echtzeit-Überwachungsfunktionen des Skripts sind entscheidend für die Aufrechterhaltung des Zustands der Datenbank und die Vermeidung von Datenverlusten.
  • Das Skript ist anpassbar an verschiedene SQL Server-Versionen, was es zu einem vielseitigen Tool für unterschiedliche IT-Umgebungen macht.
  • Die Integration dieses Skripts in umfassende IT-Management-Plattformen wie NinjaOne bietet eine robuste Überwachungslösung.
  • Um die Effektivität des Skripts zu maximieren, werden regelmäßige Updates und Mitarbeiterschulungen in PowerShell empfohlen.
  • Die proaktive Überwachung und Wartung von SQL-Servern ist für die Gewährleistung einer hohen Verfügbarkeit und Datenintegrität in modernen Geschäftsumgebungen unerlässlich.

Kontext

Die Sicherstellung des Zustands und der Leistung von SQL Server-Datenbanken ist für Unternehmen essenziell, um Kontinuität und Effizienz aufrechtzuerhalten. Angesichts der zunehmenden Abhängigkeit von datengesteuerten Entscheidungen wird IT-Expert:innen häufig die wichtige Aufgabe übertragen, diese Systeme zu überwachen und zu verwalten. Der Einsatz von PowerShell-Skripten zu diesem Zweck optimiert den Prozess und erhöht sowohl die Genauigkeit als auch die Effizienz.

Das mitgelieferte PowerShell-Skript ist ein wertvolles Tool für IT-Administrator:innen und Managed Service Provider (MSPs). Es konzentriert sich auf die Überwachung von drei Schlüsselaspekten des SQL Server-Status: Status der Datenbankdienste, Verfügbarkeit von Festplattenplatz und Festplattenlatenz. Eine solche Überwachung ist unerlässlich, da sie dazu beiträgt, Datenverluste zu verhindern, eine hohe Verfügbarkeit zu gewährleisten und die optimale Leistung des SQL Servers aufrechtzuerhalten.

Das Skript zur Überwachung vom SQL Server-Zustand

#Requires -Version 5.1

<#
.SYNOPSIS
    Monitors the database services, database's drive free space, and database's disk latency.
.DESCRIPTION
    Monitors the database services, database's drive free space, and database's disk latency.

    Exit code of 1 means there is a problem.

    Will not detect LocalDB uses of SQL Express

.EXAMPLE
    (No Parameters)
    ## EXAMPLE OUTPUT WITHOUT PARAMS ##
    SQL Server's services are running.
    SQL Server's disk latency is below threshold.
    SQL Server's disk free space is above threshold.

PARAMETER: -RequireAgentService
    Checks if the SQL Agent service is running or not.
.EXAMPLE
    -RequireAgentService
    ## EXAMPLE OUTPUT WITH RequireAgentService ##
    SQL Server's services are running.
    SQL Server's disk latency is below threshold.
    SQL Server's disk free space is above threshold.


PARAMETER: -DiskSpaceThreshold 50
    The percentage of free space where the database is stored must have free. 0-100
.EXAMPLE
    -DiskSpaceThreshold 50
    ## EXAMPLE OUTPUT WITH DiskSpeedThreshold ##
    [MSSQLSERVER] C: is under the threshold(50%) at 20%

PARAMETER: -DiskSpeedThreshold 40
    A brief explanation of the parameter.
.EXAMPLE
    -DiskSpeedThreshold 40
    ## EXAMPLE OUTPUT WITH DiskSpeedThreshold ##
    [MSSQLSERVER] Disk Read/Write latency is over 0 ms.
    Path                                           InstanceName          CookedValue
    ----                                           ------------          -----------
    \\test01\logicaldisk(c:)\disk reads/sec      c:               42.89807648928576
    \\test01\logicaldisk(c:)\disk writes/sec     c:                49.484308202068
.OUTPUTS
    None
.NOTES
    Minimum OS Architecture Supported: Windows 10, Windows Server 2016
    Release Notes: Renamed script and added Script Variable support
By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https://www.ninjaone.com/terms-of-use.
    Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. 
    Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. 
    Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. 
    Warranty Disclaimer: The script is provided “as is” and “as available”, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. 
    Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. 
    Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. 
    EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA).
#>

[CmdletBinding()]
param (
    [Parameter()]
    # Expects number in percentage with out the %
    # Default is 10 %
    [int]$DiskSpaceThreshold = 10,
    [Parameter()]
    # Expects number in milliseconds(ms)
    # Default is 50 ms
    [int]$DiskSpeedThreshold = 50,
    [switch]$RequireAgentService = [System.Convert]::ToBoolean($env:requireAgentService)
)

begin {
    function Test-IsElevated {
        $id = [System.Security.Principal.WindowsIdentity]::GetCurrent()
        $p = New-Object System.Security.Principal.WindowsPrincipal($id)
        $p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)
    }

    if ($env:DiskSpaceThreshold) {
        $DiskSpaceThreshold = $env:DiskSpaceThreshold
    }
    if ($env:DiskSpeedThreshold) {
        $DiskSpeedThreshold = $env:DiskSpeedThreshold
    }

    Function Get-DefaultDBLocation {
        Param ([string] $vInstance)
        # Get the registry key associated with the Instance Name
        $vRegInst = (Get-ItemProperty -Path HKLM:"SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL" -ErrorAction SilentlyContinue).$vInstance
        $vRegPath = "SOFTWARE\Microsoft\Microsoft SQL Server\" + $vRegInst + "\MSSQLServer"
        # Get the Data and Log file paths if available
        $vDataPath = (Get-ItemProperty -Path HKLM:$vRegPath -ErrorAction SilentlyContinue).DefaultData
        $vLogPath = (Get-ItemProperty -Path HKLM:$vRegPath -ErrorAction SilentlyContinue).DefaultLog
        # Report the entries found
        $Locations = [PSCustomObject]@{
            Data = ""
            Log  = ""
        }
        if ($vDataPath.Length -lt 1) {
            $vRegPath = "SOFTWARE\Microsoft\Microsoft SQL Server\" + $vRegInst + "\Setup"
            $vDataPath = (Get-ItemProperty -Path HKLM:$vRegPath -ErrorAction SilentlyContinue).SQLDataRoot + "\Data\"
            $Locations.Data = $vDataPath
        }
        else {
            $Locations.Data = $vDataPath
        }
        if ($vLogPath.Length -lt 1) {
            $vRegPath = "SOFTWARE\Microsoft\Microsoft SQL Server\" + $vRegInst + "\Setup"
            $vDataPath = (Get-ItemProperty -Path HKLM:$vRegPath -ErrorAction SilentlyContinue).SQLDataRoot + "\Data\"
            $Locations.Log = $vDataPath
        }
        else {
            $Locations.Log = $vDataPath
        }
        $Locations
    }
    function Get-DiskCounters {
        param ($Drive)
        $Counters = @(
            "\LogicalDisk($Drive*)\Avg. Disk sec/Read"
            "\LogicalDisk($Drive*)\Avg. Disk sec/Write"
            "\LogicalDisk($Drive*)\Disk Reads/sec"
            "\LogicalDisk($Drive*)\Disk Writes/sec"
        )
        $CounterData = Get-Counter -Counter $Counters -MaxSamples 1 -SampleInterval 10 | Select-Object -ExpandProperty CounterSamples

        $CounterData | Where-Object { $_.CookedValue -gt $DiskSpeedThreshold } | Write-Output
    }
    function Get-DiskFreePercentage {
        param ($Drive)
        $TotalSize = Get-Partition | Where-Object { $_.DriveLetter -like $Drive } | Select-Object -ExpandProperty Size
        $Free = Get-PSDrive -Name $Drive | Select-Object -ExpandProperty Free
        try {
            $Free / $TotalSize * 100
        }
        catch {
            0
        }
    }
    $script:HasErrors = $false
}
process {
    Write-Host
    if (-not (Test-IsElevated)) {
        Write-Error -Message "Access Denied. Please run with Administrator privileges."
        exit 1
    }
    $Services = Get-Service | Where-Object { $_.DisplayName -like "SQL Server*" }
    $SqlDbServices = $Services | Where-Object { $_.DisplayName -like "SQL Server (*" } | Select-Object -ExpandProperty DisplayName
    $SqlDbNames = $SqlDbServices | ForEach-Object {
        "$_" -split '\(' -replace '\)' | Select-Object -Last 1
    }

    # Get all MS SQL Databases
    $Databases = $SqlDbNames | ForEach-Object {
        $DbName = $_
        $DbLocations = Get-DefaultDBLocation -vInstance $DbName
        [PSCustomObject]@{
            Name            = $DbName
            DatabaseService = $Services | Where-Object { $_.DisplayName -like "SQL Server ($DbName)" }
            AgentService    = $Services | Where-Object { $_.DisplayName -like "*Agent *$DbName*" }
            DataPath        = $DbLocations.Data
            LogPath         = $DbLocations.Log
        }
    }

    $Databases | ForEach-Object {
        $Database = $_
        $DatabaseService = $Database.DatabaseService
        $AgentService = $Database.AgentService
        $DatabaseName = $Database.Name
        $Drive = $Database.DataPath -split ':\\' | Select-Object -First 1

        # Check service status
        if ($DatabaseService.Status -notlike "Running") {
            Write-Host "[$DatabaseName] Database Service is not running."
            $script:HasErrors = $true
        }
        if ($AgentService.Status -notlike "Running") {
            Write-Host "[$DatabaseName] Database Agent Service is not running."
            if ($RequireAgentService) {
                $script:HasErrors = $true
            }
        }

        # Get disk free space percentage
        $FreePercent = Get-DiskFreePercentage -Drive $Drive
        if ($FreePercent -lt $DiskSpaceThreshold) {
            Write-Host "[$DatabaseName] $($Drive): is under the threshold($DiskSpaceThreshold%) at $([System.Math]::Round($FreePercent,0))%"
            $script:HasErrors = $true
        }

        # Get disk latency
        $HighCounters = Get-DiskCounters -Drive $Drive
        if ($HighCounters) {
            $HighCounters | ForEach-Object {
                Write-Host "[$DatabaseName] Disk Read/Write latency is over $DiskSpeedThreshold ms at $([System.Math]::Round($_.CookedValue,2)) for $($_.InstanceName)."
            }
            $HighCounters | Out-String | Write-Host
            $script:HasErrors = $true
        }
    }

    if ($script:HasErrors) {
        exit 1
    }
    else {
        Write-Host "SQL Server's services are running."
        Write-Host "SQL Server's disk latency is below threshold."
        Write-Host "SQL Server's disk free space is above threshold."
        exit 0
    }
    
}
end {
    
    
    
}

 

Greifen Sie auf über 300 Skripte im NinjaOne Dojo zu.

Zugang erhalten

Detaillierte Aufschlüsselung

Das Skript beginnt mit einer Reihe von Parametern, die eine Anpassung an spezifische Überwachungsbedürfnisse ermöglichen, zum Beispiel Schwellenwerte für Speicherplatz und Geschwindigkeit. Es umfasst mehrere Funktionen:

  • Test-IsElevated: Überprüft, ob das Skript mit Administratorrechten ausgeführt wird, die für den Zugriff auf bestimmte Systeminformationen unerlässlich sind.
  • Get-DefaultDBLocation: Legt die Standardspeicherorte für Daten und Protokolldateien für SQL Server-Instanzen fest.
  • Get-DiskCounters: Ruft Metriken zur Festplattenleistung ab.
  • Get-DiskFreePercentage: Berechnet den Prozentsatz des freien Speicherplatzes.

In seinem Hauptprozess bewertet das Skript den Status der SQL Server-Dienste, der Agentendienste, den Speicherplatz und die Festplattenlatenz. Wenn ein Parameter unter die festgelegten Schwellenwerte fällt oder ein Dienst nicht läuft, wird ein Fehler gemeldet.

Mögliche Anwendungsfälle

Stellen Sie sich einen MSP vor, der für die Wartung der SQL Server-Umgebung eines Kunden verantwortlich ist. Er kann dieses Skript so planen, dass es in regelmäßigen Abständen ausgeführt wird, um sicherzustellen, dass potenzielle Probleme mit Datenbankdiensten, Speicherplatz oder Latenzzeiten schnell erkannt und behoben werden, wodurch das Risiko von Serverausfällen oder Leistungseinbußen verringert wird.

Vergleiche

Herkömmliche Methoden zur Überwachung vom SQL Server-Zustand bestehen oft in manuellen Kontrollen oder Tools von Drittanbietern. Dieses Skript bietet jedoch einen stärker integrierten und automatisierten Ansatz, der Echtzeitwarnmeldungen ermöglicht und menschliches Versagen minimiert.

FAQs

Q1: Wie oft sollte das Skript ausgeführt werden? 
A1: Dies hängt von der Kritikalität der SQL Server-Umgebung ab. Für Datenbanken mit hohem Datenverkehr kann ein täglicher oder sogar stündlicher Zeitplan angemessen sein.

Q2: Kann das Skript für verschiedene SQL Server-Versionen angepasst werden? 
A2: Ja, es kann für verschiedene Versionen angepasst werden, wobei je nach den spezifischen Funktionen und Konfigurationen der Version einige Anpassungen erforderlich sein können.

Q3: Sind für die Verwendung dieses Skripts PowerShell-Kenntnisse erforderlich? 
A3: Grundlegende PowerShell-Kenntnisse sind von Vorteil, aber das Skript ist benutzerfreundlich gestaltet und enthält klare Parameteranweisungen.

Folgen

Eine ineffiziente Überwachung kann zu Serverausfällen, langsamen Abfrageantworten und sogar zu Datenverlusten führen. Dieses Skript minimiert solche Risiken und trägt zu einer sichereren und zuverlässigeren IT-Umgebung bei.

Empfehlungen

  • Aktualisieren Sie das Skript regelmäßig, um es an neue SQL Server-Versionen oder organisatorische Änderungen anzupassen.
  • Kombinieren Sie dieses Skript mit anderen Überwachungs-Tools, um einen umfassenden Überblick über die IT-Infrastruktur zu erhalten.
  • Schulung der IT-Mitarbeiter:innen in PowerShell, um den Nutzen des Skripts zu maximieren.

Abschließende Überlegungen

In der Welt der Datenbankverwaltung und IT-Infrastrukturüberwachung bieten Tools wie NinjaOne robuste Lösungen, die PowerShell-Skripte ergänzen. NinjaOne kann die Fähigkeiten solcher Skripte verbessern, indem es eine einheitliche Plattform für die Überwachung, Benachrichtigung und Automatisierung von Reaktionen auf SQL Server-Leistungsprobleme bietet. Durch die Integration von Skripten mit solchen Tools können Unternehmen eine proaktivere und effizientere IT-Verwaltungsstrategie erreichen und sicherstellen, dass ihre SQL-Server stabil, reaktionsschnell und zuverlässig bleiben.

Nächste Schritte

Der Aufbau eines effizienten und effektiven IT-Teams erfordert eine zentralisierte Lösung, die als einheitliches Tool zur Bereitstellung von IT-Dienstleistungen fungiert. NinjaOne ermöglicht es IT-Teams, alle Geräte zu überwachen, zu verwalten, zu sichern und zu unterstützen, unabhängig vom Standort, ohne dass eine komplexe Infrastruktur vor Ort erforderlich ist.

Erfahren Sie mehr über NinjaOne Remote Script Deployment, sehen Sie sich eine Live-Tour an oder starten Sie Ihre kostenlose Testversion unserer NinjaOne Plattform.

Kategorien:

Das könnte Sie auch interessieren

×

Sehen Sie NinjaOne in Aktion!

Mit dem Absenden dieses Formulars akzeptiere ich die Datenschutzerklärung von NinjaOne.

NinjaOne Allgemeine Geschäftsbedingungen für Skripte

Indem Sie unten auf die Schaltfläche “Ich akzeptiere” klicken, erklären Sie Ihr Einverständnis mit den folgenden rechtlichen Bedingungen sowie mit unseren Nutzungsbedingungen:

  • Eigentumsrechte: NinjaOne besitzt und wird weiterhin alle Rechte, Titel und Interessen an dem Skript (einschließlich des Urheberrechts) behalten. NinjaOne gewährt Ihnen eine eingeschränkte Lizenz zur Nutzung des Skripts in Übereinstimmung mit diesen rechtlichen Bedingungen.
  • Einschränkung der Nutzung: Sie dürfen das Skript nur für Ihre legitimen persönlichen oder internen Geschäftszwecke verwenden und es nicht an Dritte weitergeben.
  • Verbot der Wiederveröffentlichung: Sie sind unter keinen Umständen berechtigt, das Skript in einer Skriptbibliothek, die einem anderen Softwareanbieter gehört oder von diesem kontrolliert wird, erneut zu veröffentlichen.
  • Gewährleistungsausschluss: Das Skript wird “wie gesehen” und “wie verfügbar” bereitgestellt, ohne jegliche Garantie. NinjaOne gibt keine Versprechen oder Garantien, dass das Skript frei von Fehlern ist oder dass es Ihre speziellen Bedürfnisse oder Erwartungen erfüllt.
  • Risikoübernahme: Die Verwendung des Skripts erfolgt auf eigene Gefahr. Sie erkennen an, dass die Nutzung des Skripts mit bestimmten Risiken verbunden ist, und Sie verstehen und übernehmen jedes dieser Risiken.
  • Verzicht und Freigabe: Sie machen NinjaOne nicht für nachteilige oder unbeabsichtigte Folgen verantwortlich, die sich aus Ihrer Nutzung des Skripts ergeben, und Sie verzichten auf alle gesetzlichen oder billigkeitsrechtlichen Rechte oder Rechtsmittel, die Sie gegen NinjaOne im Zusammenhang mit Ihrer Nutzung des Skripts haben könnten.
  • EULA: Wenn Sie ein NinjaOne-Kunde sind, unterliegt Ihre Nutzung des Skripts dem für Sie geltenden Endbenutzer-Lizenzvertrag (EULA).