mssSQLTool — Wie kann ich…? SQL-Admin Handout

SQL-Admin Tages-Handout

Wie kann ich…?
mssSQLTool in der Praxis

Praxis-Tipps und fertige Einzeiler für die täglichen Aufgaben des SQL Server-Administrators.

PowerShell 3.0+ dbatools required MS SQL Server v 1.0.0 · dtcSoftware
🔍

Monitoring & täglicher Status-Check

4 Tipps
Wie kann ich den Gesundheitszustand aller Datenbanken prüfen?
Get-mssDatabaseHealth liefert auf einen Blick: Recovery-Modus, letzte Backups, CHECKDB-Status, VLF-Zahl und AutoGrowth-Ereignisse.
Täglicher Gesundheitscheck
Get-mssDatabaseHealth 
# → Schreibt TXT + CSV in den OutputPath
Nur problematische Datenbanken
Get-mssDatabaseHealth -SqlInstance "SQL01" | 
Where-Object { 
$_.Status -ne 'Online' -or 
$_.LastFullBackup -lt (Get-Date).AddDays(-2) -or 
$_.VlfCount -gt 1000 
} | Format-Table DatabaseName, Status, LastFullBackup, VlfCount
Wie kann ich laufende Backup- oder Restore-Vorgänge überwachen?
Get-mssOperationStatus zeigt Fortschritt und Restdauer aktiver Operationen in Echtzeit.
Alle aktiven Operationen
Get-mssOperationStatus
Live-Aktualisierung alle 15 Sekunden
while ($true) { 
Clear-Host 
Get-mssOperationStatus -SqlInstance "SQL01" | 
Format-Table Database, OperationType, 
 PercentComplete, EstTimeRemaining -AutoSize 
Start-Sleep 15 
}
Wie kann ich fehlgeschlagene Agent-Jobs der letzten 24 Stunden sehen?
Get-mssAgentJobHistory filtert nach Status und Zeitraum — ideal für den Morgen-Check.
Alle Fehler der letzten 24 Stunden
Get-mssAgentJobHistory -Status Failure ` 
-Since (Get-Date).AddDays(-1) | 
Format-Table JobName, RunDate, Message -AutoSize
Nur Backup-Jobs prüfen
Get-mssAgentJobHistory -JobName '*Backup*' -Status Failure ` 
-Since (Get-Date).AddDays(-1)
Wie kann ich den freien Speicherplatz aller SQL-Volumes prüfen?
Get-mssDiskSpaceReport berechnet zusätzlich die geschätzte Zeit bis zur Erschöpfung anhand der AutoGrowth-Rate.
Bericht mit 10%-Warnschwelle
Get-mssDiskSpaceReport -SqlInstance "SQL01" -WarnThresholdPct 10 | 
Where-Object Status -eq 'Warning' | 
Sort-Object DaysUntilFull | 
Format-Table VolumeName, FreeGB, DaysUntilFull, Status -AutoSize
Täglich per Scheduled Task ausführen und Warnings per E-Mail versenden!
🔄

AlwaysOn Availability Groups

4 Tipps
Wie kann ich den Status aller AGs auf einen Blick prüfen?
Get-mssAgHealthReport liefert Sync-Status, Redo/Send-Queues und Listener-Info für alle AGs der Instanz.
AG Health Report
Get-mssAgHealthReport 
 
# Kritische Befunde herausfiltern: 
Get-mssAgHealthReport -SqlInstance "SQL01" | 
Where-Object OverallStatus -ne 'Healthy' | 
Format-Table AgName, ReplicaName, DbSyncState, RedoQueueMB
Wie kann ich eine neue Datenbank zur AG hinzufügen?
Invoke-mssAddDatabaseToAvailabilityGroup übernimmt alles: Recovery auf Full setzen, AutoSeed aktivieren, Secondaries bereinigen.
Einzelne Datenbank hinzufügen
Invoke-mssAddDatabaseToAvailabilityGroup ` 
-AvailabilityGroup "AG_Prod" -Database "NeueDB"
Alle User-DBs hinzufügen (sequenziell)
Invoke-mssAddDatabaseToAvailabilityGroup ` 
-AvailabilityGroup "AG_Prod" -All
Wie kann ich Logins, Jobs und Linked Server auf alle Secondaries synchronisieren?
Sync-mssAgNode erkennt Primary automatisch und synchronisiert alle Objekte auf alle Secondaries — ein Befehl genügt.
Vollautomatische Synchronisation
Sync-mssAgNode # erkennt Primary selbst 
Sync-mssAgNode -SqlInstance "SQL01" # explizit
Nur Logins synchronisieren
Sync-mssAgNode -SqlInstance "SQL01" ` 
-ExcludeType Jobs,LinkedServers,Operators,Alerts
Wie kann ich eine out-of-sync AG-Datenbank automatisch reparieren?
Repair-mssAlwaysOnDatabases erkennt defekte AG-Datenbanken vollautomatisch und repariert via Remove → Cleanup → AutoSeed.
Nur problematische DBs reparieren
Repair-mssAlwaysOnDatabases
Regelmäßig per Agent-Job ausführen
# Job erstellen (stündlich): 
New-mssAlwaysOnRepairJob -SqlInstance "SQL01"
Den Repair-Job am besten auf ALLEN AG-Nodes einrichten!
💾

Backup & Restore

3 Tipps
Wie kann ich alle User-Datenbanken schnell sichern?
Invoke-mssUserDatabaseBackup liest den Backup-Pfad automatisch aus den Server-Properties — kein Pfad-Parameter nötig.
Alle Benutzerdatenbanken sichern
Invoke-mssUserDatabaseBackup -All
Bestimmte Datenbanken auf Remote-Server
Invoke-mssUserDatabaseBackup -SqlInstance "SQL01" ` 
-Database "SalesDB","InventoryDB"
Wie kann ich eine Datenbank wiederherstellen — auch in einer AG?
Invoke-mssRestoreDatabase erkennt AG-Mitgliedschaft automatisch, exportiert User vorher und importiert sie nach dem Restore wieder.
Einfacher Restore
Invoke-mssRestoreDatabase -SqlInstance "SQL01" ` 
-BackupFile "D:\Backup\SalesDB.bak" ` 
-DatabaseName "SalesDB"
Full + Diff + Log-Sequenz
$seq = @( 
"D:\Bak\SalesDB_Full.bak", 
"D:\Bak\SalesDB_Diff.bak", 
"D:\Bak\SalesDB_Log.trn" 
) 
Invoke-mssRestoreDatabase -SqlInstance "SQL01" ` 
-BackupFiles $seq -DatabaseName "SalesDB"
Mit Pre-Restore-Backup (Sicherheitsnetz)
Invoke-mssRestoreDatabase -SqlInstance "SQL01" ` 
-BackupFile "D:\Bak\SalesDB.bak" ` 
-DatabaseName "SalesDB" -CreatePreRestoreBackup
Bei AGs wird die DB automatisch ausgetragen und nach dem Restore wieder eingehängt.
Wie kann ich Backup-Dateien auf Gültigkeit prüfen?
Test-mssBackupIntegrity führt RESTORE VERIFYONLY aus — ideal vor dem Einspielen oder als nächtliche Routine.
Alle Backups eines Verzeichnisses verifizieren
Get-ChildItem "D:\Backup\*.bak" | ForEach-Object { 
$ok = Test-mssBackupIntegrity -SqlInstance "SQL01" ` 
-BackupPath $_.FullName 
[PSCustomObject]@{ File = $_.Name; Valid = $ok } 
} | Format-Table -AutoSize

Performance & Wartung

4 Tipps
Wie kann ich fragmentierte Indizes finden und Aktionen empfehlen lassen?
Get-mssIndexFragmentation liefert direkt die Empfehlung: REORGANIZE (5–30 %) oder REBUILD (>30 %). Kein manuelles Schwellen-Management.
Analyse einer Datenbank
Get-mssIndexFragmentation ` 
-Database "SalesDB" -MinFragmentationPercent 10 | 
Sort-Object FragmentationPercent -Descending | 
Format-Table TableName, IndexName, FragmentationPercent, Recommendation
💡 Besser: Ola-Job für IndexOptimize anlegen — dieser erledigt alles automatisch!
Wie kann ich ein aufgeblähtes Transaktions-Log verkleinern?
Invoke-mssLogShrink berechnet die Zielgröße automatisch. Bei Full-Recovery-Datenbanken vorher ein Log-Backup machen!
Log auf 20% schrumpfen (nach Backup)
# 1. Log sichern (bei Full Recovery): 
Backup-DbaDatabase -SqlInstance "SQL01" ` 
-Database "SalesDB" -Type Log -BackupDirectory "D:\Backup" 
 
# 2. Dann shrink: 
Invoke-mssLogShrink -Database "SalesDB" -ShrinkTargetPercent 20
Alle Datenbanken (Testlauf)
Invoke-mssLogShrink -SqlInstance "SQL01" -All -WhatIf
Häufiges Shrinken fragmentiert VLFs. Die Ursache des Wachstums beheben ist besser!
Wie kann ich die TempDB-Konfiguration optimieren?
Get-mssTempDbRecommendation prüft Dateianzahl (= CPU-Kerne, max 8), gleiche Größen, MB-basiertes AutoGrow und separate Volumes.
TempDB analysieren
Get-mssTempDbRecommendation -SqlInstance "SQL01"
Nur Handlungsbedarf anzeigen
Get-mssTempDbRecommendation -SqlInstance "SQL01" | 
Where-Object Status -ne 'OK' | 
Select-Object Status, Messages
Wie richte ich Ola Hallengrens Wartungs-Lösung vollständig ein?
Install-mssOlaMaintenanceSolution + New-mssOlaMaintenanceJobs erledigen Installation und Job-Erstellung in einem Schritt.
Komplettes Onboarding (neuer SQL Server)
# 1. Installieren 
Install-mssOlaMaintenanceSolution -SqlInstance "SQL01" 
 
# 2. Prüfen 
Test-mssOlaInstallation -SqlInstance "SQL01" 
 
# 3. Maintenance-Jobs anlegen 
New-mssOlaMaintenanceJobs -SqlInstance "SQL01" ` 
-ScheduleTime "23:00" -OperatorName "DBAs" 
 
# 4. System-DB-Backup-Job 
New-mssOlaSysDbBackupJob -SqlInstance "SQL01" ` 
-ScheduleTime "20:00" -OperatorName "DBAs"
🔒

Sicherheit & Compliance

3 Tipps
Wie kann ich das SA-Konto sicher verschleiern?
Invoke-mssSaObfuscation erkennt SA über die feste SID 0x01, generiert ein kryptographisch sicheres Kennwort und deaktiviert das Konto.
SA verschleiern und Kennwort sichern
$r = Invoke-mssSaObfuscation -SqlInstance "SQL01" 
# Kennwort SOFORT sicher aufbewahren: 
$r.GeneratedPassword | Out-File ` 
"C:\Secure\sa_pw_$(Get-Date -f 'yyyyMMdd').txt" 
Write-Host "Neuer Name: $($r.NewLoginName)"
Mehrere Instanzen
"SQL01","SQL02","SQL03" | ForEach-Object { 
Invoke-mssSaObfuscation -SqlInstance $_ -ContinueOnError 
} | Select-Object SqlInstance, NewLoginName, Status | Format-Table
Der Befehl prüft selbst, ob ein weiteres aktives sysadmin-Konto vorhanden ist!
Wie kann ich alle sysadmin-Konten auditieren?
Get-mssSysadminAccounts bewertet jeden Login: Expected, Unexpected, BuiltinAdmins, Excluded oder Disabled.
Audit (Systemkonten ausschließen)
Get-mssSysadminAccounts -SqlInstance "SQL01" ` 
-ExcludeLogin "NT SERVICE\*","NT AUTHORITY\*","msssa" ` 
-ExcludeSysAccounts | 
Where-Object Status -in 'Unexpected','BuiltinAdmins' | 
Format-Table LoginName, LoginType, IsEnabled -AutoSize
BUILTIN\Administrators immer separat prüfen — kann sich unbemerkt ändern!
Wie kann ich inaktive Logins und Policy-Verstöße finden?
Invoke-mssLoginAudit prüft CHECK_POLICY, EXPIRATION, MUST_CHANGE, Inaktivität, doppelte SIDs und optional AD-Orphans (erfordert RSAT).
Vollständiger Login-Audit
Invoke-mssLoginAudit -SqlInstance "SQL01" ` 
-InactivityThresholdDays 90 ` 
-MaxPasswordAgeDays 180 ` 
-ExcludeLogin "NT SERVICE\*"
Mit AD-Orphan-Prüfung
Invoke-mssLoginAudit -SqlInstance "SQL01" -CheckAdOrphans
⚙️

Konfiguration & Inventar

4 Tipps
Wie kann ich eine vollständige Instanz-Dokumentation erstellen?
Invoke-mssInstanceInventory dokumentiert alles: Version, Datenbanken, Logins, Jobs, Linked Server, AlwaysOn — in TXT und CSV.
Alle Instanzen inventarisieren
$instances = Get-Content "C:\Admin\sql_instances.txt" 
Invoke-mssInstanceInventory ` 
-SqlInstance $instances -ContinueOnError 
# Dateien in: (Get-mssConfig -Key 'OutputPath')
Als monatlichen Scheduled Task einrichten — Compliance-Nachweis ohne Aufwand!
Wie kann ich zwei SQL Server-Instanzen konfigurativ vergleichen?
Compare-mssServerConfiguration vergleicht sp_configure, Collation, Version und MaxMemory zwischen zwei Instanzen.
Konfigurationsvergleich
Compare-mssServerConfiguration ` 
-SourceInstance "SQL01" -TargetInstance "SQL02" | 
Where-Object { $_.SourceValue -ne $_.TargetValue } | 
Format-Table Setting, SourceValue, TargetValue -AutoSize
Wie kann ich den Recovery-Modus für alle Datenbanken auf einmal setzen?
Invoke-mssSetDatabaseRecoveryMode setzt Simple, Full oder BulkLogged für alle oder ausgewählte User-DBs. Systemdatenbanken automatisch ausgeschlossen.
Alle User-DBs auf Full
Invoke-mssSetDatabaseRecoveryMode -All -RecoveryMode Full
Einzelne DB auf Simple
Invoke-mssSetDatabaseRecoveryMode ` 
-Database "ArchiveDB" -RecoveryMode Simple
Wie kann ich eine gespeicherte Prozedur in allen Datenbanken finden?
Find-mssDatabaseObject durchsucht alle Datenbanken einer Instanz nach Objekten — ideal bei komplexen Umgebungen.
Objekt über alle Datenbanken suchen
Find-mssDatabaseObject -SqlInstance "SQL01" ` 
-ObjectName "sp_GetOrders" | 
Format-Table Database, Schema, ObjectType, ObjectName
Alle Objekte mit OPENQUERY
Find-mssDatabaseObject -SqlInstance "SQL01" ` 
-ObjectName "*" -SearchInDefinition ` 
-SearchText "OPENQUERY"
☑️

Tägliche SQL-Admin Checkliste

Morgen-Routine Alle Instanzen in ~5 Minuten

$instances = "SQL01","SQL02","SQL03" # Anpassen! 
 
# 1. Fehlgeschlagene Agent-Jobs seit gestern 
Get-mssAgentJobHistory -Status Failure -Since (Get-Date).AddDays(-1) | 
Format-Table JobName, RunDate, Message 
 
# 2. Datenbanken ohne aktuelles Backup 
Get-mssDatabaseHealth -SqlInstance $instances -ContinueOnError | 
Where-Object { $_.LastFullBackup -lt (Get-Date).AddDays(-2) } | 
Select-Object SqlInstance, DatabaseName, LastFullBackup 
 
# 3. Disk-Space-Warnung 
Get-mssDiskSpaceReport -SqlInstance $instances -WarnThresholdPct 10 -ContinueOnError | 
Where-Object Status -eq 'Warning' | 
Sort-Object DaysUntilFull | 
Format-Table SqlInstance, VolumeName, FreeGB, DaysUntilFull 
 
# 4. AG-Status (nur AlwaysOn-Umgebungen) 
Get-mssAgHealthReport -SqlInstance $instances[0] | 
Where-Object OverallStatus -ne 'Healthy' | 
Format-Table AgName, ReplicaName, DbSyncState, RedoQueueMB 
 
# 5. Aktive Operationen (läuft noch etwas?) 
Get-mssOperationStatus -SqlInstance $instances[0]

📋 Instanz-Inventar erstellen

Invoke-mssInstanceInventory ` 
-SqlInstance $instances -ContinueOnError

🔒 Sysadmin-Audit durchführen

Get-mssSysadminAccounts -SqlInstance $inst ` 
-ExcludeSysAccounts

🔒 Login-Audit (Policy, Inaktiv)

Invoke-mssLoginAudit -SqlInstance $inst ` 
-CheckAdOrphans

⚡ Best-Practice-Check

Get-mssSQLInstanceCheck ` 
-SqlInstance $inst -Detailed

⚡ TempDB-Konfiguration prüfen

Get-mssTempDbRecommendation ` 
-SqlInstance $inst

💾 Backup-Integrität stichproben

Test-mssBackupIntegrity ` 
-SqlInstance $inst -BackupPath $bak

🔄 AG-Node-Sync (Logins/Jobs)

Sync-mssAgNode -SqlInstance $inst

📋 Linked-Server-Abhängigkeiten

Get-mssLinkedServerUsage ` 
-SqlInstance $inst

⚡ Modul-Setup & Konfiguration

# Modul laden 
Import-Module "C:\Pfad\mssSQLTool\mssSQLTool.psd1" 
 
# Einmalige Konfiguration 
Set-mssConfig ` 
-LogPath "D:\Logs\SQL" ` 
-OutputPath "D:\Reports\SQL" ` 
-CentralPath "\\Fileserver\SQL\Reports" 
 
# Konfiguration prüfen 
Get-mssConfig 
 
# Alle Funktionen anzeigen 
Get-Command -Module mssSQLTool | Sort-Object Name | Format-Table Name

mssSQLTool v1.0.0 · dtcSoftware · Janke · PowerShell 3.0+ · dbatools required