🛢 sqmSQLTool
PowerShell SQL Admin Toolset · dtcSoftware · Janke
📖 Referenz
🚀 Quick Start
⚙️ Konfiguration
🔄 AlwaysOn Availability Groups
Invoke-sqmAddDatabaseToAvailabilityGroup
AlwaysOn
Fügt eine oder mehrere Datenbanken zu einer AG hinzu (AutoSeed). Prüft bestehende Mitgliedschaft, setzt Recovery auf Full, löscht DB auf Secondaries und fügt via Automatic Seeding hinzu. Bei
-All sequentielle Verarbeitung zur Lastvermeidung.▶ 4 Beispiele anzeigen
Einzelne Datenbank hinzufügen
Invoke-sqmAddDatabaseToAvailabilityGroup -AvailabilityGroup "AG_Prod" -Database "SalesDB"
Alle User-Datenbanken hinzufügen
Invoke-sqmAddDatabaseToAvailabilityGroup -AvailabilityGroup "AG_Prod" -All
Mehrere Datenbanken explizit
Invoke-sqmAddDatabaseToAvailabilityGroup -SqlInstance "SQL01" ` -AvailabilityGroup "AG_Prod" ` -Database "SalesDB","InventoryDB","HRApp"
Invoke-sqmRemoveDatabaseFromAvailabilityGroup
AlwaysOn
Entfernt Datenbanken aus ihrer AG, erkennt die AG automatisch und löscht die DB von allen Secondaries. Systemdatenbanken werden ignoriert.
▶ 3 Beispiele anzeigen
Einzelne Datenbank entfernen
Invoke-sqmRemoveDatabaseFromAvailabilityGroup -Database "SalesDB"
Alle AG-Datenbanken entfernen
Invoke-sqmRemoveDatabaseFromAvailabilityGroup -All
Auf expliziter Instanz
Invoke-sqmRemoveDatabaseFromAvailabilityGroup -SqlInstance "SQL01" -Database "OldApp"
Invoke-sqmSqlAlwaysOnAutoseeding
AlwaysOn
Aktiviert Automatic Seeding auf allen Replikaten einer oder aller AGs. Setzt den Seeding-Modus aller Replikate auf "Automatic".
▶ 3 Beispiele anzeigen
Lokale Instanz (Standard)
Invoke-sqmSqlAlwaysOnAutoseeding
Alle AGs auf einer Instanz aktivieren
Invoke-sqmSqlAlwaysOnAutoseeding -SqlInstance "SQL01" -All
Benannte Instanz
Invoke-sqmSqlAlwaysOnAutoseeding -SqlInstance "SQL01\MSSQLSERVER"
Get-sqmAgHealthReport
AlwaysOn
Vollständiger Zustandsbericht aller AGs: Synchronisierungsstatus, Redo/Send-Queue pro Replikat, Verbindungsstatus, Listener-Konfiguration, laufende AutoSeed-Vorgänge. Schreibt TXT + CSV ins OutputPath.
▶ 5 Beispiele anzeigen
Einfacher Health-Report
Get-sqmAgHealthReport
Mit angepassten Schwellwerten
Get-sqmAgHealthReport -SqlInstance "SQL01" -MaxRedoQueueMB 200 -OutputPath "D:\Reports"
Nur kritische Probleme anzeigen
Get-sqmAgHealthReport -SqlInstance "SQL01" | Where-Object OverallStatus -eq 'Critical' | Format-Table AgName, ReplicaName, Database, DbSyncState, RedoQueueMB -AutoSize
Redo-Queue sortiert – größte zuerst
Get-sqmAgHealthReport -SqlInstance "SQL01" | Where-Object Role -eq 'SECONDARY' | Sort-Object RedoQueueMB -Descending | Select-Object AgName, Database, ReplicaName, RedoQueueMB, SendQueueMB | Format-Table -AutoSize
AutoSeed-Vorgänge live überwachen
while ($true) {
Clear-Host
Get-sqmAgHealthReport -SqlInstance "SQL01" |
Where-Object Role -eq 'SEEDING' |
Select-Object Database, DbSyncState, PercentComplete |
Format-Table -AutoSize
Start-Sleep 30
}
Sync-sqmAgNode
AlwaysOn
Synchronisiert Logins, SQL Agent Jobs, Linked Server, Operatoren und Alerts von Primary zu allen Secondaries. Erkennt Primary automatisch. Bereinigt anschließend verwaiste User auf AG-Datenbanken.
▶ 5 Beispiele anzeigen
Vollautomatische Synchronisation
Sync-sqmAgNode
Nur Logins synchronisieren
Sync-sqmAgNode -SqlInstance "SQL01" -ExcludeType Jobs,LinkedServers,Operators,Alerts
Nur bestimmte AG synchronisieren
Sync-sqmAgNode -SqlInstance "SQL01" -AvailabilityGroup "AG_Prod"
Einzelnen Login gezielt synchronisieren
Sync-sqmAgNode -SqlInstance "SQL01" -ObjectName "AppServiceAccount"
Ergebnis auswerten
$r = Sync-sqmAgNode -SqlInstance "SQL01"
$r | Group-Object ObjectType | ForEach-Object {
"$($_.Name): $(@($_.Group | Where Status -eq 'Success').Count) OK, " +
"$(@($_.Group | Where Status -eq 'Failed').Count) Fehler"
}
Repair-sqmAlwaysOnDatabases
AlwaysOn
Überprüft alle AG-Datenbanken auf Probleme (SyncStatus ≠ HEALTHY/SYNCHRONIZED) und repariert sie automatisch (Remove → Cleanup → Add mit AutoSeed). Erstellt Eventlog-Quelle "MSSAlwaysOn" bei Bedarf.
▶ 3 Beispiele anzeigen
Automatische Reparatur (nur Problemfälle)
Repair-sqmAlwaysOnDatabases
Alle DBs erzwingen (auch gesunde)
Repair-sqmAlwaysOnDatabases -Force
Explizite Instanz mit Fehlertoleranz
Repair-sqmAlwaysOnDatabases -SqlInstance "SQL01" -ContinueOnError
New-sqmAlwaysOnRepairJob
AlwaysOn
Erstellt einen SQL Agent Job der
Repair-sqmAlwaysOnDatabases periodisch ausführt (PowerShell-Subsystem). Konfigurierbar mit Zeitplan und Operator-Benachrichtigung.▶ 3 Beispiele anzeigen
Stündlicher Repair-Job
New-sqmAlwaysOnRepairJob
Täglich um 02:00 Uhr
New-sqmAlwaysOnRepairJob -Schedule "FREQ=DAILY;INTERVAL=1" -StartTime "02:00:00"
Job auf allen AG-Nodes erstellen
"SQL01","SQL02","SQL03" | ForEach-Object {
New-sqmAlwaysOnRepairJob -SqlInstance $_ -Schedule "FREQ=HOURLY;INTERVAL=2"
}
Invoke-sqmFailover
AlwaysOn
Fuehrt einen kontrollierten manuellen AlwaysOn-Failover mit Pre- und Post-Checks durch.
Pre-Check: AG-Existenz, Primary-Rolle, Replikat-Status, Redo-Queue-Groesse (Standard: max. 50 MB).
Failover:
ALTER AVAILABILITY GROUP ... FAILOVER wird auf dem Ziel-Sekundaer ausgefuehrt.
Post-Check: Bestaetigt neue Primary-Rolle nach konfigurierbarer Wartezeit.
Unterstuetzt -WhatIf, automatische Replikat-Auswahl (kleinste Redo-Queue, SYNCHRONOUS_COMMIT bevorzugt) und -ContinueOnError.► 5 Beispiele anzeigen
Testlauf - was wuerde passieren?
Invoke-sqmFailover -SqlInstance "SQL01" -AvailabilityGroup "AG_Prod" -WhatIf
Failover auf bestimmtes Replikat
Invoke-sqmFailover -SqlInstance "SQL01" -AvailabilityGroup "AG_Prod" ` -TargetReplica "SQL02" -MaxRedoQueueMB 10
Automatische Replikat-Wahl (kleinste Queue)
Invoke-sqmFailover -SqlInstance "SQL01" -AvailabilityGroup "AG_Prod"
Mit laengerer Post-Check-Wartezeit
Invoke-sqmFailover -SqlInstance "SQL01" -AvailabilityGroup "AG_Prod" ` -WaitAfterFailoverSeconds 60 -EnableException
Ergebnis auswerten
$result = Invoke-sqmFailover -SqlInstance "SQL01" -AvailabilityGroup "AG_Prod"
if ($result.Status -eq 'Success') {
Write-Host "Failover OK: $($result.OldPrimary) -> $($result.NewPrimary) in $($result.FailoverDurationSec)s"
}💾 Backup & Restore
Invoke-sqmUserDatabaseBackup
Backup
Sichert alle oder ausgewählte Benutzerdatenbanken (Full). Zielpfad wird aus Server-Properties (BackupDirectory) gelesen und muss auf \User-Db enden.
▶ 4 Beispiele anzeigen
Alle Benutzerdatenbanken sichern
Invoke-sqmUserDatabaseBackup -All
Bestimmte Datenbanken auf Remote-Server
Invoke-sqmUserDatabaseBackup -SqlInstance "SQL01" -Database "SalesDB","InventoryDB"
Mit alternativem Backup-Pfad
Invoke-sqmUserDatabaseBackup -All -BackupPath "D:\Backup\User-Db"
Testlauf ohne Ausführung
Invoke-sqmUserDatabaseBackup -All -WhatIf
Invoke-sqmRestoreDatabase
Restore
Kontrollierter Restore mit AG-Erkennung: entfernt DB aus AG, exportiert User, optional Pre-Restore-Backup, Restore, User-Wiederherstellung, Orphaned-User-Bereinigung, SA-Owner setzen. Unterstützt Full + Diff + Log-Sequenzen.
▶ 4 Beispiele anzeigen
Einfacher Full-Restore
Invoke-sqmRestoreDatabase -SqlInstance "SQL01" ` -BackupFile "D:\Backup\AdventureWorks.bak" ` -DatabaseName "AdventureWorks"
Full + Diff + Logs
$backupSequence = @( "D:\Backup\AW_Full.bak", "D:\Backup\AW_Diff.bak", "D:\Backup\AW_Log1.trn", "D:\Backup\AW_Log2.trn" ) Invoke-sqmRestoreDatabase -SqlInstance "SQL01" ` -BackupFiles $backupSequence ` -DatabaseName "AdventureWorks"
Restore unter neuem Namen
Invoke-sqmRestoreDatabase -SqlInstance "SQL01" ` -BackupFile "D:\Backup\OldDB.bak" ` -DatabaseName "OldDB" ` -NewDatabaseName "NewDB"
Mit Pre-Restore-Backup (Rollback-Sicherheit)
Invoke-sqmRestoreDatabase -SqlInstance "SQL01" ` -BackupFile "D:\Backup\SalesDB.bak" ` -DatabaseName "SalesDB" ` -CreatePreRestoreBackup
Single-User erzwingen (DB in Benutzung)
Invoke-sqmRestoreDatabase -SqlInstance "SQL01" ` -BackupFile "D:\Backup\SalesDB.bak" ` -DatabaseName "SalesDB" ` -ForceSingleUser
Mehrere DBs per Pipeline
"D:\Bak\DB1.bak","D:\Bak\DB2.bak" |
Invoke-sqmRestoreDatabase -SqlInstance "SQL01" -DatabaseName { [IO.Path]::GetFileNameWithoutExtension($_) }
Test-sqmBackupIntegrity
Backup
Prüft eine oder mehrere Backup-Dateien via RESTORE VERIFYONLY. Liefert
$true bei Erfolg.▶ 3 Beispiele anzeigen
Einzelne Datei prüfen
Test-sqmBackupIntegrity -SqlInstance "SQL01" -BackupPath "D:\Backup\AdventureWorks.bak"
Alle Backups eines Verzeichnisses prüfen
Get-ChildItem "D:\Backup\*.bak" | ForEach-Object {
$ok = Test-sqmBackupIntegrity -SqlInstance "SQL01" -BackupPath $_.FullName
[PSCustomObject]@{ File = $_.Name; Valid = $ok }
} | Format-Table -AutoSizeBei Fehler abbrechen
if (-not (Test-sqmBackupIntegrity -SqlInstance "SQL01" -BackupPath "D:\Backup\SalesDB.bak")) {
throw "Backup-Prüfung fehlgeschlagen!"
}
Invoke-sqmLogShrink
Wartung
Shrinkt LDF-Dateien via DBCC SHRINKFILE. Berechnet Zielgröße aus ShrinkTargetPercent + MinTargetMB. Berücksichtigt AGs (leitet zum Primary). Systemdatenbanken und Offline-DBs werden übersprungen.
▶ 4 Beispiele anzeigen
Einzelne Datenbank auf 20 % schrumpfen
Invoke-sqmLogShrink -Database "MyDB" -ShrinkTargetPercent 20
Alle Datenbanken (Testlauf)
Invoke-sqmLogShrink -SqlInstance "SQL01" -All -WhatIf
Mit Mindestgröße
Invoke-sqmLogShrink -Database "HugeDB" -ShrinkTargetPercent 10 -MinTargetMB 512
Vor Shrink ein Log-Backup machen (Full Recovery)
# 1. Log-Backup Backup-DbaDatabase -SqlInstance "SQL01" -Database "SalesDB" -Type Log -BackupDirectory "D:\Backup" # 2. Dann shrink Invoke-sqmLogShrink -SqlInstance "SQL01" -Database "SalesDB" -ShrinkTargetPercent 15
🔒 Sicherheit
Invoke-sqmSaObfuscation
Sicherheit
Verschleiert das SA-Konto: umbenennen, deaktivieren, kryptographisch sicheres Zufallskennwort (Fisher-Yates-Shuffle). Abbruch wenn kein weiteres aktives sysadmin-Konto vorhanden (Status: AbortedNoSysadmin).
▶ 5 Beispiele anzeigen
Standardverschleierung (Name: sqmsa, 18 Zeichen)
$r = Invoke-sqmSaObfuscation -SqlInstance "SQL01" Write-Host "Neuer Name : $($r.NewLoginName)" Write-Host "Kennwort : $($r.GeneratedPassword)" # SOFORT sicher verwahren!
Eigener Login-Name und längeres Kennwort
Invoke-sqmSaObfuscation -SqlInstance "SQL01" -NewName "dbsvc_sys" -PasswordLength 32
Kennwort sofort in Datei sichern
$r = Invoke-sqmSaObfuscation -SqlInstance "SQL01"
if ($r.Status -eq 'Success') {
$r.GeneratedPassword | Out-File "C:\Secure\sa_pw_$(Get-Date -f 'yyyyMMdd').txt" -Encoding UTF8
}Mehrere Instanzen mit Fehlertoleranz
$results = "SQL01","SQL02","SQL03" | ForEach-Object {
Invoke-sqmSaObfuscation -SqlInstance $_ -ContinueOnError
}
$results | Select-Object SqlInstance, NewLoginName, SysadminCheck, Status | Format-Table -AutoSize
Invoke-sqmRenameSaAccount
Sicherheit
Benennt das SA-Konto um (über feste SID 0x01 – umbenennungssicher) und/oder ändert den Aktivierungsstatus. Umbenennung und Aktivierung/Deaktivierung sind unabhängig voneinander.
▶ 4 Beispiele anzeigen
SA in sqmsa umbenennen (Standardname)
Invoke-sqmRenameSaAccount
Umbenennen und deaktivieren
Invoke-sqmRenameSaAccount -NewName "MyHiddenSA" -Disable
Nur aktivieren (ohne Umbenennung)
Invoke-sqmRenameSaAccount -NewName "sa" -Enable
Mehrere Instanzen
"SQL01","SQL02","SQL03" | ForEach-Object {
Invoke-sqmRenameSaAccount -SqlInstance $_ -NewName "sqmsa" -Disable
}
Get-sqmSysadminAccounts
Sicherheit
Ermittelt alle sysadmin-Logins. Bekannte Konten per
-ExcludeLogin (Wildcard) als "Excluded" markieren. BUILTIN\Administrators erhält eigenen Status. Schreibt TXT + CSV ins OutputPath.▶ 5 Beispiele anzeigen
Alle Sysadmin-Konten auflisten
Get-sqmSysadminAccounts -SqlInstance "SQL01"
Systemkonten automatisch ausschließen
Get-sqmSysadminAccounts -SqlInstance "SQL01" -ExcludeSysAccounts
Bekannte Konten ausschließen
Get-sqmSysadminAccounts -SqlInstance "SQL01" ` -ExcludeLogin "NT SERVICE\*","NT AUTHORITY\*","CONTOSO\SQLAdmins","sqmsa" ` -ExcludeSysAccounts
Nur unerwartete Konten anzeigen
Get-sqmSysadminAccounts -SqlInstance "SQL01" -ExcludeSysAccounts | Where-Object Status -in 'Unexpected','BuiltinAdmins' | Format-Table SqlInstance, LoginName, LoginType, IsEnabled -AutoSize
Zusammenfassung über alle Instanzen
$all = Get-sqmSysadminAccounts -SqlInstance "SQL01","SQL02","SQL03" `
-ExcludeLogin "NT SERVICE\*","sqmsa" -ContinueOnError
$all | Group-Object SqlInstance | ForEach-Object {
$u = @($_.Group | Where-Object Status -eq 'Unexpected').Count
"$($_.Name): $($_.Count) gesamt, $u unerwartet$(if($u -gt 0){' ← PRÜFEN'})"
}
Invoke-sqmLoginAudit
Sicherheit
Umfassender Login-Audit: Policy-Verstöße (CHECK_POLICY/EXPIRATION/MUST_CHANGE), Kennwortalter, Inaktivität, doppelte SIDs, optionale AD-Orphan-Erkennung. Schreibt LoginAudit_*.txt und *.csv.
▶ 5 Beispiele anzeigen
Standard-Audit
Invoke-sqmLoginAudit -SqlInstance "SQL01"
Mit angepassten Schwellwerten
Invoke-sqmLoginAudit -SqlInstance "SQL01" ` -InactivityThresholdDays 60 ` -MaxPasswordAgeDays 90 ` -ExcludeLogin "NT SERVICE\*","SA"
Mit AD-Orphan-Prüfung (erfordert RSAT)
Invoke-sqmLoginAudit -SqlInstance "SQL01" -CheckAdOrphans -IncludeSystemLogins
Nur Policy-Verstöße filtern
$r = Invoke-sqmLoginAudit -SqlInstance "SQL01" -ExcludeLogin "NT SERVICE\*" $r | Where-Object Category -eq 'Policy' | Format-Table LoginName, Issue -AutoSize
Mehrere Instanzen parallel
"SQL01","SQL02","SQL03" | Invoke-sqmLoginAudit -ContinueOnError
Copy-sqmLogins
Sicherheit
Kopiert SQL- und Windows-Logins von einer Quellinstanz auf eine Zielinstanz inkl. Passwort-Hash (HASHED) und SID-Mapping. Prüft Windows-Logins gegen Active Directory (AD-Orphans werden übersprungen). Gleicht bei Bedarf den Auth-Modus an (Mixed/Windows). Repariert Orphaned-User auf allen Ziel-DBs. Deaktiviert/reaktiviert die konfigurierte Default-Policy via
finally-Block (idempotent).▶ 4 Beispiele anzeigen
Alle Logins kopieren
Copy-sqmLogins -SourceInstance "SQL01" -TargetInstance "SQL02"
Auth-Modus automatisch angleichen + Dienst neu starten
Copy-sqmLogins -SourceInstance "SQL01" -TargetInstance "SQL02" ` -AdjustAuthMode -RestartServiceIfRequired
Bestimmte Logins ausschließen
Copy-sqmLogins -SourceInstance "SQL01" -TargetInstance "SQL02" ` -ExcludeLogin "OldApp*","TestUser"
Mehrere Zielinstanzen
"SQL02","SQL03","SQL04" | ForEach-Object {
Copy-sqmLogins -SourceInstance "SQL01" -TargetInstance $_ -ContinueOnError
}
Get-sqmADAccountStatus
Sicherheit
AD-Status für SQL Service Accounts und Windows-Logins: Enabled, Locked, PasswordExpired, LastLogon.
▶ 2 Beispiele anzeigen
Status eines Service Accounts prüfen
Get-sqmADAccountStatus -SamAccountName "svc-sqlserver"
Set-sqmDatabaseOwner
Sicherheit
DB-Owner einheitlich auf
sa setzen. Systemdatenbanken übersprungen. Unterstützt -WhatIf.▶ 2 Beispiele anzeigen
Alle User-DBs auf sa setzen
Set-sqmDatabaseOwner -SqlInstance "SQL01" -All
🩺 Diagnose & Health
Get-sqmDatabaseHealth
Diagnose
Sammelbericht je Datenbank: Recovery-Modell, letzte DBCC CHECKDB, Backup-Zeiten (Full/Diff/Log), AutoGrowth-Ereignisse (Default Trace), VLF-Anzahl, Datenbankgröße, Status. Schreibt TXT + CSV.
▶ 4 Beispiele anzeigen
Standard-Health-Check
Get-sqmDatabaseHealth
Inkl. Systemdatenbanken
Get-sqmDatabaseHealth -SqlInstance "SQL01" -IncludeSystemDatabases -OutputPath "D:\Reports"
Datenbanken ohne aktuelles Backup finden
Get-sqmDatabaseHealth -SqlInstance "SQL01" |
Where-Object { $_.LastFullBackup -lt (Get-Date).AddDays(-2) } |
Select-Object DatabaseName, LastFullBackup, RecoveryModelHohe VLF-Anzahl identifizieren
Get-sqmDatabaseHealth -SqlInstance "SQL01" | Where-Object VlfCount -gt 1000 | Sort-Object VlfCount -Descending | Format-Table DatabaseName, VlfCount, LogSizeMB -AutoSize
Get-sqmSQLInstanceCheck
Diagnose
Best-Practice-Prüfungen: MAXDOP (kernbasierte Empfehlung), Max Server Memory, Cost Threshold for Parallelism (≥50), SA-Konto, xp_cmdshell, AutoGrowth-Einstellungen, TempDB-Dateien, Volume-Isolation, SQL-Version.
▶ 4 Beispiele anzeigen
Standard-Check lokale Instanz
Get-sqmSQLInstanceCheck
Detaillierter Report
Get-sqmSQLInstanceCheck -SqlInstance "SQL01\INSTANCE" -Detailed
Nur Warnungen anzeigen
Get-sqmSQLInstanceCheck -SqlInstance "SQL01" | Where-Object Status -in 'Warning','Critical' | Format-Table Check, CurrentValue, RecommendedValue, Status -AutoSize
Alle SQL-Instanzen in der Umgebung prüfen
"SQL01","SQL02","SQL03","SQL04" | ForEach-Object {
Get-sqmSQLInstanceCheck -SqlInstance $_ -ContinueOnError
} | Where-Object Status -eq 'Warning' | Format-Table SqlInstance, Check, CurrentValue
Get-sqmTempDbRecommendation
Performance
Analysiert TempDB-Konfiguration: Dateianzahl (CPU-Kerne, max 8), gleiche Größen, MB-basiertes AutoGrow, separate Laufwerke. Gibt strukturierte Empfehlungen zurück.
▶ 3 Beispiele anzeigen
TempDB-Analyse
Get-sqmTempDbRecommendation -SqlInstance "SQL01"
Nur Warnungen ausgeben
Get-sqmTempDbRecommendation -SqlInstance "SQL01" | Where-Object Status -ne 'OK' | Select-Object Status, Messages, Recommendations
Report in Datei schreiben
Get-sqmTempDbRecommendation -SqlInstance "SQL01" -OutputPath "D:\Reports"
Get-sqmDiskSpaceReport
Kapazität
Freier Speicherplatz aller SQL-relevanten Volumes via
sys.dm_os_volume_stats, AutoGrowth-Volumen (Default Trace), geschätzte Tage bis Erschöpfung, Warnung unter WarnThresholdPct.▶ 4 Beispiele anzeigen
Standard-Bericht
Get-sqmDiskSpaceReport
Mit angepasstem Warn-Schwellwert
Get-sqmDiskSpaceReport -SqlInstance "SQL01" -WarnThresholdPct 15 -OutputPath "D:\Reports"
Kritische Volumes hervorheben
Get-sqmDiskSpaceReport -SqlInstance "SQL01" | Where-Object Status -eq 'Warning' | Sort-Object DaysUntilFull | Format-Table VolumeName, FreeGB, DaysUntilFull, Status -AutoSize
Mehrere Instanzen täglich per Scheduled Task
"SQL01","SQL02","SQL03" | ForEach-Object {
Get-sqmDiskSpaceReport -SqlInstance $_ -WarnThresholdPct 10 -ContinueOnError
} | Where-Object Status -eq 'Warning' | Export-Csv "D:\Reports\DiskWarnings.csv" -NoTypeInformation
Get-sqmOperationStatus
Monitoring
Zeigt Fortschritt und geschätzte Restdauer aktiver Backup-, Restore- und AutoSeed-Operationen (
sys.dm_exec_requests, sys.dm_hadr_physical_seeding_stats).▶ 4 Beispiele anzeigen
Alle aktiven Operationen
Get-sqmOperationStatus
Nur AutoSeed-Vorgänge
Get-sqmOperationStatus -SqlInstance "SQL01" -OperationType AutoSeed
Live-Aktualisierung alle 10 Sekunden
Get-sqmOperationStatus -Continuous -RefreshSeconds 10
Backup-Fortschritt während Restore überwachen
while ($true) {
$ops = Get-sqmOperationStatus -SqlInstance "SQL01" -OperationType Restore
if (-not $ops) { Write-Host "Restore abgeschlossen."; break }
$ops | Format-Table Database, PercentComplete, EstimatedTimeRemaining -AutoSize
Start-Sleep 15
}
Get-sqmSpnReport
Diagnose
Prüft die gesetzten SPNs für alle SQL Server-Instanzen auf einem Computer. Ermittelt automatisch Dienstkonten und leitet daraus das AD-Konto ab. Prüft die vier erwarteten MSSQLSvc-SPNs (Hostname/FQDN mit Port bzw. Instanzname). Liefert fertige
setspn.exe-Kommandos für fehlende SPNs. Schreibt TXT + CSV ins OutputPath.▶ 4 Beispiele anzeigen
Lokalen Server prüfen
Get-sqmSpnReport
Remote-Server analysieren
Get-sqmSpnReport -ComputerName "SQL01" -OutputPath "D:\Reports"
Nur Standardinstanz prüfen
Get-sqmSpnReport -ComputerName "SQL01" -InstanceFilter "MSSQLSERVER"
Mehrere Server – fehlende SPNs zusammenfassen
"SQL01","SQL02","SQL03" | ForEach-Object {
Get-sqmSpnReport -ComputerName $_ -ContinueOnError
} | Where-Object Status -eq 'Missing' |
Select-Object ComputerName, InstanceName, SpnValue, SetSpnCommand |
Format-Table -AutoSize
Get-sqmConnectionStats
Diagnose
Analysiert aktive SQL Server Verbindungen und Verbindungsstatistiken. Liest
sys.dm_exec_sessions, sys.dm_exec_requests und sys.dm_exec_connections.
Gruppiert nach Application, Login, Host oder Database. Zeigt Verbindungsauslastung (% von max connections), aktive Requests, CPU-Nutzung, blockierte Sessions und aelteste Verbindungen.
Optionaler CSV-Export. System-Verbindungen optional einschliessbar.► 5 Beispiele anzeigen
Verbindungen nach Applikation gruppieren
Get-sqmConnectionStats -SqlInstance "SQL01"
Top-10 Login-Verbindungen
Get-sqmConnectionStats -SqlInstance "SQL01" -GroupBy Login -TopN 10
Verbindungen nach Datenbank inkl. System-Sessions
Get-sqmConnectionStats -SqlInstance "SQL01" -GroupBy Database -IncludeSystemConnections
Blockierte Sessions anzeigen
$stats = Get-sqmConnectionStats -SqlInstance "SQL01" $stats.Summary $stats.ActiveRequests | Where-Object BlockedBy -gt 0 | Format-Table
Mit CSV-Report
Get-sqmConnectionStats -SqlInstance "SQL01" -GroupBy Host -OutputPath "D:\Reports"
Get-sqmOrphanedFiles
Diagnose
Findet MDF/LDF/NDF-Datenbankdateien, die keiner Datenbank zugeordnet sind. Liest alle registrierten Pfade aus
sys.master_files und vergleicht diese mit den tatsaechlich vorhandenen Dateien im Dateisystem.
Suchverzeichnisse werden automatisch aus sys.master_files und den SQL-Registry-Standardpfaden ermittelt oder explizit angegeben.
Hinweis bei Remote-Instanzen: Dateisystemzugriff erfolgt vom lokalen Computer; UNC-Pfade empfohlen.► 4 Beispiele anzeigen
Lokale Instanz pruefen
Get-sqmOrphanedFiles -SqlInstance "SQL01"
Bestimmte Verzeichnisse rekursiv durchsuchen
Get-sqmOrphanedFiles -SqlInstance "SQL01" -SearchPath "D:\SQLData","E:\SQLLog" -Recurse
Remote-Instanz mit UNC-Pfad
Get-sqmOrphanedFiles -SqlInstance "SQL01" ` -SearchPath "\\SQL01\D$\SQLData","\\SQL01\E$\SQLLog"
Ergebnis auswerten und Groesse summieren
$orphans = Get-sqmOrphanedFiles -SqlInstance "SQL01" Write-Host "$($orphans.OrphanedFiles) verwaiste Dateien, $($orphans.TotalOrphanedMB) MB gesamt" $orphans.Files | Sort-Object SizeMB -Descending | Format-Table FileName, SizeMB, LastModified
Invoke-sqmPatchAnalysis
Diagnose
Analysiert den Patch-Stand von SQL Server Instanzen anhand einer eingebetteten Build-Referenztabelle (SQL 2016–2022, alle CUs).
Vergleicht die installierte Build-Nummer mit dem aktuell bekannten Stand und klassifiziert als:
UpToDate, MinorUpdate (1–2 Builds), MajorUpdate (3–4), Critical (5+ Builds zurueck).
Pipeline-faehig: mehrere Instanzen in einem Aufruf. Optionaler CSV-Export.► 5 Beispiele anzeigen
Lokale Instanz pruefen
Invoke-sqmPatchAnalysis
Mehrere Instanzen per Pipeline
"SQL01","SQL02","SQL03" | Invoke-sqmPatchAnalysis
Nur kritische Instanzen anzeigen
"SQL01","SQL02","SQL03" | Invoke-sqmPatchAnalysis |
Where-Object PatchStatus -in @('Critical','MajorUpdate') |
Select-Object SqlInstance, ProductVersion, LatestKnownLabel, BuildsBehind, PatchStatusMit Bericht-Export
Invoke-sqmPatchAnalysis -SqlInstance "SQL01" -OutputPath "D:\Reports"
Alle Instanzen aus einer Liste
Get-Content "C:\Scripts\sql-instances.txt" | Invoke-sqmPatchAnalysis -OutputPath "D:\Reports"
⚡ Performance
Get-sqmMissingIndexes
Performance
Fehlende Indizes aus dem DMV-Cache (
sys.dm_db_missing_index_details): Impact-Score, Tabelle, empfohlene Spalten.▶ 2 Beispiele anzeigen
Top-20 fehlende Indizes
Get-sqmMissingIndexes -SqlInstance "SQL01" -TopN 20
Get-sqmBlockingReport
Performance
Aktuelle Blockierungsketten aus DMVs: Lead-Blocker, wartende Sessions, SQL-Text, Wartezeiten.
▶ 2 Beispiele anzeigen
Aktuelle Blocking-Ketten
Get-sqmBlockingReport -SqlInstance "SQL01"
Get-sqmDeadlockReport
Performance
Deadlock-Ereignisse aus der System Health XEvent Session: Opfer, Ressource, SQL-Text, Zeitstempel.
▶ 2 Beispiele anzeigen
Alle Deadlocks der letzten Stunden
Get-sqmDeadlockReport -SqlInstance "SQL01"
Get-sqmLongRunningQueries
Performance
Lang laufende Queries aus
sys.dm_exec_requests: Session-ID, Laufzeit, CPU, Reads, Wait-Type, SQL-Text.▶ 2 Beispiele anzeigen
Queries ab 30 Sekunden
Get-sqmLongRunningQueries -SqlInstance "SQL01" -MinDurationSeconds 30
Get-sqmIndexFragmentation
Performance
Analysiert Index-Fragmentierung mit automatischer Empfehlung: 5–30 % → REORGANIZE, >30 % → REBUILD. Filterbar nach Datenbank, Tabelle, Mindest-Fragmentierung.
▶ 4 Beispiele anzeigen
Analyse einer Datenbank
Get-sqmIndexFragmentation -Database "AdventureWorks" -MinFragmentationPercent 10
Nur REBUILD-Kandidaten
Get-sqmIndexFragmentation -SqlInstance "SQL01" -Database "SalesDB" | Where-Object Recommendation -eq 'REBUILD' | Sort-Object FragmentationPercent -Descending | Select-Object TableName, IndexName, FragmentationPercent, Recommendation | Format-Table -AutoSize
Alle Datenbanken auf Instanz
Get-sqmIndexFragmentation -SqlInstance "SQL01" -All -MinFragmentationPercent 30
Bestimmte Tabelle analysieren
Get-sqmIndexFragmentation -SqlInstance "SQL01" -Database "Sales" -TableName "OrderDetails"
Invoke-sqmUpdateStatistics
Performance
UPDATE STATISTICS mit konfigurierbarem Sample-Prozentsatz, optional nur geänderte Statistiken. Einschränkbar auf Datenbank, Tabelle oder Statistik-Name.
▶ 3 Beispiele anzeigen
Datenbank mit 10 % Sample
Invoke-sqmUpdateStatistics -Database "SalesDB" -SamplePercent 10
Alle User-DBs, nur geänderte Statistiken
Invoke-sqmUpdateStatistics -SqlInstance "SQL01" -All -OnlyModified
FULLSCAN für kritische Tabelle
Invoke-sqmUpdateStatistics -SqlInstance "SQL01" -Database "Sales" ` -TableName "OrderDetails" -FullScan
Get-sqmAutoGrowthReport
Kapazität
Liest AutoGrowth-Ereignisse aus dem Default Trace. Zeigt Datenbank, Datei, Datum, Wachstum in MB. Hilft bei der Planung von Dateigrößen und Autogrow-Einstellungen.
▶ 3 Beispiele anzeigen
AutoGrowth-Bericht letzte 7 Tage
Get-sqmAutoGrowthReport -SqlInstance "SQL01" -HistoryDays 7
Häufigste AutoGrowth-Datenbanken
Get-sqmAutoGrowthReport -SqlInstance "SQL01" | Group-Object DatabaseName | Sort-Object Count -Descending | Select-Object Name, Count | Format-Table -AutoSize
Gesamtwachstum pro DB berechnen
Get-sqmAutoGrowthReport -SqlInstance "SQL01" |
Group-Object DatabaseName |
ForEach-Object { [PSCustomObject]@{
DB = $_.Name
GrowthMB = ($_.Group | Measure-Object GrowthMB -Sum).Sum
}} | Sort-Object GrowthMB -Descending
Invoke-sqmQueryStore
Performance
Umfassende Query Store Verwaltung fuer eine, mehrere oder alle Benutzerdatenbanken.
-Configure aktiviert/konfiguriert den Query Store (ALTER DATABASE SET QUERY_STORE).
-Query liest Top-N Queries nach Dauer, CPU, Reads oder Ausfuehrungsanzahl.
-Diagnose erkennt automatisch 5 Problemklassen: READ_ONLY-Status, Speicherdruck, Plan-Regression, Forced-Plan-Fehler, hohe Laufzeitvarianz.
Ohne Switch: Query + Diagnose (Report-Modus). Ergebnisse als CSV + TXT unter
OutputPath\QueryStore.► 5 Beispiele anzeigen
Report fuer alle Datenbanken (Query + Diagnose)
Invoke-sqmQueryStore -SqlInstance "SQL01" -All
Query Store konfigurieren und sofort abfragen
Invoke-sqmQueryStore -SqlInstance "SQL01" ` -Database "SalesDB","CRM" ` -Configure -Query -Diagnose ` -MaxStorageSizeMB 2000 -QueryCaptureMode AUTO
Top 50 Queries nach CPU, letzte 48 Stunden
Invoke-sqmQueryStore -SqlInstance "SQL01" ` -Database "SalesDB" -Query ` -TopN 50 -OrderBy CPU -LookbackHours 48
Diagnose mit niedrigem Speicher-Schwellwert
Invoke-sqmQueryStore -SqlInstance "SQL01" -All ` -Diagnose -StorageWarningPct 70 -OutputPath "D:\Reports\QS"
Query Store deaktivieren
Invoke-sqmQueryStore -SqlInstance "SQL01" ` -Database "OldDB" -Configure -OperationMode OFF
Invoke-sqmExtendedEvents
Performance
Verwaltet Extended Events Sessions fuer die Performance-Analyse vollstaendig per PowerShell.
-Create legt eine Session anhand eines Templates an (SlowQueries, Blocking, Waits, Deadlocks, AllInOne).
-Start / -Stop steuern die Session.
-Read liest Ereignisse aus RingBuffer oder XEL-Datei.
-Diagnose aggregiert: Top Slow Queries, Top Wait Types, Lock Contention, CXPACKET-Druck, Blocking-Ketten, Deadlocks (XML je Deadlock).
Ohne Switch: Read + Diagnose. Ergebnisse als CSV + TXT unter
OutputPath\XEvents.► 5 Beispiele anzeigen
AllInOne-Session erstellen und starten
Invoke-sqmExtendedEvents -SqlInstance "SQL01" -Create -Start
Nur Slow Queries > 2s in Datei aufzeichnen
Invoke-sqmExtendedEvents -SqlInstance "SQL01" ` -Template SlowQueries ` -SlowQueryThresholdMs 2000 ` -TargetType File -Create -Start
Session auslesen und Bericht erstellen
Invoke-sqmExtendedEvents -SqlInstance "SQL01" ` -Read -Diagnose -LookbackMinutes 60 -TopN 25
Deadlock-Trace einrichten
Invoke-sqmExtendedEvents -SqlInstance "SQL01" ` -SessionName "DeadlockCapture" ` -Template Deadlocks -TargetType File -Create -Start
Session stoppen und entfernen
Invoke-sqmExtendedEvents -SqlInstance "SQL01" -Stop -Drop
Get-sqmWaitStatistics
Performance
Liest und analysiert SQL Server Wait Statistics aus
sys.dm_os_wait_stats. Filtert automatisch 30+ Idle-Wait-Typen heraus.
Kategorisiert 25+ bekannte Wait Types (CPU, IO, Locking, Memory, Network, TempDB, Log, Parallelism ...) und liefert Handlungsempfehlungen.
Delta-Modus: Mit -SnapshotBefore und -SaveSnapshot lassen sich Intervall-Deltas berechnen - ideal zur Lastanalyse waehrend eines Fensters.
Optionaler CSV-Export.► 5 Beispiele anzeigen
Aktuelle Top-25 Wait Types
Get-sqmWaitStatistics -SqlInstance "SQL01"
Inkl. Idle-Waits (alle Wait Types)
Get-sqmWaitStatistics -SqlInstance "SQL01" -IncludeIdle -TopN 50
Delta-Messung ueber 5 Minuten
# Snapshot vorher $snap = Get-sqmWaitStatistics -SqlInstance "SQL01" -SaveSnapshot Start-Sleep 300 # Delta messen Get-sqmWaitStatistics -SqlInstance "SQL01" -SnapshotBefore $snap.Snapshot
Nur Locking- und IO-Waits filtern
Get-sqmWaitStatistics -SqlInstance "SQL01" |
Select-Object -ExpandProperty WaitStats |
Where-Object Category -in @('Locking','IO') |
Sort-Object WaitTimeSec -Descending | Format-TableMit CSV-Export
Get-sqmWaitStatistics -SqlInstance "SQL01" -OutputPath "D:\Reports"
Get-sqmPerfCounters
Performance
Liest die wichtigsten SQL Server Performance Counter aus
sys.dm_os_performance_counters:
Buffer Cache Hit Ratio, Page Life Expectancy, Batch Requests/sec, Kompilierungen, Lock Waits, Deadlocks, Speicher, Verbindungen, Scans und mehr.
Interpretiert Werte automatisch und kennzeichnet auffaellige Werte mit CRITICAL/WARNING-Markierungen.
Gibt ein Summary-Objekt mit den wichtigsten KPIs (PLE, BHR, User Connections, Anzahl Warnungen) zurueck.► 5 Beispiele anzeigen
Alle Key-Counter lesen
Get-sqmPerfCounters -SqlInstance "SQL01"
Nur Buffer- und Memory-Counter
Get-sqmPerfCounters -SqlInstance "SQL01" -Category "Buffer","Memory"
Nur Warnungen ausgeben
$perf = Get-sqmPerfCounters -SqlInstance "SQL01" $perf.Summary $perf.Counters | Where-Object Interpretation -ne '' | Format-Table CounterName, Value, Interpretation
PLE-Verlauf ueberwachen (Loop)
while ($true) {
$s = (Get-sqmPerfCounters -SqlInstance "SQL01").Summary
Write-Host "$(Get-Date -f HH:mm:ss) PLE=$($s.PageLifeExpectancy) BHR=$($s.BufferCacheHitRatioPct)% Conn=$($s.UserConnections)"
Start-Sleep 60
}Mit CSV-Export
Get-sqmPerfCounters -SqlInstance "SQL01" -OutputPath "D:\Reports"
Invoke-sqmPerfBaseline
Performance
Erfasst und vergleicht SQL Server Performance-Baselines. Drei Aktionen:
Capture speichert Wait Statistics + 15 Key-Perf-Counter als JSON-Snapshot.
Compare laedt zwei Snapshots und berechnet Deltas: WaitDeltas (sortiert nach DeltaWaitSec) und CounterDeltas (sortiert nach absoluter Aenderung) - ideal fuer Before/After-Vergleiche nach Patches, Konfigurationsaenderungen oder Lastprofil-Analysen.
List zeigt alle vorhandenen Baseline-Dateien mit Groesse und Zeitstempel.
► 5 Beispiele anzeigen
Baseline vor Aenderung erfassen
Invoke-sqmPerfBaseline -SqlInstance "SQL01" -Action Capture ` -BaselineName "BeforePatch" -OutputPath "D:\Baselines"
Baseline nach Aenderung erfassen
Invoke-sqmPerfBaseline -SqlInstance "SQL01" -Action Capture ` -BaselineName "AfterPatch" -OutputPath "D:\Baselines"
Zwei Baselines vergleichen
Invoke-sqmPerfBaseline -Action Compare ` -BaselineA "D:\Baselines\PerfBaseline_SQL01_..._BeforePatch.json" ` -BaselineB "D:\Baselines\PerfBaseline_SQL01_..._AfterPatch.json"
Alle Baselines auflisten
Invoke-sqmPerfBaseline -Action List -OutputPath "D:\Baselines"
Wait-Deltas nach Patch anzeigen
$cmp = Invoke-sqmPerfBaseline -Action Compare -BaselineA $fileA -BaselineB $fileB $cmp.WaitDeltas | Select-Object -First 10 | Format-Table WaitType, DeltaWaitSec, Category, Recommendation
🔧 Ola Hallengren Wartung
Install-sqmOlaMaintenanceSolution
Wartung
Lädt Ola Hallengrens Maintenance Solution von GitHub, extrahiert und führt in korrekter Reihenfolge aus: CommandExecute → CommandLog → DatabaseBackup → DatabaseIntegrityCheck → IndexOptimize. Erstellt nur Objekte, keine Jobs.
▶ 3 Beispiele anzeigen
Erstinstallation
Install-sqmOlaMaintenanceSolution -SqlInstance "SQL01"
Aktualisierung (bestehende Objekte überschreiben)
Install-sqmOlaMaintenanceSolution -SqlInstance "SQL01" -Force
Kompletter Wartungs-Onboarding-Stack
# 1. Ola installieren Install-sqmOlaMaintenanceSolution -SqlInstance "SQL01" # 2. Prüfen ob Installation ok Test-sqmOlaInstallation -SqlInstance "SQL01" # 3. Maintenance-Jobs anlegen New-sqmOlaMaintenanceJobs -SqlInstance "SQL01" -ScheduleTime "23:00" # 4. System-DB-Backup-Job anlegen New-sqmOlaSysDbBackupJob -SqlInstance "SQL01" -ScheduleTime "20:00"
New-sqmOlaMaintenanceJobs
Wartung
Erstellt IndexOptimize (User-DBs) und IntegrityCheck (User- und System-DBs) als SQL Agent Jobs. Job-Namen aus Modulkonfiguration. Optimierte Standardparameter (FillFactor 90, SortInTempdb Y, etc.).
▶ 4 Beispiele anzeigen
Standard-Jobs erstellen
New-sqmOlaMaintenanceJobs -SqlInstance "SQL01"
Mit angepassten Zeitplan und Operator
New-sqmOlaMaintenanceJobs -SqlInstance "SQL01" ` -ScheduleTime "22:00" -ScheduleDay 64 -OperatorName "DBAs"
Mit angepassten Fragmentierungsschwellen
New-sqmOlaMaintenanceJobs -SqlInstance "SQL01" ` -FragmentationLevel1 10 -FragmentationLevel2 40 ` -FillFactor 85 -MaxDOP 4
Vorhandene Jobs aktualisieren
New-sqmOlaMaintenanceJobs -SqlInstance "SQL01" -Update
New-sqmOlaSysDbBackupJob
Backup
Erstellt SQL Agent Job für tägliches Full-Backup der Systemdatenbanken (master, model, msdb) via Ola DatabaseBackup. Ablage in <BackupDirectory>\Sys-db.
▶ 2 Beispiele anzeigen
Standard-Job
New-sqmOlaSysDbBackupJob -SqlInstance "SQL01"
Mit Zeitplan und Operator
New-sqmOlaSysDbBackupJob -SqlInstance "SQL01" -ScheduleTime "20:00" -OperatorName "DBAs"
New-sqmOlaUsrDbBackupJob
Backup
Erstellt separate SQL Agent Jobs für FULL-, DIFF- und LOG-Backup der User-Datenbanken via Ola DatabaseBackup. Jeder Typ erhält einen eigenen Zeitplan mit konfigurierbaren Wochentagen (
-FullScheduleDays, -DiffScheduleDays, -LogScheduleDays) und Startzeit. Backup-Ziel: <BackupDirectory>\Usr-db. Job-Namen aus Modulkonfiguration (OlaJobNameFull / OlaJobNameDiff / OlaJobNameLog). Wochentage als Array; Kurzformen Weekdays, Weekend, EveryDay werden aufgelöst.▶ 4 Beispiele anzeigen
Nur FULL-Job (sonntags)
New-sqmOlaUsrDbBackupJob -SqlInstance "SQL01" -Full `
-FullScheduleDays @('Sunday') -FullScheduleTime "21:00"Alle drei Typen mit individuellem Zeitplan
New-sqmOlaUsrDbBackupJob -SqlInstance "SQL01" -Full -Diff -Log `
-FullScheduleDays @('Sunday') -FullScheduleTime "21:00" `
-DiffScheduleDays @('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday') `
-DiffScheduleTime "21:00" `
-LogScheduleDays @('EveryDay') -LogScheduleTime "00:00" `
-OperatorName "DBAs"LOG-Job für bestimmte Datenbanken
New-sqmOlaUsrDbBackupJob -SqlInstance "SQL01" -Log `
-Databases "SalesDB,HRDB" `
-LogScheduleDays @('EveryDay') -LogScheduleTime "00:30"Vorhandene Jobs aktualisieren
New-sqmOlaUsrDbBackupJob -SqlInstance "SQL01" -Full -Diff -Log -Update
Invoke-sqmFormatDrive64k
Wartung
Prüft ein NTFS-Laufwerk auf 64 KB-Allokationseinheit (Microsoft-Empfehlung für SQL Server-Datendateien) und formatiert es bei Bedarf. Ablauf: Sicherheitsprüfungen (kein C:, NTFS, eine Partition) → Daten per robocopy sichern → Format-Volume mit 65536 Byte Clustergröße → Daten zurückspielen → Backup bereinigen. Laufwerke die von einem Prozess geöffnet sind, werden abgelehnt. C: ist hartkodiert gesperrt.
▶ 3 Beispiele anzeigen
Prüfen und bei Bedarf formatieren
Invoke-sqmFormatDrive64k -DriveLetter D
Ohne Bestätigung, abweichender Backup-Pfad
Invoke-sqmFormatDrive64k -DriveLetter E -BackupPath "C:\Backup\DriveTemp" -Force
Testlauf ohne Änderungen (WhatIf)
Invoke-sqmFormatDrive64k -DriveLetter D -WhatIf
Test-sqmSQLFirewall
Diagnose
Testet TCP-Erreichbarkeit des SQL Servers durch Firewall und Netzwerk. Standard: Port 1433. Für benannte Instanzen wird der dynamische TCP-Port via SQL Browser (UDP 1434) ermittelt. Gibt je Server ein Objekt mit
TcpReachable, DynamicPort, Status (OK / Failed / Error) und Detailmeldung zurück. Pipeline-fähig für mehrere Server.▶ 3 Beispiele anzeigen
Standardinstanz testen (Port 1433)
Test-sqmSQLFirewall -Server "SQL01"
Benannte Instanz – Port via SQL Browser
Test-sqmSQLFirewall -Server "SQL01" -Instance "SAGE"
Mehrere Server per Pipeline
"SQL01","SQL02","SQL03" | Test-sqmSQLFirewall -Instance "PROD" -TimeoutSeconds 3 | Format-Table Server, Port, TcpReachable, Status -AutoSize
Test-sqmOlaInstallation
Diagnose
Prüft ob Ola Hallengrens Maintenance Solution installiert ist (DatabaseBackup, CommandLog, DatabaseIntegrityCheck, IndexOptimize).
▶ 2 Beispiele anzeigen
Prüfung
Test-sqmOlaInstallation -SqlInstance "SQL01"
Als Bedingung in einem Skript
if (-not (Test-sqmOlaInstallation -SqlInstance "SQL01")) {
Install-sqmOlaMaintenanceSolution -SqlInstance "SQL01"
}⚙️ Konfiguration
Get-sqmConfig
Konfiguration
Liest die Modulkonfiguration (LogPath, OutputPath, CentralPath, Ola-Job-Namen, TSM-Management-Klassen). Ohne Parameter: komplette Hashtable. Mit
-Key: einzelner Wert.▶ 3 Beispiele anzeigen
Gesamte Konfiguration ausgeben
Get-sqmConfig
Einzelnen Wert lesen
Get-sqmConfig -Key 'OutputPath' Get-sqmConfig -Key 'LogPath'
In Skript verwenden
$outPath = Get-sqmConfig -Key 'OutputPath' $report = Get-sqmDatabaseHealth -SqlInstance "SQL01" -OutputPath $outPath
Set-sqmConfig
Konfiguration
Setzt Konfigurationswerte dauerhaft (
%APPDATA%\MSSQLTools\config.json). Pfade werden geprüft und erstellt.▶ 4 Beispiele anzeigen
Pfade setzen
Set-sqmConfig -LogPath "D:\Logs\SQL" -OutputPath "D:\Reports\SQL" -CentralPath "\\Fileserver\SQL"
Ola-Job-Namen anpassen
Set-sqmConfig -OlaJobNameFull "PROD-FULL" -OlaJobNameIndexOpt "PROD-IndexOpt"
TSM-Management-Klassen setzen
Set-sqmConfig -TsmManagementClasses @('MC_10','MC_30','MC_100')Auto-Update deaktivieren
Set-sqmConfig -AutoUpdate $false
Compare-sqmServerConfiguration
Konfiguration
Vergleicht sp_configure, Instanz-Eigenschaften (Collation, Version, MaxMemory) und optional Datenbank-Einstellungen zweier SQL Server-Instanzen. Ausgabe mit Alt/Neu-Werten.
▶ 3 Beispiele anzeigen
Zwei Server vergleichen
Compare-sqmServerConfiguration -SourceInstance "SQL01" -TargetInstance "SQL02"
Nur Unterschiede anzeigen
Compare-sqmServerConfiguration -SourceInstance "SQL01" -TargetInstance "SQL02" |
Where-Object { $_.SourceValue -ne $_.TargetValue } |
Format-Table Setting, SourceValue, TargetValue -AutoSizeTemplate-Server als Referenz für alle Instanzen
$targets = "SQL02","SQL03","SQL04"
$targets | ForEach-Object {
$diffs = Compare-sqmServerConfiguration -SourceInstance "SQL01" -TargetInstance $_ |
Where-Object { $_.SourceValue -ne $_.TargetValue }
if ($diffs) { Write-Host "$_ hat $($diffs.Count) Abweichungen"; $diffs | Format-Table }
}
Invoke-sqmCollationChange
Konfiguration
Ändert die Server-Collation via
sqlservr.exe -m -T4022 -T3659 -q. Nur für lokale Standalone-Instanzen. 9-Schritt-Prozess inkl. Pre-Flight, optionales Backup, Stopp/Start-Dienst, Verifikation.▶ 3 Beispiele anzeigen
Collation ändern
Invoke-sqmCollationChange -NewCollation "Latin1_General_CI_AS"
Mit Backup vorher und User-DBs anpassen
Invoke-sqmCollationChange -SqlInstance "SQL01\INST2" ` -NewCollation "German_CI_AS" ` -IncludeUserDatabases ` -BackupBeforeChange
Invoke-sqmSetDatabaseRecoveryMode
Konfiguration
Setzt Recovery-Modus (Simple/Full/BulkLogged) für alle oder ausgewählte Benutzerdatenbanken. Systemdatenbanken werden automatisch ausgeschlossen.
▶ 3 Beispiele anzeigen
Alle User-DBs auf Full
Invoke-sqmSetDatabaseRecoveryMode -All -RecoveryMode Full
Einzelne DB auf Simple
Invoke-sqmSetDatabaseRecoveryMode -Database "SalesDB" -RecoveryMode Simple -Confirm
Mehrere DBs per Pipeline
"DB1","DB2","DB3" | ForEach-Object {
Invoke-sqmSetDatabaseRecoveryMode -SqlInstance "SQL01" -Database $_ -RecoveryMode Full
}
Get-sqmServerSetting
Konfiguration
Liest Server-Properties via SMO. Mit
-Name einzelne Eigenschaft, mit -All alle Eigenschaften.▶ 3 Beispiele anzeigen
BackupDirectory lesen
$backupPath = Get-sqmServerSetting -Name "BackupDirectory"
Alle Eigenschaften ausgeben
Get-sqmServerSetting -All
Remote-Instanz mit SQL-Auth
$cred = Get-Credential Get-sqmServerSetting -SqlInstance "SQL01" -SqlCredential $cred -All
📋 Inventar & Suche
Invoke-sqmInstanceInventory
Inventar
Vollständige Inventarisierung: Instanz-Info, Datenbanken, Logins, Linked Server, SQL Agent Jobs, AlwaysOn-Konfiguration. Ausgabe als TXT + CSV. Optional Kopie in CentralPath.
▶ 3 Beispiele anzeigen
Lokale Instanz inventarisieren
Invoke-sqmInstanceInventory
Mehrere Instanzen mit Fehlertoleranz
Invoke-sqmInstanceInventory -SqlInstance "SQL01","SQL02","SQL03" -ContinueOnError
Als monatlicher Scheduled Task
# Alle SQL-Instanzen in der Umgebung inventarisieren $instances = Get-Content "C:\Admin\sql_instances.txt" Invoke-sqmInstanceInventory -SqlInstance $instances -ContinueOnError # Ergebnis liegt in $OutputPath\InstanceInventory_*.txt
Export-sqmDatabaseDocumentation
Inventar
HTML- und CSV-Dokumentation aller Datenbanken: Tabellen, Indizes, Views, SPs, Recovery-Modell, Größe.
▶ 2 Beispiele anzeigen
Dokumentation erstellen
Export-sqmDatabaseDocumentation -SqlInstance "SQL01" -OutputPath "D:\Reports"
Find-sqmDatabaseObject
Inventar
Durchsucht alle (oder ausgewählte) Datenbanken nach Tabellen, Sichten, Prozeduren, Funktionen, Triggern, Synonymen. Wildcard-Suche, optional auch SQL-Text-Suche.
▶ 4 Beispiele anzeigen
Prozedur suchen
Find-sqmDatabaseObject -SqlInstance "SQL01" -ObjectName "sp_GetOrders"
Wildcard-Suche in bestimmten DBs
Find-sqmDatabaseObject -SqlInstance "SQL01" -ObjectName "*log*" ` -ObjectType "TABLE","VIEW" -Database "Sales*"
Objekte nach Text im SQL-Body suchen
Find-sqmDatabaseObject -SqlInstance "SQL01" -ObjectName "*" ` -SearchInDefinition -SearchText "OPENQUERY" | Format-Table Database, Schema, ObjectType, ObjectName -AutoSize
Alle Trigger finden
Find-sqmDatabaseObject -SqlInstance "SQL01" -ObjectName "*" -ObjectType "TRIGGER" | Group-Object Database | Select-Object Name, Count
Get-sqmLinkedServerUsage
Inventar
Analysiert welche Prozeduren, Funktionen, Sichten, Trigger und SQL Agent Jobs auf Linked Server zugreifen. Durchsucht Definitionen aller Benutzerdatenbanken.
▶ 3 Beispiele anzeigen
Nutzung eines Linked Servers ermitteln
Get-sqmLinkedServerUsage -SqlInstance "SQL01" -LinkedServer "PROD_SRV"
Alle Linked Server in Verwendung
Get-sqmLinkedServerUsage -SqlInstance "SQL01" | Group-Object LinkedServer | Select-Object Name, Count | Sort-Object Count -Descending
Vor Abschaltung eines Linked Servers prüfen
$usage = Get-sqmLinkedServerUsage -SqlInstance "SQL01" -LinkedServer "OLD_SRV"
if ($usage) {
Write-Warning "Linked Server wird noch verwendet!"
$usage | Format-Table Database, Schema, ObjectType, ObjectName -AutoSize
} else {
Write-Host "Linked Server kann sicher entfernt werden."
}
Get-sqmAgentJobHistory
Monitoring
Ausführungshistorie aller oder ausgewählter SQL Agent Jobs. Filter nach Jobnamen (Wildcard), Status (Erfolg/Fehler) und Zeitraum. Standard: letzte 7 Tage.
▶ 4 Beispiele anzeigen
Alle Job-Historien letzte 7 Tage
Get-sqmAgentJobHistory
Nur fehlgeschlagene Backup-Jobs heute
Get-sqmAgentJobHistory -JobName '*Backup*' -Status Failure ` -Since (Get-Date).AddDays(-1) | Format-Table JobName, RunDate, RunDuration, Message -AutoSize
Laufzeit-Statistik pro Job
Get-sqmAgentJobHistory -SqlInstance "SQL01" -Since (Get-Date).AddDays(-30) |
Group-Object JobName | ForEach-Object {
$ok = @($_.Group | Where RunStatus -eq 'Success').Count
$fail = @($_.Group | Where RunStatus -eq 'Failure').Count
[PSCustomObject]@{ Job = $_.Name; Erfolg = $ok; Fehler = $fail }
} | Sort-Object Fehler -DescendingBestimmten Job überwachen
Get-sqmAgentJobHistory -SqlInstance "SQL01" -JobName "FITS-SystemDatabases-FULL" | Select-Object -First 10 | Format-Table -AutoSize
🖥️ Cluster & Dienste
Get-sqmClusterInfo
Diagnose
Clustername, Knoten-Liste, Rollen inkl. IP-Adressen. Standardmäßig ohne Core-Cluster-Gruppe und Available Storage. Installiert RSAT-Clustering-Tools bei Bedarf automatisch.
▶ 3 Beispiele anzeigen
Cluster-Info abrufen
$info = Get-sqmClusterInfo -ClusterName "MEINCLUSTER" $info.Nodes | Format-Table $info.Roles | Where-Object OwnerNode -eq "SQL01" | Select-Object Name, IPAddresses
Inkl. Core-Gruppe
Get-sqmClusterInfo -IncludeCoreGroup
Fehlerbehandlung
$info = Get-sqmClusterInfo -ClusterName "MEINCLUSTER"
if (-not $info.Success) { Write-Error $info.ErrorMessage; return }
Install-sqmSsrsReportServer
Konfiguration
SSRS 2022 unattended installieren. Pfad über
Set-sqmConfig -SsrsInstallerPath voreinstellbar.▶ 2 Beispiele anzeigen
Mit vorkonfiguriertem Installer-Pfad
Set-sqmConfig -SsrsInstallerPath '\\srv-share\Software\SSRS2022\SQLServerReportingServices.exe' Install-sqmSsrsReportServer
Set-sqmSsrsConfiguration
Konfiguration
Vollautomatische SSRS-Konfiguration (lokal/remote, Native Mode, AlwaysOn). Dienstkonto, Datenbank, URLs, Verschlüsselungsschlüssel. Bei AG: DB-Erstellung auf Primary, Verbindung auf Listener.
▶ 3 Beispiele anzeigen
Lokale Standardkonfiguration
Set-sqmSsrsConfiguration
Remote mit AG-Listener
Set-sqmSsrsConfiguration -ComputerName "SSRS01" -DatabaseServer "AG_Listener"
Testlauf
Set-sqmSsrsConfiguration -ComputerName "SSRS01" -WhatIf
Invoke-sqmSsisConfiguration
Konfiguration
Vollautomatische SSIS-Konfiguration: Dienst, SSISDB-Katalog, AlwaysOn AG-Integration (SSISDB in AG, DMK-Restore, Cleanup-Job deaktivieren, sp_ssis_startup), Katalog-Ordner.
▶ 2 Beispiele anzeigen
Standalone-Konfiguration
$pwd = Read-Host "SSISDB-Kennwort" -AsSecureString Invoke-sqmSsisConfiguration -SqlInstance "SQL01" -CatalogPassword $pwd
Mit AG-Integration
$pwd = Read-Host "SSISDB-Kennwort" -AsSecureString Invoke-sqmSsisConfiguration -SqlInstance "SQL01" -AgName "AG_SSIS" -CatalogPassword $pwd
Test-sqmSsasDirectoryPermissions
Diagnose
Prüft und korrigiert NTFS-Berechtigungen für SSAS-Verzeichnisse (Data, Log, Temp, Backup) via Registry-Pfaderkennung. Idempotent.
▶ 2 Beispiele anzeigen
Standard-Instanz prüfen und korrigieren
Test-sqmSsasDirectoryPermissions
Benannte Instanz, WhatIf
Test-sqmSsasDirectoryPermissions -InstanceName "SSAS2019" -WhatIf
🔐 Zertifikate
Get-sqmCertificateReport
Sicherheit
SQL Server-Zertifikate: Ablaufdatum, Aussteller, Verwendungszweck. Warnung bei Ablauf in unter 90 Tagen.
▶ 2 Beispiele anzeigen
Alle Zertifikate anzeigen
Get-sqmCertificateReport -SqlInstance "SQL01"
Install-sqmCertificate
Sicherheit
Zertifikat (selbstsigniert oder CA) für SQL Server TLS installieren. Setzt Registry-Key, Dienst-Neustart optional.
▶ 2 Beispiele anzeigen
Zertifikat von Pfad installieren
Install-sqmCertificate -SqlInstance "SQL01" -CertificatePath "C:\Certs\SQL01.pfx" -CertPassword $cred
New-sqmCertificateRequest
Sicherheit
CSR und Bestelldatenblatt für ein SQL Server TLS-Zertifikat erstellen (INF + CSR für die CA-Einreichung).
▶ 2 Beispiele anzeigen
CSR für SQL01 erstellen
New-sqmCertificateRequest -SqlInstance "SQL01" -OutputPath "C:\Certs"
New-sqmSqlCertificate
Sicherheit
Selbstsigniertes SQL Server-Zertifikat erneuern: Subject/SAN des bestehenden übernehmen, neue Laufzeit.
▶ 2 Beispiele anzeigen
Zertifikat erneuern (5 Jahre)
New-sqmSqlCertificate -SqlInstance "SQL01" -ValidityYears 5
📼 TSM / IBM Spectrum Protect
Invoke-sqmTsmConfiguration
TSM
Konfiguriert dsm.opt: EXCLUDE für *.mdf/*.ndf/*.ldf, INCLUDE für Backup-Verzeichnisse, MANAGEMENTCLASS für Backup-Dateien. Automatisches Backup (dsm.opt.bak). Block begrenzt durch dtcSqlTools-Marker.
▶ 3 Beispiele anzeigen
Standard-Konfiguration
Invoke-sqmTsmConfiguration -ManagementClass MC_B_NL.NL_42.42.NA
Remote-Server mit UseDiff
Invoke-sqmTsmConfiguration -ComputerName "SQL01" -UseDiff
Mit zusätzlichen Pfaden
Invoke-sqmTsmConfiguration -ComputerName "SQL01" -AdditionalIncludePaths "E:\Archive","F:\ExtraBackup"
Get-sqmTsmConfiguration
TSM
Liest die aktuelle TSM-Konfiguration aus dsm.opt und gibt die relevanten Einträge zurück.
▶ 2 Beispiele anzeigen
Konfiguration lesen
Get-sqmTsmConfiguration
Remote-Server
Get-sqmTsmConfiguration -ComputerName "SQL01"
Test-sqmTsmConnection
TSM
Testet die Verbindung zum TSM-Server via dsmc-Kommando. Gibt Verbindungsstatus und Server-Version zurück.
▶ 2 Beispiele anzeigen
Verbindungstest
Test-sqmTsmConnection
Remote mit Fehlertoleranz
Test-sqmTsmConnection -ComputerName "SQL01" -ContinueOnError
📊 Splunk
Invoke-sqmSplunkConfiguration
Monitoring
Konfiguriert den Splunk Universal Forwarder (lokal, Remote via AD-OU, WhatIf).
Lokal
Invoke-sqmSplunkConfiguration
🔹 Sonstige
Set-sqmSqlPolicyState
Konfiguration
Aktiviert oder deaktiviert eine einzelne PBM-Policy via dbatools (Get-DbaPbmPolicy). Ändert nur die explizit benannte Policy, nicht den globalen PBM-Engine-Zustand.
▶ 3 Beispiele anzeigen
Policy deaktivieren
Set-sqmSqlPolicyState -SqlInstance "SQL01" -Policy "xp_cmdshell must be disabled" -State Disable
Policy auf mehreren Instanzen aktivieren
"SQL01","SQL02" | Set-sqmSqlPolicyState -Policy "Password Policy" -State Enable
Vor Restore deaktivieren, danach reaktivieren
Set-sqmSqlPolicyState -SqlInstance "SQL01" -Policy "DefaultPolicy" -State Disable Invoke-sqmRestoreDatabase -SqlInstance "SQL01" -BackupFile "D:\Backup\DB.bak" -DatabaseName "DB" Set-sqmSqlPolicyState -SqlInstance "SQL01" -Policy "DefaultPolicy" -State Enable
Invoke-sqmMonitoringKey
Monitoring
Erstellt oder erneuert den Monitoring-Schlüssel für externe Überwachungstools (z. B. Zabbix, PRTG). Legt SQL-Login mit minimalen Rechten an.
▶ 2 Beispiele anzeigen
Standard-Monitoring-Key erstellen
Invoke-sqmMonitoringKey -SqlInstance "SQL01"
Mehrere Instanzen
"SQL01","SQL02","SQL03" | ForEach-Object {
Invoke-sqmMonitoringKey -SqlInstance $_ -ContinueOnError
}
Copy-sqmToCentralPath
Sonstige
Kopiert Report-Dateien aus dem lokalen OutputPath in den konfigurierten CentralPath (z. B. Fileserver-Share). Wird von anderen Funktionen intern genutzt.
▶ 2 Beispiele anzeigen
Alle Reports kopieren
Copy-sqmToCentralPath
Explizite Quelle und Ziel
Copy-sqmToCentralPath -SourcePath "D:\Reports" -CentralPath "\\Fileserver\SQL\Reports"
Install-sqmAdModule
Sonstige
Stellt sicher, dass das ActiveDirectory PowerShell-Modul (RSAT) installiert ist. Fallback-Kette: (1)
Add-WindowsCapability, (2) Install-WindowsFeature, (3) dism.exe, (4) PSGallery. Erfordert lokale Administratorrechte. Wird automatisch von Copy-sqmLogins und Invoke-sqmLoginAudit aufgerufen wenn das AD-Modul fehlt.▶ 3 Beispiele anzeigen
AD-Modul sicherstellen (Standard)
Install-sqmAdModule
Re-Import erzwingen
Install-sqmAdModule -SkipIfPresent $false
Als Bedingung vor AD-abhängigen Operationen
if (-not (Install-sqmAdModule -ContinueOnError)) {
Write-Warning "AD-Modul nicht verfügbar – Windows-Login-Prüfung wird übersprungen"
}
Get-sqmHpuAllowGroup
Sonstige
HPU-Allow-Gruppe per Domain-Mapping ermitteln (
Set-sqmConfig -HpuDomainGroupMap). Intern von Audit- und Login-Funktionen genutzt.▶ 2 Beispiele anzeigen
HPU-Gruppe für einen Server ermitteln
Get-sqmHpuAllowGroup -ServerFqdn "SQL01.bayernlb.sfinance.net"
🚀 Quick Start
📁 Modulpfad: Das sqmSQLTool-Modul sollte im PowerShell-Standardmodulverzeichnis abgelegt werden, damit es automatisch erkannt wird und kein manueller Pfad beim Import angegeben werden muss.
1
Modul im richtigen Verzeichnis ablegen
# Empfohlener Zielpfad (systemweit, alle Benutzer): C:\Program Files\WindowsPowerShell\Modules\sqmSQLTool\ # Alternativ: nur fuer den aktuellen Benutzer $env:USERPROFILE\Documents\WindowsPowerShell\Modules\sqmSQLTool\ # Alle konfigurierten Modulpfade anzeigen $env:PSModulePath -split ';' # Modul-Verzeichnis anlegen und Dateien kopieren $target = "C:\Program Files\WindowsPowerShell\Modules\sqmSQLTool" Copy-Item -Path "C:\CCM\sqmSQLTool" -Destination $target -Recurse -Force # Nach korrekter Ablage genuegt ein einfaches: Import-Module sqmSQLTool
Nach der Ablage im Standardpfad wird das Modul bei
Import-Module sqmSQLTool automatisch gefunden.
PowerShell Studio und ISE erkennen es zudem per Auto-Completion ohne weiteres Zutun.
2
Voraussetzungen installieren
# dbatools installieren (falls noch nicht vorhanden) Install-Module dbatools -Scope CurrentUser -Force # sqmSQLTool-Modul laden Import-Module "C:\Pfad\zum\sqmSQLTool\sqmSQLTool.psd1"
3
Konfiguration setzen
Set-sqmConfig ` -LogPath "C:\System\WinSrvLog\MSSQL" ` -OutputPath "C:\System\WinSrvLog\MSSQL" ` -CentralPath "\\Fileserver\SQL\Reports" # Konfiguration prüfen Get-sqmConfig
4
Erstes Health-Dashboard
$instance = "SQL01" # Anpassen! Write-Host "=== Instance Check ===" -ForegroundColor Cyan Get-sqmSQLInstanceCheck -SqlInstance $instance | Where-Object Status -ne 'OK' | Format-Table Check, CurrentValue, Status Write-Host "=== Database Health ===" -ForegroundColor Cyan Get-sqmDatabaseHealth -SqlInstance $instance | Select-Object DatabaseName, Status, RecoveryModel, LastFullBackup, VlfCount | Format-Table -AutoSize Write-Host "=== Disk Space ===" -ForegroundColor Cyan Get-sqmDiskSpaceReport -SqlInstance $instance | Format-Table VolumeName, FreeGB, DaysUntilFull, Status -AutoSize
5
Ola Hallengren Wartung einrichten (New Server Onboarding)
$instance = "SQL01"
# Schritt 1: Ola installieren
Install-sqmOlaMaintenanceSolution -SqlInstance $instance
# Schritt 2: Installation prüfen
Test-sqmOlaInstallation -SqlInstance $instance
# Schritt 3: Index + Integrity Jobs anlegen
New-sqmOlaMaintenanceJobs -SqlInstance $instance -ScheduleTime "23:00" -OperatorName "DBAs"
# Schritt 4: System-DB-Backup-Job
New-sqmOlaSysDbBackupJob -SqlInstance $instance -ScheduleTime "20:00" -OperatorName "DBAs"
# Schritt 5: User-DB-Backup-Jobs (FULL/DIFF/LOG)
New-sqmOlaUsrDbBackupJob -SqlInstance $instance -Full -Diff -Log `
-FullScheduleDays @('Sunday') -FullScheduleTime "21:00" `
-DiffScheduleDays @('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday') `
-DiffScheduleTime "21:00" `
-LogScheduleDays @('EveryDay') -LogScheduleTime "00:00" `
-OperatorName "DBAs"6
Security Hardening (SA-Konto, Sysadmin-Audit)
$instance = "SQL01" # SA-Konto verschleiern $r = Invoke-sqmSaObfuscation -SqlInstance $instance Write-Host "Neuer SA-Name: $($r.NewLoginName)" $r.GeneratedPassword | Out-File "C:\Secure\sa_pw_$(Get-Date -f 'yyyyMMdd').txt" # Sysadmin-Audit Get-sqmSysadminAccounts -SqlInstance $instance -ExcludeSysAccounts | Where-Object Status -eq 'Unexpected' | Format-Table LoginName, LoginType
7
AlwaysOn AG – Datenbank hinzufügen & Nodes synchronisieren
$instance = "SQL01" $ag = "AG_Prod" # Datenbank hinzufügen Invoke-sqmAddDatabaseToAvailabilityGroup -SqlInstance $instance ` -AvailabilityGroup $ag -Database "NeueDB" # AG-Nodes synchronisieren (Logins, Jobs, Linked Server) Sync-sqmAgNode -SqlInstance $instance -AvailabilityGroup $ag # Health-Report prüfen Get-sqmAgHealthReport -SqlInstance $instance | Where-Object OverallStatus -ne 'Healthy' | Format-Table -AutoSize
⚙️ Modul-Konfiguration
Die Konfiguration wird dauerhaft als JSON im Benutzerprofil gespeichert (
%APPDATA%\MSSQLTools\config.json) und beim Modulimport automatisch geladen. Änderungen greifen sofort — kein Neuimport nötig.
Konfigurationsschlüssel
| Schlüssel | Standard | Beschreibung |
|---|---|---|
LogPath | C:\System\WinSrvLog\MSSQL | Pfad für Log-Dateien |
OutputPath | C:\System\WinSrvLog\MSSQL | Pfad für Report-Ausgaben (TXT/CSV) |
CentralPath | C:\System\WinSrvLog\MSSQL | Zentraler Pfad (z. B. Fileserver) |
OlaJobNameFull | FITS-UserDatabases-FULL | Job-Name für Ola Full-Backup |
OlaJobNameDiff | FITS-UserDatabases-DIFF | Job-Name für Ola Diff-Backup |
OlaJobNameLog | FITS-UserDatabases-LOG | Job-Name für Ola Log-Backup |
OlaJobNameIndexOpt | FITS-UserDatabases-IndexOptimize | Job-Name für Ola IndexOptimize |
OlaJobNameIntUserDb | FITS-UserDatabases-IntegrityCheck | Job-Name für Ola IntegrityCheck User |
OlaJobNameIntSysDb | FITS-SystemDatabases-IntegrityCheck | Job-Name für Ola IntegrityCheck System |
OlaJobNameSysDbBackup | FITS-SystemDatabases-FULL | Job-Name für System-DB-Backup |
TsmManagementClasses | [] | TSM Management-Klassen-Liste |
HpuDomainGroupMap | [] | Domain→Gruppen-Mapping für Get-sqmHpuAllowGroup |
SsrsInstallerPath | "" | Pfad zur SSRS-Installationsdatei für Install-sqmSsrsReportServer. |
AutoUpdate | $false | Automatisches Modul-Update beim Import |
UpdateRepository | "" | PSRepository-Name für Auto-Update |
DefaultPolicy | "" | PBM-Policy die bei Restore temp. deaktiviert wird |
Language | de-DE | Ausgabe-Sprache. de-DE (Standard) · en-US. |
Beispiel-Konfiguration
# Komplette Initialkonfiguration für Produktivumgebung
Set-sqmConfig `
-LogPath "D:\Logs\SQL" `
-OutputPath "D:\Reports\SQL" `
-CentralPath "\\Fileserver01\SQL\Reports" `
-OlaJobNameFull "PROD-UserDB-FULL" `
-OlaJobNameIndexOpt "PROD-UserDB-IndexOpt" `
-OlaJobNameSysDbBackup "PROD-SysDB-FULL" `
-TsmManagementClasses @('MC_B_NL.NL_42.42.NA') `
-SsrsInstallerPath '\\srv-share\Software\SSRS2022\SQLServerReportingServices.exe' `
-DefaultPolicy "DBA-StandardPolicy" `
-Language de-DE `
-AutoUpdate $false
Hinweis: Pfade werden beim Setzen auf Existenz und Schreibrecht geprüft. Nicht vorhandene Verzeichnisse werden automatisch erstellt. Bei fehlenden Schreibrechten wird eine Fehlermeldung ausgegeben und der Wert nicht gesetzt.
Spracheinstellungen
Lokalisierung:
de-DE (Standard) · en-US. Sprachdateien: Private\Strings\{lang}.psd1.Set-sqmConfig -Language en-US Set-sqmConfig -Language de-DE