dtcSoftware - SQLBlog
  1. Aktuelle Seite:  
  2. Startseite

mssSQLTool – PowerShell SQL Admin Toolset

🛢 mssSQLTool

PowerShell SQL Admin Toolset · dtcSoftware · Janke

v 1.0.0 PowerShell 5.1+ dbatools required 74 Funktionen MS SQL Server
📖 Referenz
🚀 Quick Start
⚙️ Konfiguration
🔄 AlwaysOn8
  • Invoke-mssAddDatabaseToAG
  • Invoke-mssRemoveDatabaseFromAG
  • Invoke-mssSqlAlwaysOnAutoseeding
  • Get-mssAgHealthReport
  • Sync-mssAgNode
  • Repair-mssAlwaysOnDatabases
  • New-mssAlwaysOnRepairJob
  • Invoke-mssFailover
💾 Backup & Restore4
  • Invoke-mssUserDatabaseBackup
  • Invoke-mssRestoreDatabase
  • Test-mssBackupIntegrity
  • Invoke-mssLogShrink
🔒 Sicherheit7
  • Invoke-mssSaObfuscation
  • Invoke-mssRenameSaAccount
  • Get-mssSysadminAccounts
  • Invoke-mssLoginAudit
  • Copy-mssLogins
  • Get-mssADAccountStatus
  • Set-mssDatabaseOwner
🩺 Diagnose & Health9
  • Get-mssDatabaseHealth
  • Get-mssSQLInstanceCheck
  • Get-mssTempDbRecommendation
  • Get-mssDiskSpaceReport
  • Get-mssOperationStatus
  • Get-mssSpnReport
  • Get-mssConnectionStats
  • Get-mssOrphanedFiles
  • Invoke-mssPatchAnalysis
⚡ Performance12
  • Get-mssIndexFragmentation
  • Get-mssMissingIndexes
  • Get-mssBlockingReport
  • Get-mssDeadlockReport
  • Get-mssLongRunningQueries
  • Invoke-mssUpdateStatistics
  • Get-mssAutoGrowthReport
  • Invoke-mssQueryStore
  • Invoke-mssExtendedEvents
  • Get-mssWaitStatistics
  • Get-mssPerfCounters
  • Invoke-mssPerfBaseline
🔧 Ola-Wartung7
  • Install-mssOlaMaintenanceSolution
  • New-mssOlaMaintenanceJobs
  • New-mssOlaSysDbBackupJob
  • New-mssOlaUsrDbBackupJob
  • Invoke-mssFormatDrive64k
  • Test-mssSQLFirewall
  • Test-mssOlaInstallation
⚙️ Konfiguration6
  • Get-mssConfig
  • Set-mssConfig
  • Get-mssServerSetting
  • Compare-mssServerConfiguration
  • Invoke-mssCollationChange
  • Invoke-mssSetDatabaseRecoveryMode
📋 Inventar & Suche5
  • Invoke-mssInstanceInventory
  • Export-mssDatabaseDocumentation
  • Find-mssDatabaseObject
  • Get-mssLinkedServerUsage
  • Get-mssAgentJobHistory
🖥️ Cluster & Dienste5
  • Get-mssClusterInfo
  • Install-mssSsrsReportServer
  • Set-mssSsrsConfiguration
  • Invoke-mssSsisConfiguration
  • Test-mssSsasDirectoryPermissions
🔐 Zertifikate4
  • Get-mssCertificateReport
  • Install-mssCertificate
  • New-mssCertificateRequest
  • New-mssSqlCertificate
📼 TSM / IBM Spectrum3
  • Invoke-mssTsmConfiguration
  • Get-mssTsmConfiguration
  • Test-mssTsmConnection
🔹 Sonstige5
  • Set-mssSqlPolicyState
  • Invoke-mssMonitoringKey
  • Copy-mssToCentralPath
  • Install-mssAdModule
  • Get-mssHpuAllowGroup

🔄 AlwaysOn Availability Groups

Invoke-mssAddDatabaseToAvailabilityGroup 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-mssAddDatabaseToAvailabilityGroup -AvailabilityGroup "AG_Prod" -Database "SalesDB"
Alle User-Datenbanken hinzufügen
Invoke-mssAddDatabaseToAvailabilityGroup -AvailabilityGroup "AG_Prod" -All
Mehrere Datenbanken explizit
Invoke-mssAddDatabaseToAvailabilityGroup -SqlInstance "SQL01" ` 
-AvailabilityGroup "AG_Prod" ` 
-Database "SalesDB","InventoryDB","HRApp"
Invoke-mssRemoveDatabaseFromAvailabilityGroup 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-mssRemoveDatabaseFromAvailabilityGroup -Database "SalesDB"
Alle AG-Datenbanken entfernen
Invoke-mssRemoveDatabaseFromAvailabilityGroup -All
Auf expliziter Instanz
Invoke-mssRemoveDatabaseFromAvailabilityGroup -SqlInstance "SQL01" -Database "OldApp"
Invoke-mssSqlAlwaysOnAutoseeding 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-mssSqlAlwaysOnAutoseeding
Alle AGs auf einer Instanz aktivieren
Invoke-mssSqlAlwaysOnAutoseeding -SqlInstance "SQL01" -All
Benannte Instanz
Invoke-mssSqlAlwaysOnAutoseeding -SqlInstance "SQL01\MSSQLSERVER"
Get-mssAgHealthReport 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-mssAgHealthReport
Mit angepassten Schwellwerten
Get-mssAgHealthReport -SqlInstance "SQL01" -MaxRedoQueueMB 200 -OutputPath "D:\Reports"
Nur kritische Probleme anzeigen
Get-mssAgHealthReport -SqlInstance "SQL01" | 
Where-Object OverallStatus -eq 'Critical' | 
Format-Table AgName, ReplicaName, Database, DbSyncState, RedoQueueMB -AutoSize
Redo-Queue sortiert – größte zuerst
Get-mssAgHealthReport -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-mssAgHealthReport -SqlInstance "SQL01" | 
Where-Object Role -eq 'SEEDING' | 
Select-Object Database, DbSyncState, PercentComplete | 
Format-Table -AutoSize 
Start-Sleep 30 
}
Sync-mssAgNode 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-mssAgNode
Nur Logins synchronisieren
Sync-mssAgNode -SqlInstance "SQL01" -ExcludeType Jobs,LinkedServers,Operators,Alerts
Nur bestimmte AG synchronisieren
Sync-mssAgNode -SqlInstance "SQL01" -AvailabilityGroup "AG_Prod"
Einzelnen Login gezielt synchronisieren
Sync-mssAgNode -SqlInstance "SQL01" -ObjectName "AppServiceAccount"
Ergebnis auswerten
$r = Sync-mssAgNode -SqlInstance "SQL01" 
$r | Group-Object ObjectType | ForEach-Object { 
"$($_.Name): $(@($_.Group | Where Status -eq 'Success').Count) OK, " + 
"$(@($_.Group | Where Status -eq 'Failed').Count) Fehler" 
}
Repair-mssAlwaysOnDatabases 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-mssAlwaysOnDatabases
Alle DBs erzwingen (auch gesunde)
Repair-mssAlwaysOnDatabases -Force
Explizite Instanz mit Fehlertoleranz
Repair-mssAlwaysOnDatabases -SqlInstance "SQL01" -ContinueOnError
New-mssAlwaysOnRepairJob AlwaysOn
Erstellt einen SQL Agent Job der Repair-mssAlwaysOnDatabases periodisch ausführt (PowerShell-Subsystem). Konfigurierbar mit Zeitplan und Operator-Benachrichtigung.
▶ 3 Beispiele anzeigen
Stündlicher Repair-Job
New-mssAlwaysOnRepairJob
Täglich um 02:00 Uhr
New-mssAlwaysOnRepairJob -Schedule "FREQ=DAILY;INTERVAL=1" -StartTime "02:00:00"
Job auf allen AG-Nodes erstellen
"SQL01","SQL02","SQL03" | ForEach-Object { 
New-mssAlwaysOnRepairJob -SqlInstance $_ -Schedule "FREQ=HOURLY;INTERVAL=2" 
}
Invoke-mssFailover 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-mssFailover -SqlInstance "SQL01" -AvailabilityGroup "AG_Prod" -WhatIf
Failover auf bestimmtes Replikat
Invoke-mssFailover -SqlInstance "SQL01" -AvailabilityGroup "AG_Prod" ` 
-TargetReplica "SQL02" -MaxRedoQueueMB 10
Automatische Replikat-Wahl (kleinste Queue)
Invoke-mssFailover -SqlInstance "SQL01" -AvailabilityGroup "AG_Prod"
Mit laengerer Post-Check-Wartezeit
Invoke-mssFailover -SqlInstance "SQL01" -AvailabilityGroup "AG_Prod" ` 
-WaitAfterFailoverSeconds 60 -EnableException
Ergebnis auswerten
$result = Invoke-mssFailover -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-mssUserDatabaseBackup 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-mssUserDatabaseBackup -All
Bestimmte Datenbanken auf Remote-Server
Invoke-mssUserDatabaseBackup -SqlInstance "SQL01" -Database "SalesDB","InventoryDB"
Mit alternativem Backup-Pfad
Invoke-mssUserDatabaseBackup -All -BackupPath "D:\Backup\User-Db"
Testlauf ohne Ausführung
Invoke-mssUserDatabaseBackup -All -WhatIf
Invoke-mssRestoreDatabase 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-mssRestoreDatabase -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-mssRestoreDatabase -SqlInstance "SQL01" ` 
-BackupFiles $backupSequence ` 
-DatabaseName "AdventureWorks"
Restore unter neuem Namen
Invoke-mssRestoreDatabase -SqlInstance "SQL01" ` 
-BackupFile "D:\Backup\OldDB.bak" ` 
-DatabaseName "OldDB" ` 
-NewDatabaseName "NewDB"
Mit Pre-Restore-Backup (Rollback-Sicherheit)
Invoke-mssRestoreDatabase -SqlInstance "SQL01" ` 
-BackupFile "D:\Backup\SalesDB.bak" ` 
-DatabaseName "SalesDB" ` 
-CreatePreRestoreBackup
Single-User erzwingen (DB in Benutzung)
Invoke-mssRestoreDatabase -SqlInstance "SQL01" ` 
-BackupFile "D:\Backup\SalesDB.bak" ` 
-DatabaseName "SalesDB" ` 
-ForceSingleUser
Mehrere DBs per Pipeline
"D:\Bak\DB1.bak","D:\Bak\DB2.bak" | 
Invoke-mssRestoreDatabase -SqlInstance "SQL01" -DatabaseName { [IO.Path]::GetFileNameWithoutExtension($_) }
Test-mssBackupIntegrity Backup
Prüft eine oder mehrere Backup-Dateien via RESTORE VERIFYONLY. Liefert $true bei Erfolg.
▶ 3 Beispiele anzeigen
Einzelne Datei prüfen
Test-mssBackupIntegrity -SqlInstance "SQL01" -BackupPath "D:\Backup\AdventureWorks.bak"
Alle Backups eines Verzeichnisses prüfen
Get-ChildItem "D:\Backup\*.bak" | ForEach-Object { 
$ok = Test-mssBackupIntegrity -SqlInstance "SQL01" -BackupPath $_.FullName 
[PSCustomObject]@{ File = $_.Name; Valid = $ok } 
} | Format-Table -AutoSize
Bei Fehler abbrechen
if (-not (Test-mssBackupIntegrity -SqlInstance "SQL01" -BackupPath "D:\Backup\SalesDB.bak")) { 
throw "Backup-Prüfung fehlgeschlagen!" 
}
Invoke-mssLogShrink 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-mssLogShrink -Database "MyDB" -ShrinkTargetPercent 20
Alle Datenbanken (Testlauf)
Invoke-mssLogShrink -SqlInstance "SQL01" -All -WhatIf
Mit Mindestgröße
Invoke-mssLogShrink -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-mssLogShrink -SqlInstance "SQL01" -Database "SalesDB" -ShrinkTargetPercent 15

🔒 Sicherheit

Invoke-mssSaObfuscation 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: msssa, 18 Zeichen)
$r = Invoke-mssSaObfuscation -SqlInstance "SQL01" 
Write-Host "Neuer Name : $($r.NewLoginName)" 
Write-Host "Kennwort : $($r.GeneratedPassword)" # SOFORT sicher verwahren!
Eigener Login-Name und längeres Kennwort
Invoke-mssSaObfuscation -SqlInstance "SQL01" -NewName "dbsvc_sys" -PasswordLength 32
Kennwort sofort in Datei sichern
$r = Invoke-mssSaObfuscation -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-mssSaObfuscation -SqlInstance $_ -ContinueOnError 
} 
$results | Select-Object SqlInstance, NewLoginName, SysadminCheck, Status | Format-Table -AutoSize
Invoke-mssRenameSaAccount 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 mssa umbenennen (Standardname)
Invoke-mssRenameSaAccount
Umbenennen und deaktivieren
Invoke-mssRenameSaAccount -NewName "MyHiddenSA" -Disable
Nur aktivieren (ohne Umbenennung)
Invoke-mssRenameSaAccount -NewName "sa" -Enable
Mehrere Instanzen
"SQL01","SQL02","SQL03" | ForEach-Object { 
Invoke-mssRenameSaAccount -SqlInstance $_ -NewName "mssa" -Disable 
}
Get-mssSysadminAccounts 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-mssSysadminAccounts -SqlInstance "SQL01"
Systemkonten automatisch ausschließen
Get-mssSysadminAccounts -SqlInstance "SQL01" -ExcludeSysAccounts
Bekannte Konten ausschließen
Get-mssSysadminAccounts -SqlInstance "SQL01" ` 
-ExcludeLogin "NT SERVICE\*","NT AUTHORITY\*","CONTOSO\SQLAdmins","msssa" ` 
-ExcludeSysAccounts
Nur unerwartete Konten anzeigen
Get-mssSysadminAccounts -SqlInstance "SQL01" -ExcludeSysAccounts | 
Where-Object Status -in 'Unexpected','BuiltinAdmins' | 
Format-Table SqlInstance, LoginName, LoginType, IsEnabled -AutoSize
Zusammenfassung über alle Instanzen
$all = Get-mssSysadminAccounts -SqlInstance "SQL01","SQL02","SQL03" ` 
-ExcludeLogin "NT SERVICE\*","msssa" -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-mssLoginAudit 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-mssLoginAudit -SqlInstance "SQL01"
Mit angepassten Schwellwerten
Invoke-mssLoginAudit -SqlInstance "SQL01" ` 
-InactivityThresholdDays 60 ` 
-MaxPasswordAgeDays 90 ` 
-ExcludeLogin "NT SERVICE\*","SA"
Mit AD-Orphan-Prüfung (erfordert RSAT)
Invoke-mssLoginAudit -SqlInstance "SQL01" -CheckAdOrphans -IncludeSystemLogins
Nur Policy-Verstöße filtern
$r = Invoke-mssLoginAudit -SqlInstance "SQL01" -ExcludeLogin "NT SERVICE\*" 
$r | Where-Object Category -eq 'Policy' | Format-Table LoginName, Issue -AutoSize
Mehrere Instanzen parallel
"SQL01","SQL02","SQL03" | Invoke-mssLoginAudit -ContinueOnError
Copy-mssLogins 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-mssLogins -SourceInstance "SQL01" -TargetInstance "SQL02"
Auth-Modus automatisch angleichen + Dienst neu starten
Copy-mssLogins -SourceInstance "SQL01" -TargetInstance "SQL02" ` 
-AdjustAuthMode -RestartServiceIfRequired
Bestimmte Logins ausschließen
Copy-mssLogins -SourceInstance "SQL01" -TargetInstance "SQL02" ` 
-ExcludeLogin "OldApp*","TestUser"
Mehrere Zielinstanzen
"SQL02","SQL03","SQL04" | ForEach-Object { 
Copy-mssLogins -SourceInstance "SQL01" -TargetInstance $_ -ContinueOnError 
}
Get-mssADAccountStatus 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-mssADAccountStatus -SamAccountName "svc-sqlserver"
Set-mssDatabaseOwner Sicherheit
DB-Owner einheitlich auf sa setzen. Systemdatenbanken übersprungen. Unterstützt -WhatIf.
▶ 2 Beispiele anzeigen
Alle User-DBs auf sa setzen
Set-mssDatabaseOwner -SqlInstance "SQL01" -All

🩺 Diagnose & Health

Get-mssDatabaseHealth 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-mssDatabaseHealth
Inkl. Systemdatenbanken
Get-mssDatabaseHealth -SqlInstance "SQL01" -IncludeSystemDatabases -OutputPath "D:\Reports"
Datenbanken ohne aktuelles Backup finden
Get-mssDatabaseHealth -SqlInstance "SQL01" | 
Where-Object { $_.LastFullBackup -lt (Get-Date).AddDays(-2) } | 
Select-Object DatabaseName, LastFullBackup, RecoveryModel
Hohe VLF-Anzahl identifizieren
Get-mssDatabaseHealth -SqlInstance "SQL01" | 
Where-Object VlfCount -gt 1000 | 
Sort-Object VlfCount -Descending | 
Format-Table DatabaseName, VlfCount, LogSizeMB -AutoSize
Get-mssSQLInstanceCheck 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-mssSQLInstanceCheck
Detaillierter Report
Get-mssSQLInstanceCheck -SqlInstance "SQL01\INSTANCE" -Detailed
Nur Warnungen anzeigen
Get-mssSQLInstanceCheck -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-mssSQLInstanceCheck -SqlInstance $_ -ContinueOnError 
} | Where-Object Status -eq 'Warning' | Format-Table SqlInstance, Check, CurrentValue
Get-mssTempDbRecommendation 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-mssTempDbRecommendation -SqlInstance "SQL01"
Nur Warnungen ausgeben
Get-mssTempDbRecommendation -SqlInstance "SQL01" | 
Where-Object Status -ne 'OK' | 
Select-Object Status, Messages, Recommendations
Report in Datei schreiben
Get-mssTempDbRecommendation -SqlInstance "SQL01" -OutputPath "D:\Reports"
Get-mssDiskSpaceReport 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-mssDiskSpaceReport
Mit angepasstem Warn-Schwellwert
Get-mssDiskSpaceReport -SqlInstance "SQL01" -WarnThresholdPct 15 -OutputPath "D:\Reports"
Kritische Volumes hervorheben
Get-mssDiskSpaceReport -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-mssDiskSpaceReport -SqlInstance $_ -WarnThresholdPct 10 -ContinueOnError 
} | Where-Object Status -eq 'Warning' | Export-Csv "D:\Reports\DiskWarnings.csv" -NoTypeInformation
Get-mssOperationStatus 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-mssOperationStatus
Nur AutoSeed-Vorgänge
Get-mssOperationStatus -SqlInstance "SQL01" -OperationType AutoSeed
Live-Aktualisierung alle 10 Sekunden
Get-mssOperationStatus -Continuous -RefreshSeconds 10
Backup-Fortschritt während Restore überwachen
while ($true) { 
$ops = Get-mssOperationStatus -SqlInstance "SQL01" -OperationType Restore 
if (-not $ops) { Write-Host "Restore abgeschlossen."; break } 
$ops | Format-Table Database, PercentComplete, EstimatedTimeRemaining -AutoSize 
Start-Sleep 15 
}
Get-mssSpnReport 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-mssSpnReport
Remote-Server analysieren
Get-mssSpnReport -ComputerName "SQL01" -OutputPath "D:\Reports"
Nur Standardinstanz prüfen
Get-mssSpnReport -ComputerName "SQL01" -InstanceFilter "MSSQLSERVER"
Mehrere Server – fehlende SPNs zusammenfassen
"SQL01","SQL02","SQL03" | ForEach-Object { 
Get-mssSpnReport -ComputerName $_ -ContinueOnError 
} | Where-Object Status -eq 'Missing' | 
Select-Object ComputerName, InstanceName, SpnValue, SetSpnCommand | 
Format-Table -AutoSize
Get-mssConnectionStats 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-mssConnectionStats -SqlInstance "SQL01"
Top-10 Login-Verbindungen
Get-mssConnectionStats -SqlInstance "SQL01" -GroupBy Login -TopN 10
Verbindungen nach Datenbank inkl. System-Sessions
Get-mssConnectionStats -SqlInstance "SQL01" -GroupBy Database -IncludeSystemConnections
Blockierte Sessions anzeigen
$stats = Get-mssConnectionStats -SqlInstance "SQL01" 
$stats.Summary 
$stats.ActiveRequests | Where-Object BlockedBy -gt 0 | Format-Table
Mit CSV-Report
Get-mssConnectionStats -SqlInstance "SQL01" -GroupBy Host -OutputPath "D:\Reports"
Get-mssOrphanedFiles 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-mssOrphanedFiles -SqlInstance "SQL01"
Bestimmte Verzeichnisse rekursiv durchsuchen
Get-mssOrphanedFiles -SqlInstance "SQL01" -SearchPath "D:\SQLData","E:\SQLLog" -Recurse
Remote-Instanz mit UNC-Pfad
Get-mssOrphanedFiles -SqlInstance "SQL01" ` 
-SearchPath "\\SQL01\D$\SQLData","\\SQL01\E$\SQLLog"
Ergebnis auswerten und Groesse summieren
$orphans = Get-mssOrphanedFiles -SqlInstance "SQL01" 
Write-Host "$($orphans.OrphanedFiles) verwaiste Dateien, $($orphans.TotalOrphanedMB) MB gesamt" 
$orphans.Files | Sort-Object SizeMB -Descending | Format-Table FileName, SizeMB, LastModified
Invoke-mssPatchAnalysis 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-mssPatchAnalysis
Mehrere Instanzen per Pipeline
"SQL01","SQL02","SQL03" | Invoke-mssPatchAnalysis
Nur kritische Instanzen anzeigen
"SQL01","SQL02","SQL03" | Invoke-mssPatchAnalysis | 
Where-Object PatchStatus -in @('Critical','MajorUpdate') | 
Select-Object SqlInstance, ProductVersion, LatestKnownLabel, BuildsBehind, PatchStatus
Mit Bericht-Export
Invoke-mssPatchAnalysis -SqlInstance "SQL01" -OutputPath "D:\Reports"
Alle Instanzen aus einer Liste
Get-Content "C:\Scripts\sql-instances.txt" | Invoke-mssPatchAnalysis -OutputPath "D:\Reports"

⚡ Performance

Get-mssMissingIndexes 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-mssMissingIndexes -SqlInstance "SQL01" -TopN 20
Get-mssBlockingReport Performance
Aktuelle Blockierungsketten aus DMVs: Lead-Blocker, wartende Sessions, SQL-Text, Wartezeiten.
▶ 2 Beispiele anzeigen
Aktuelle Blocking-Ketten
Get-mssBlockingReport -SqlInstance "SQL01"
Get-mssDeadlockReport Performance
Deadlock-Ereignisse aus der System Health XEvent Session: Opfer, Ressource, SQL-Text, Zeitstempel.
▶ 2 Beispiele anzeigen
Alle Deadlocks der letzten Stunden
Get-mssDeadlockReport -SqlInstance "SQL01"
Get-mssLongRunningQueries 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-mssLongRunningQueries -SqlInstance "SQL01" -MinDurationSeconds 30
Get-mssIndexFragmentation 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-mssIndexFragmentation -Database "AdventureWorks" -MinFragmentationPercent 10
Nur REBUILD-Kandidaten
Get-mssIndexFragmentation -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-mssIndexFragmentation -SqlInstance "SQL01" -All -MinFragmentationPercent 30
Bestimmte Tabelle analysieren
Get-mssIndexFragmentation -SqlInstance "SQL01" -Database "Sales" -TableName "OrderDetails"
Invoke-mssUpdateStatistics 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-mssUpdateStatistics -Database "SalesDB" -SamplePercent 10
Alle User-DBs, nur geänderte Statistiken
Invoke-mssUpdateStatistics -SqlInstance "SQL01" -All -OnlyModified
FULLSCAN für kritische Tabelle
Invoke-mssUpdateStatistics -SqlInstance "SQL01" -Database "Sales" ` 
-TableName "OrderDetails" -FullScan
Get-mssAutoGrowthReport 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-mssAutoGrowthReport -SqlInstance "SQL01" -HistoryDays 7
Häufigste AutoGrowth-Datenbanken
Get-mssAutoGrowthReport -SqlInstance "SQL01" | 
Group-Object DatabaseName | Sort-Object Count -Descending | 
Select-Object Name, Count | Format-Table -AutoSize
Gesamtwachstum pro DB berechnen
Get-mssAutoGrowthReport -SqlInstance "SQL01" | 
Group-Object DatabaseName | 
ForEach-Object { [PSCustomObject]@{ 
DB = $_.Name 
GrowthMB = ($_.Group | Measure-Object GrowthMB -Sum).Sum 
}} | Sort-Object GrowthMB -Descending
Invoke-mssQueryStore 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-mssQueryStore -SqlInstance "SQL01" -All
Query Store konfigurieren und sofort abfragen
Invoke-mssQueryStore -SqlInstance "SQL01" ` 
-Database "SalesDB","CRM" ` 
-Configure -Query -Diagnose ` 
-MaxStorageSizeMB 2000 -QueryCaptureMode AUTO
Top 50 Queries nach CPU, letzte 48 Stunden
Invoke-mssQueryStore -SqlInstance "SQL01" ` 
-Database "SalesDB" -Query ` 
-TopN 50 -OrderBy CPU -LookbackHours 48
Diagnose mit niedrigem Speicher-Schwellwert
Invoke-mssQueryStore -SqlInstance "SQL01" -All ` 
-Diagnose -StorageWarningPct 70 -OutputPath "D:\Reports\QS"
Query Store deaktivieren
Invoke-mssQueryStore -SqlInstance "SQL01" ` 
-Database "OldDB" -Configure -OperationMode OFF
Invoke-mssExtendedEvents 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-mssExtendedEvents -SqlInstance "SQL01" -Create -Start
Nur Slow Queries > 2s in Datei aufzeichnen
Invoke-mssExtendedEvents -SqlInstance "SQL01" ` 
-Template SlowQueries ` 
-SlowQueryThresholdMs 2000 ` 
-TargetType File -Create -Start
Session auslesen und Bericht erstellen
Invoke-mssExtendedEvents -SqlInstance "SQL01" ` 
-Read -Diagnose -LookbackMinutes 60 -TopN 25
Deadlock-Trace einrichten
Invoke-mssExtendedEvents -SqlInstance "SQL01" ` 
-SessionName "DeadlockCapture" ` 
-Template Deadlocks -TargetType File -Create -Start
Session stoppen und entfernen
Invoke-mssExtendedEvents -SqlInstance "SQL01" -Stop -Drop
Get-mssWaitStatistics 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-mssWaitStatistics -SqlInstance "SQL01"
Inkl. Idle-Waits (alle Wait Types)
Get-mssWaitStatistics -SqlInstance "SQL01" -IncludeIdle -TopN 50
Delta-Messung ueber 5 Minuten
# Snapshot vorher 
$snap = Get-mssWaitStatistics -SqlInstance "SQL01" -SaveSnapshot 
Start-Sleep 300 
# Delta messen 
Get-mssWaitStatistics -SqlInstance "SQL01" -SnapshotBefore $snap.Snapshot
Nur Locking- und IO-Waits filtern
Get-mssWaitStatistics -SqlInstance "SQL01" | 
Select-Object -ExpandProperty WaitStats | 
Where-Object Category -in @('Locking','IO') | 
Sort-Object WaitTimeSec -Descending | Format-Table
Mit CSV-Export
Get-mssWaitStatistics -SqlInstance "SQL01" -OutputPath "D:\Reports"
Get-mssPerfCounters 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-mssPerfCounters -SqlInstance "SQL01"
Nur Buffer- und Memory-Counter
Get-mssPerfCounters -SqlInstance "SQL01" -Category "Buffer","Memory"
Nur Warnungen ausgeben
$perf = Get-mssPerfCounters -SqlInstance "SQL01" 
$perf.Summary 
$perf.Counters | Where-Object Interpretation -ne '' | Format-Table CounterName, Value, Interpretation
PLE-Verlauf ueberwachen (Loop)
while ($true) { 
$s = (Get-mssPerfCounters -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-mssPerfCounters -SqlInstance "SQL01" -OutputPath "D:\Reports"
Invoke-mssPerfBaseline 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-mssPerfBaseline -SqlInstance "SQL01" -Action Capture ` 
-BaselineName "BeforePatch" -OutputPath "D:\Baselines"
Baseline nach Aenderung erfassen
Invoke-mssPerfBaseline -SqlInstance "SQL01" -Action Capture ` 
-BaselineName "AfterPatch" -OutputPath "D:\Baselines"
Zwei Baselines vergleichen
Invoke-mssPerfBaseline -Action Compare ` 
-BaselineA "D:\Baselines\PerfBaseline_SQL01_..._BeforePatch.json" ` 
-BaselineB "D:\Baselines\PerfBaseline_SQL01_..._AfterPatch.json"
Alle Baselines auflisten
Invoke-mssPerfBaseline -Action List -OutputPath "D:\Baselines"
Wait-Deltas nach Patch anzeigen
$cmp = Invoke-mssPerfBaseline -Action Compare -BaselineA $fileA -BaselineB $fileB 
$cmp.WaitDeltas | Select-Object -First 10 | Format-Table WaitType, DeltaWaitSec, Category, Recommendation

🔧 Ola Hallengren Wartung

Install-mssOlaMaintenanceSolution 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-mssOlaMaintenanceSolution -SqlInstance "SQL01"
Aktualisierung (bestehende Objekte überschreiben)
Install-mssOlaMaintenanceSolution -SqlInstance "SQL01" -Force
Kompletter Wartungs-Onboarding-Stack
# 1. Ola installieren 
Install-mssOlaMaintenanceSolution -SqlInstance "SQL01" 
 
# 2. Prüfen ob Installation ok 
Test-mssOlaInstallation -SqlInstance "SQL01" 
 
# 3. Maintenance-Jobs anlegen 
New-mssOlaMaintenanceJobs -SqlInstance "SQL01" -ScheduleTime "23:00" 
 
# 4. System-DB-Backup-Job anlegen 
New-mssOlaSysDbBackupJob -SqlInstance "SQL01" -ScheduleTime "20:00"
New-mssOlaMaintenanceJobs 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-mssOlaMaintenanceJobs -SqlInstance "SQL01"
Mit angepassten Zeitplan und Operator
New-mssOlaMaintenanceJobs -SqlInstance "SQL01" ` 
-ScheduleTime "22:00" -ScheduleDay 64 -OperatorName "DBAs"
Mit angepassten Fragmentierungsschwellen
New-mssOlaMaintenanceJobs -SqlInstance "SQL01" ` 
-FragmentationLevel1 10 -FragmentationLevel2 40 ` 
-FillFactor 85 -MaxDOP 4
Vorhandene Jobs aktualisieren
New-mssOlaMaintenanceJobs -SqlInstance "SQL01" -Update
New-mssOlaSysDbBackupJob 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-mssOlaSysDbBackupJob -SqlInstance "SQL01"
Mit Zeitplan und Operator
New-mssOlaSysDbBackupJob -SqlInstance "SQL01" -ScheduleTime "20:00" -OperatorName "DBAs"
New-mssOlaUsrDbBackupJob 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-mssOlaUsrDbBackupJob -SqlInstance "SQL01" -Full ` 
-FullScheduleDays @('Sunday') -FullScheduleTime "21:00"
Alle drei Typen mit individuellem Zeitplan
New-mssOlaUsrDbBackupJob -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-mssOlaUsrDbBackupJob -SqlInstance "SQL01" -Log ` 
-Databases "SalesDB,HRDB" ` 
-LogScheduleDays @('EveryDay') -LogScheduleTime "00:30"
Vorhandene Jobs aktualisieren
New-mssOlaUsrDbBackupJob -SqlInstance "SQL01" -Full -Diff -Log -Update
Invoke-mssFormatDrive64k 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-mssFormatDrive64k -DriveLetter D
Ohne Bestätigung, abweichender Backup-Pfad
Invoke-mssFormatDrive64k -DriveLetter E -BackupPath "C:\Backup\DriveTemp" -Force
Testlauf ohne Änderungen (WhatIf)
Invoke-mssFormatDrive64k -DriveLetter D -WhatIf
Test-mssSQLFirewall 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-mssSQLFirewall -Server "SQL01"
Benannte Instanz – Port via SQL Browser
Test-mssSQLFirewall -Server "SQL01" -Instance "SAGE"
Mehrere Server per Pipeline
"SQL01","SQL02","SQL03" | Test-mssSQLFirewall -Instance "PROD" -TimeoutSeconds 3 | 
Format-Table Server, Port, TcpReachable, Status -AutoSize
Test-mssOlaInstallation Diagnose
Prüft ob Ola Hallengrens Maintenance Solution installiert ist (DatabaseBackup, CommandLog, DatabaseIntegrityCheck, IndexOptimize).
▶ 2 Beispiele anzeigen
Prüfung
Test-mssOlaInstallation -SqlInstance "SQL01"
Als Bedingung in einem Skript
if (-not (Test-mssOlaInstallation -SqlInstance "SQL01")) { 
Install-mssOlaMaintenanceSolution -SqlInstance "SQL01" 
}

⚙️ Konfiguration

Get-mssConfig 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-mssConfig
Einzelnen Wert lesen
Get-mssConfig -Key 'OutputPath' 
Get-mssConfig -Key 'LogPath'
In Skript verwenden
$outPath = Get-mssConfig -Key 'OutputPath' 
$report = Get-mssDatabaseHealth -SqlInstance "SQL01" -OutputPath $outPath
Set-mssConfig Konfiguration
Setzt Konfigurationswerte dauerhaft (%APPDATA%\MSSQLTools\config.json). Pfade werden geprüft und erstellt.
▶ 4 Beispiele anzeigen
Pfade setzen
Set-mssConfig -LogPath "D:\Logs\SQL" -OutputPath "D:\Reports\SQL" -CentralPath "\\Fileserver\SQL"
Ola-Job-Namen anpassen
Set-mssConfig -OlaJobNameFull "PROD-FULL" -OlaJobNameIndexOpt "PROD-IndexOpt"
TSM-Management-Klassen setzen
Set-mssConfig -TsmManagementClasses @('MC_10','MC_30','MC_100')
Auto-Update deaktivieren
Set-mssConfig -AutoUpdate $false
Compare-mssServerConfiguration 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-mssServerConfiguration -SourceInstance "SQL01" -TargetInstance "SQL02"
Nur Unterschiede anzeigen
Compare-mssServerConfiguration -SourceInstance "SQL01" -TargetInstance "SQL02" | 
Where-Object { $_.SourceValue -ne $_.TargetValue } | 
Format-Table Setting, SourceValue, TargetValue -AutoSize
Template-Server als Referenz für alle Instanzen
$targets = "SQL02","SQL03","SQL04" 
$targets | ForEach-Object { 
$diffs = Compare-mssServerConfiguration -SourceInstance "SQL01" -TargetInstance $_ | 
Where-Object { $_.SourceValue -ne $_.TargetValue } 
if ($diffs) { Write-Host "$_ hat $($diffs.Count) Abweichungen"; $diffs | Format-Table } 
}
Invoke-mssCollationChange 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-mssCollationChange -NewCollation "Latin1_General_CI_AS"
Mit Backup vorher und User-DBs anpassen
Invoke-mssCollationChange -SqlInstance "SQL01\INST2" ` 
-NewCollation "German_CI_AS" ` 
-IncludeUserDatabases ` 
-BackupBeforeChange
Invoke-mssSetDatabaseRecoveryMode 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-mssSetDatabaseRecoveryMode -All -RecoveryMode Full
Einzelne DB auf Simple
Invoke-mssSetDatabaseRecoveryMode -Database "SalesDB" -RecoveryMode Simple -Confirm
Mehrere DBs per Pipeline
"DB1","DB2","DB3" | ForEach-Object { 
Invoke-mssSetDatabaseRecoveryMode -SqlInstance "SQL01" -Database $_ -RecoveryMode Full 
}
Get-mssServerSetting Konfiguration
Liest Server-Properties via SMO. Mit -Name einzelne Eigenschaft, mit -All alle Eigenschaften.
▶ 3 Beispiele anzeigen
BackupDirectory lesen
$backupPath = Get-mssServerSetting -Name "BackupDirectory"
Alle Eigenschaften ausgeben
Get-mssServerSetting -All
Remote-Instanz mit SQL-Auth
$cred = Get-Credential 
Get-mssServerSetting -SqlInstance "SQL01" -SqlCredential $cred -All

📋 Inventar & Suche

Invoke-mssInstanceInventory 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-mssInstanceInventory
Mehrere Instanzen mit Fehlertoleranz
Invoke-mssInstanceInventory -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-mssInstanceInventory -SqlInstance $instances -ContinueOnError 
# Ergebnis liegt in $OutputPath\InstanceInventory_*.txt
Export-mssDatabaseDocumentation Inventar
HTML- und CSV-Dokumentation aller Datenbanken: Tabellen, Indizes, Views, SPs, Recovery-Modell, Größe.
▶ 2 Beispiele anzeigen
Dokumentation erstellen
Export-mssDatabaseDocumentation -SqlInstance "SQL01" -OutputPath "D:\Reports"
Find-mssDatabaseObject 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-mssDatabaseObject -SqlInstance "SQL01" -ObjectName "sp_GetOrders"
Wildcard-Suche in bestimmten DBs
Find-mssDatabaseObject -SqlInstance "SQL01" -ObjectName "*log*" ` 
-ObjectType "TABLE","VIEW" -Database "Sales*"
Objekte nach Text im SQL-Body suchen
Find-mssDatabaseObject -SqlInstance "SQL01" -ObjectName "*" ` 
-SearchInDefinition -SearchText "OPENQUERY" | 
Format-Table Database, Schema, ObjectType, ObjectName -AutoSize
Alle Trigger finden
Find-mssDatabaseObject -SqlInstance "SQL01" -ObjectName "*" -ObjectType "TRIGGER" | 
Group-Object Database | Select-Object Name, Count
Get-mssLinkedServerUsage 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-mssLinkedServerUsage -SqlInstance "SQL01" -LinkedServer "PROD_SRV"
Alle Linked Server in Verwendung
Get-mssLinkedServerUsage -SqlInstance "SQL01" | 
Group-Object LinkedServer | Select-Object Name, Count | 
Sort-Object Count -Descending
Vor Abschaltung eines Linked Servers prüfen
$usage = Get-mssLinkedServerUsage -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-mssAgentJobHistory 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-mssAgentJobHistory
Nur fehlgeschlagene Backup-Jobs heute
Get-mssAgentJobHistory -JobName '*Backup*' -Status Failure ` 
-Since (Get-Date).AddDays(-1) | 
Format-Table JobName, RunDate, RunDuration, Message -AutoSize
Laufzeit-Statistik pro Job
Get-mssAgentJobHistory -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 -Descending
Bestimmten Job überwachen
Get-mssAgentJobHistory -SqlInstance "SQL01" -JobName "FITS-SystemDatabases-FULL" | 
Select-Object -First 10 | Format-Table -AutoSize

🖥️ Cluster & Dienste

Get-mssClusterInfo 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-mssClusterInfo -ClusterName "MEINCLUSTER" 
$info.Nodes | Format-Table 
$info.Roles | Where-Object OwnerNode -eq "SQL01" | Select-Object Name, IPAddresses
Inkl. Core-Gruppe
Get-mssClusterInfo -IncludeCoreGroup
Fehlerbehandlung
$info = Get-mssClusterInfo -ClusterName "MEINCLUSTER" 
if (-not $info.Success) { Write-Error $info.ErrorMessage; return }
Install-mssSsrsReportServer Konfiguration
SSRS 2022 unattended installieren. Pfad über Set-mssConfig -SsrsInstallerPath voreinstellbar.
▶ 2 Beispiele anzeigen
Mit vorkonfiguriertem Installer-Pfad
Set-mssConfig -SsrsInstallerPath '\\srv-share\Software\SSRS2022\SQLServerReportingServices.exe' 
Install-mssSsrsReportServer
Set-mssSsrsConfiguration 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-mssSsrsConfiguration
Remote mit AG-Listener
Set-mssSsrsConfiguration -ComputerName "SSRS01" -DatabaseServer "AG_Listener"
Testlauf
Set-mssSsrsConfiguration -ComputerName "SSRS01" -WhatIf
Invoke-mssSsisConfiguration 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-mssSsisConfiguration -SqlInstance "SQL01" -CatalogPassword $pwd
Mit AG-Integration
$pwd = Read-Host "SSISDB-Kennwort" -AsSecureString 
Invoke-mssSsisConfiguration -SqlInstance "SQL01" -AgName "AG_SSIS" -CatalogPassword $pwd
Test-mssSsasDirectoryPermissions 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-mssSsasDirectoryPermissions
Benannte Instanz, WhatIf
Test-mssSsasDirectoryPermissions -InstanceName "SSAS2019" -WhatIf

🔐 Zertifikate

Get-mssCertificateReport Sicherheit
SQL Server-Zertifikate: Ablaufdatum, Aussteller, Verwendungszweck. Warnung bei Ablauf in unter 90 Tagen.
▶ 2 Beispiele anzeigen
Alle Zertifikate anzeigen
Get-mssCertificateReport -SqlInstance "SQL01"
Install-mssCertificate 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-mssCertificate -SqlInstance "SQL01" -CertificatePath "C:\Certs\SQL01.pfx" -CertPassword $cred
New-mssCertificateRequest 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-mssCertificateRequest -SqlInstance "SQL01" -OutputPath "C:\Certs"
New-mssSqlCertificate Sicherheit
Selbstsigniertes SQL Server-Zertifikat erneuern: Subject/SAN des bestehenden übernehmen, neue Laufzeit.
▶ 2 Beispiele anzeigen
Zertifikat erneuern (5 Jahre)
New-mssSqlCertificate -SqlInstance "SQL01" -ValidityYears 5

📼 TSM / IBM Spectrum Protect

Invoke-mssTsmConfiguration 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-mssTsmConfiguration -ManagementClass MC_B_NL.NL_42.42.NA
Remote-Server mit UseDiff
Invoke-mssTsmConfiguration -ComputerName "SQL01" -UseDiff
Mit zusätzlichen Pfaden
Invoke-mssTsmConfiguration -ComputerName "SQL01" -AdditionalIncludePaths "E:\Archive","F:\ExtraBackup"
Get-mssTsmConfiguration TSM
Liest die aktuelle TSM-Konfiguration aus dsm.opt und gibt die relevanten Einträge zurück.
▶ 2 Beispiele anzeigen
Konfiguration lesen
Get-mssTsmConfiguration
Remote-Server
Get-mssTsmConfiguration -ComputerName "SQL01"
Test-mssTsmConnection TSM
Testet die Verbindung zum TSM-Server via dsmc-Kommando. Gibt Verbindungsstatus und Server-Version zurück.
▶ 2 Beispiele anzeigen
Verbindungstest
Test-mssTsmConnection
Remote mit Fehlertoleranz
Test-mssTsmConnection -ComputerName "SQL01" -ContinueOnError

🔹 Sonstige

Set-mssSqlPolicyState 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-mssSqlPolicyState -SqlInstance "SQL01" -Policy "xp_cmdshell must be disabled" -State Disable
Policy auf mehreren Instanzen aktivieren
"SQL01","SQL02" | Set-mssSqlPolicyState -Policy "Password Policy" -State Enable
Vor Restore deaktivieren, danach reaktivieren
Set-mssSqlPolicyState -SqlInstance "SQL01" -Policy "DefaultPolicy" -State Disable 
Invoke-mssRestoreDatabase -SqlInstance "SQL01" -BackupFile "D:\Backup\DB.bak" -DatabaseName "DB" 
Set-mssSqlPolicyState -SqlInstance "SQL01" -Policy "DefaultPolicy" -State Enable
Invoke-mssMonitoringKey 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-mssMonitoringKey -SqlInstance "SQL01"
Mehrere Instanzen
"SQL01","SQL02","SQL03" | ForEach-Object { 
Invoke-mssMonitoringKey -SqlInstance $_ -ContinueOnError 
}
Copy-mssToCentralPath 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-mssToCentralPath
Explizite Quelle und Ziel
Copy-mssToCentralPath -SourcePath "D:\Reports" -CentralPath "\\Fileserver\SQL\Reports"
Install-mssAdModule 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-mssLogins und Invoke-mssLoginAudit aufgerufen wenn das AD-Modul fehlt.
▶ 3 Beispiele anzeigen
AD-Modul sicherstellen (Standard)
Install-mssAdModule
Re-Import erzwingen
Install-mssAdModule -SkipIfPresent $false
Als Bedingung vor AD-abhängigen Operationen
if (-not (Install-mssAdModule -ContinueOnError)) { 
Write-Warning "AD-Modul nicht verfügbar – Windows-Login-Prüfung wird übersprungen" 
}
Get-mssHpuAllowGroup Sonstige
HPU-Allow-Gruppe per Domain-Mapping ermitteln (Set-mssConfig -HpuDomainGroupMap). Intern von Audit- und Login-Funktionen genutzt.
▶ 2 Beispiele anzeigen
HPU-Gruppe für einen Server ermitteln
Get-mssHpuAllowGroup -ServerFqdn "SQL01.bayernlb.sfinance.net"

🚀 Quick Start

📁 Modulpfad: Das mssSQLTool-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\mssSQLTool\ 
 
# Alternativ: nur fuer den aktuellen Benutzer 
$env:USERPROFILE\Documents\WindowsPowerShell\Modules\mssSQLTool\ 
 
# Alle konfigurierten Modulpfade anzeigen 
$env:PSModulePath -split ';' 
 
# Modul-Verzeichnis anlegen und Dateien kopieren 
$target = "C:\Program Files\WindowsPowerShell\Modules\mssSQLTool" 
Copy-Item -Path "C:\CCM\mssSQLTool" -Destination $target -Recurse -Force 
 
# Nach korrekter Ablage genuegt ein einfaches: 
Import-Module mssSQLTool
Nach der Ablage im Standardpfad wird das Modul bei Import-Module mssSQLTool 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 
 
# mssSQLTool-Modul laden 
Import-Module "C:\Pfad\zum\mssSQLTool\mssSQLTool.psd1"
3
Konfiguration setzen
Set-mssConfig ` 
-LogPath "C:\System\WinSrvLog\MSSQL" ` 
-OutputPath "C:\System\WinSrvLog\MSSQL" ` 
-CentralPath "\\Fileserver\SQL\Reports" 
 
# Konfiguration prüfen 
Get-mssConfig
4
Erstes Health-Dashboard
$instance = "SQL01" # Anpassen! 
 
Write-Host "=== Instance Check ===" -ForegroundColor Cyan 
Get-mssSQLInstanceCheck -SqlInstance $instance | 
Where-Object Status -ne 'OK' | Format-Table Check, CurrentValue, Status 
 
Write-Host "=== Database Health ===" -ForegroundColor Cyan 
Get-mssDatabaseHealth -SqlInstance $instance | 
Select-Object DatabaseName, Status, RecoveryModel, LastFullBackup, VlfCount | 
Format-Table -AutoSize 
 
Write-Host "=== Disk Space ===" -ForegroundColor Cyan 
Get-mssDiskSpaceReport -SqlInstance $instance | 
Format-Table VolumeName, FreeGB, DaysUntilFull, Status -AutoSize
5
Ola Hallengren Wartung einrichten (New Server Onboarding)
$instance = "SQL01" 
 
# Schritt 1: Ola installieren 
Install-mssOlaMaintenanceSolution -SqlInstance $instance 
 
# Schritt 2: Installation prüfen 
Test-mssOlaInstallation -SqlInstance $instance 
 
# Schritt 3: Index + Integrity Jobs anlegen 
New-mssOlaMaintenanceJobs -SqlInstance $instance -ScheduleTime "23:00" -OperatorName "DBAs" 
 
# Schritt 4: System-DB-Backup-Job 
New-mssOlaSysDbBackupJob -SqlInstance $instance -ScheduleTime "20:00" -OperatorName "DBAs" 
 
# Schritt 5: User-DB-Backup-Jobs (FULL/DIFF/LOG) 
New-mssOlaUsrDbBackupJob -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-mssSaObfuscation -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-mssSysadminAccounts -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-mssAddDatabaseToAvailabilityGroup -SqlInstance $instance ` 
-AvailabilityGroup $ag -Database "NeueDB" 
 
# AG-Nodes synchronisieren (Logins, Jobs, Linked Server) 
Sync-mssAgNode -SqlInstance $instance -AvailabilityGroup $ag 
 
# Health-Report prüfen 
Get-mssAgHealthReport -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üsselStandardBeschreibung
LogPathC:\System\WinSrvLog\MSSQLPfad für Log-Dateien
OutputPathC:\System\WinSrvLog\MSSQLPfad für Report-Ausgaben (TXT/CSV)
CentralPathC:\System\WinSrvLog\MSSQLZentraler Pfad (z. B. Fileserver)
OlaJobNameFullFITS-UserDatabases-FULLJob-Name für Ola Full-Backup
OlaJobNameDiffFITS-UserDatabases-DIFFJob-Name für Ola Diff-Backup
OlaJobNameLogFITS-UserDatabases-LOGJob-Name für Ola Log-Backup
OlaJobNameIndexOptFITS-UserDatabases-IndexOptimizeJob-Name für Ola IndexOptimize
OlaJobNameIntUserDbFITS-UserDatabases-IntegrityCheckJob-Name für Ola IntegrityCheck User
OlaJobNameIntSysDbFITS-SystemDatabases-IntegrityCheckJob-Name für Ola IntegrityCheck System
OlaJobNameSysDbBackupFITS-SystemDatabases-FULLJob-Name für System-DB-Backup
TsmManagementClasses[]TSM Management-Klassen-Liste
HpuDomainGroupMap[]Domain→Gruppen-Mapping für Get-mssHpuAllowGroup
SsrsInstallerPath""Pfad zur SSRS-Installationsdatei für Install-mssSsrsReportServer.
AutoUpdate$falseAutomatisches Modul-Update beim Import
UpdateRepository""PSRepository-Name für Auto-Update
DefaultPolicy""PBM-Policy die bei Restore temp. deaktiviert wird
Languagede-DEAusgabe-Sprache. de-DE (Standard) · en-US.

Beispiel-Konfiguration

# Komplette Initialkonfiguration für Produktivumgebung 
Set-mssConfig ` 
-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-mssConfig -Language en-US 
Set-mssConfig -Language de-DE

Wir verwenden Cookies

Diese Website verwendet eigene und Drittanbieter-Cookies, um Ihre Nutzererfahrung zu analysieren und zu verbessern.

Cookies-Richtlinie
Informationen zur Verwendung von Cookies

Cookies sind kleine Textdateien unserer Webseite, die auf Ihrem Computer vom Browser gespeichert werden wenn sich dieser mit dem Internet verbindet. Cookies können verwendet werden, um Daten zu sammeln und zu speichern um Ihnen die Verwendung der Webseite angenehmer zu gestalten. Sie können von dieser oder anderen Seiten stammen.

Es gibt verschiedene Typen von Cookies:

  • Technische Cookies erleichtern die Steuerung und die Verwendung verschiedener Optionen und Dienste der Webseite. Sie identifizieren die Sitzung, steuern Zugriffe auf bestimmte Bereiche, ermöglichen Sortierungen, halten Formulardaten wie Registrierung vor und erleichtern andere Funktionalitäten (Videos, Soziale Netzwerke etc.).
  • Cookies zur Anpassung ermöglichen dem Benutzer, Einstellungen vorzunehmen (Sprache, Browser, Konfiguration, etc..).
  • Analytische Cookies erlauben die anonyme Analyse des Surfverhaltens und messen Aktivitäten. Sie ermöglichen die Entwicklung von Navigationsprofilen um die Webseite zu optimieren.

Mit der Benutzung dieser Webseite haben wir Sie über Cookies informiert und um Ihr Einverständnis gebeten (Artikel 22, Gesetz 34/2002 der Information Society Services). Diese dienen dazu, den Service, den wir zur Verfügung stellen, zu verbessern. Wir verwenden Google Analytics, um anonyme statistische Informationen zu erfassen wie z.B. die Anzahl der Besucher. Cookies von Google Analytics unterliegen der Steuerung und den Datenschutz-Bestimmungen von Google Analytics. Auf Wunsch können Sie Cookies von Google Analytics deaktivieren.

Sie können Cookies auch generell abschalten, folgen Sie dazu den Informationen Ihres Browserherstellers.

Cookie-Einstellungen
Notwendige Cookies

Unerlässlich für grundlegende Funktionen der Website und nicht deaktivierbar.

3 Cookies erkannt.

  • jbcookies (JoomBall!)
    Speichert die vom Nutzer erteilte Zustimmung auf der Website.
  • joomla_user_state (Joomla!)
    Bewahrt den Authentifizierungsstatus des Nutzers.
  • joomla_remember_me_* (Joomla!)
    Hält die Sitzung für den authentifizierten Nutzer gespeichert.
Analyse-Cookies

Sie helfen, die Nutzung zu verstehen und die Leistung zu verbessern.

Für diese Kategorie wurden bisher keine Cookies erkannt.

Marketing-Cookies

Personalisieren die Werbung und messen die Wirksamkeit von Kampagnen.

Für diese Kategorie wurden bisher keine Cookies erkannt.

Nicht klassifizierte Cookies

Cookies, die auf Überprüfung oder automatische Klassifizierung warten.

Für diese Kategorie wurden bisher keine Cookies erkannt.

Main Menu

  • Home
  • SQL-Blog - Technisch
  • SQL-Blog - Allgemein
  • SQL-Tipps
  • SSIS-Tipps
  • T-SQL Scripts
  • ----------------------------------------
  • Reporting - Transparenz und Kontrolle
  • SCOM-basierte SQL Server Dokumentation
  • Standardisierte SQL-Server Installationen
  • AlwaysOn Availability - Automation
  • DeadlockCollector
  • ----------------------------------------
  • HowTo....
  • Beispiel Report
  • Downloads
  • ----------------------------------------
  • Background
  • Datenschutz­erklärung

Impressum

Hinweis zur verantwortlichen Stelle

dtcSoftware
Herrengasse 5
83521 Wasserburg
Telefon: +4915253552640
E-Mail: Janke@dtcsoftware.de