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 TippsWie 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 TippsWie 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 TippsWie 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 TippsWie 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 TippsWie 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 TippsWie 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