🧰 SQL Server-Wartungstechniken
Ein umfassender Leitfaden, um Ihren Server reibungslos laufen zu lassen – inklusive Ola Hallengren Maintenance Solution und sqmSQLTool
📌 Warum regelmäßige Wartung unverzichtbar ist
GRUNDLAGEN
Ohne proaktive Wartung leidet die Performance, die Fragmentierung steigt, Statistiken veralten, und im Ernstfall fehlen aktuelle Backups. Eine gut geplante Wartungsstrategie vermeidet Ausfallzeiten, beschleunigt Abfragen und schützt Ihre Daten. In diesem Leitfaden finden Sie erprobte Techniken, Skripte und Best Practices für den täglichen, wöchentlichen und monatlichen Betrieb – ergänzt durch zwei leistungsstarke Automatisierungslösungen: die Ola Hallengren Maintenance Solution und das sqmSQLTool.
🎯 Ziel: Einen SQL Server automatisiert, konsistent und sicher zu warten – mit minimalem manuellem Aufwand.
⭐ Ola Hallengren Maintenance Solution – Der Goldstandard für Wartungsautomatisierung
RECOMMENDED
Die Ola Hallengren Maintenance Solution ist eine Sammlung von T-SQL-Skripten, die in der SQL Server-Community als Goldstandard für die Automatisierung von Wartungsaufgaben gilt. Sie ist kostenlos, wird regelmäßig aktualisiert und unterstützt alle SQL Server-Versionen von 2008 bis 2025 sowie Azure SQL-Datenbanken. Die Lösung ersetzt die oft unzureichenden grafischen Wartungspläne durch flexible, leistungsfähige gespeicherte Prozeduren. Sie umfasst die folgenden Kernkomponenten:
IndexOptimize– Indexwartung (REBUILD/REORGANIZE) und StatistikupdatesDatabaseIntegrityCheck– Integritätsprüfungen (DBCC CHECKDB u. a.)DatabaseBackup– Voll-, Differenz- und Transaktionslog-BackupsCommandExecute– Zentrale Ausführungs- und Logging-EngineCommandLog– Tabelle zur detaillierten Protokollierung
🔧 Installations-Hinweis: Die Skripte werden standardmäßig in der
master-Datenbank installiert. Es empfiehlt sich jedoch, eine dedizierte Verwaltungsdatenbank (z. B. DBAUtility) anzulegen, um die Systemdatenbank sauber zu halten.
-- 1. MaintenanceSolution.sql von ola.hallengren.com herunterladen
-- 2. Backup-Pfad im Skript anpassen (Zeile ca. 27)
DECLARE @BackupDirectory nvarchar(max) = N'D:\SQLBackups';
-- 3. Optional: Ziel-Datenbank ändern (nicht master)
USE [DBAUtility]; -- statt USE [master]
-- 4. Skript in SSMS ausführen – es erstellt alle Objekte und Jobs
💡 Alternative Installation mit PowerShell: Das dbatools-Modul bietet das Cmdlet
Install-DbaMaintenanceSolution, das die Installation automatisiert.
⚡ sqmSQLTool – PowerShell-gestützte Administration & Automatisierung
POWERSHELL
Das sqmSQLTool ist eine umfangreiche PowerShell-Toolsammlung, die von dtcSoftware entwickelt wurde und die tägliche SQL Server-Administration massiv erleichtert. Es ergänzt die klassischen Wartungsskripte (wie Ola Hallengren) perfekt, indem es viele Ad-hoc-Aufgaben und wiederkehrende Routineaufgaben über einfache PowerShell-Befehle abbildet. Das Tool ist besonders nützlich für Umgebungen mit vielen Instanzen, Always On Availability Groups oder wenn Sie schnell eine Bestandsaufnahme machen möchten.
Kernfunktionen im Überblick:
- AlwaysOn & Hochverfügbarkeit – Verfügbarkeitsgruppen verwalten, Datenbanken hinzufügen/entfernen, Replikationsstatus prüfen.
- Backup & Restore – Backups anstoßen, Wiederherstellungen durchführen, Integritätsprüfungen nach dem Backup.
- Sicherheit –
sa-Konto verschleiern, Benutzer umbenennen, Berechtigungen analysieren. - Diagnose & Health Check – Datenbank- und Instanz-Gesundheit prüfen, fehlende Indizes erkennen, Blockierungen und Deadlocks aufdecken.
- Performance-Tuning – Fragmentierungsgrad analysieren, Statistiken aktualisieren, lange laufende Abfragen identifizieren.
- Ola Hallengren Integration – Nahtlose Installation und Konfiguration der Maintenance Solution direkt aus PowerShell.
- Inventar & Dokumentation – Servereinstellungen vergleichen, Datenbankmetadaten exportieren, Konfigurationsänderungen nachverfolgen.
# Beispiel: Installation des sqmSQLTool-Moduls (aus PowerShell als Administrator)
Install-Module -Name sqmSQLTool -Force
# AlwaysOn-Status aller Datenbanken abrufen
Get-SqmAvailabilityGroupStatus -SqlInstance 'YourServer'
# Health Check für alle Benutzerdatenbanken
Invoke-SqmDatabaseHealthCheck -SqlInstance 'YourServer'
# Ola Hallengren direkt installieren und konfigurieren
Install-SqmOlaMaintenanceSolution -SqlInstance 'YourServer' -BackupDirectory 'D:\Backups'
📌 Hinweis: Das sqmSQLTool ist als PowerShell-Modul konzipiert und erfordert eine entsprechende Ausführungsumgebung (PowerShell 5.1 oder höher, geeignete Berechtigungen auf dem SQL Server). Es ist kein Ersatz für Ola Hallengren, sondern eine ideale Ergänzung für alle Aufgaben, die über die reine Wartung hinausgehen – etwa Migrationen, Inventur oder Ad-hoc-Analysen.
🌐 Weitere Informationen & Download: Besuchen Sie die offizielle Projektseite unter https://www.powershelldba.de, um die vollständige Dokumentation, Beispiele und aktuelle Versionen des sqmSQLTools zu erhalten. Die Seite bietet auch viele weitere nützliche PowerShell-Ressourcen für Datenbankadministratoren.
🔧 IndexOptimize – Intelligente Index- und Statistikwartung
PERFORMANCE
Die gespeicherte Prozedur
IndexOptimize ersetzt manuelle Indexwartung. Sie analysiert den Fragmentierungsgrad jedes Indexes und führt automatisch die optimale Aktion durch – basierend auf konfigurierbaren Schwellwerten:
- @FragmentationLevel1 = 5 – ab 5 % Fragmentierung (Medium): REORGANIZE
- @FragmentationLevel2 = 30 – ab 30 % Fragmentierung (Hoch): REBUILD (online, falls möglich)
- @UpdateStatistics = 'ALL' – Statistiken für alle Indizes und Spalten aktualisieren
- @OnlyModifiedStatistics = 'Y' – Nur geänderte Statistiken aktualisieren (ressourcenschonend)
-- Indexwartung für alle Benutzerdatenbanken mit Standard-Schwellwerten
EXECUTE dbo.IndexOptimize
@Databases = 'USER_DATABASES',
@FragmentationLow = NULL,
@FragmentationMedium = 'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationLevel1 = 5,
@FragmentationLevel2 = 30,
@UpdateStatistics = 'ALL',
@OnlyModifiedStatistics = 'Y',
@LogToTable = 'Y';
-- Variante: Nur Statistikupdates (keine Indexwartung)
EXECUTE dbo.IndexOptimize
@Databases = 'USER_DATABASES',
@FragmentationLow = NULL,
@FragmentationMedium = NULL,
@FragmentationHigh = NULL,
@UpdateStatistics = 'ALL',
@OnlyModifiedStatistics = 'Y';
⚠️ Online-Rebuild beachten: Online-Rebuilds sind nur in der Enterprise Edition verfügbar. In der Standard Edition wird automatisch auf Offline-Rebuild umgeschaltet. Planen Sie Indexwartung daher in Wartungsfenstern.
🛡️ DatabaseIntegrityCheck – Integritätsprüfung mit DBCC CHECKDB
KORRUPTION
DatabaseIntegrityCheck führt standardmäßig DBCC CHECKDB aus – die umfassendste Integritätsprüfung einer Datenbank. Sie kann aber auch auf bestimmte Prüfbefehle beschränkt werden:
- CHECKDB – Vollständige Prüfung der Datenbank (Standard)
- CHECKFILEGROUP – Prüfung einzelner Dateigruppen
- CHECKTABLE – Prüfung bestimmter Tabellen
- CHECKALLOC – Prüfung der Speicherzuweisungsstrukturen
- CHECKCATALOG – Prüfung der Katalogkonsistenz
Für sehr große Datenbanken (> 1 TB) kann die Option
@PhysicalOnly = 'Y' die Laufzeit drastisch reduzieren, da nur die physische Konsistenz geprüft wird – logische Prüfungen entfallen.
-- Vollständige CHECKDB-Prüfung für alle Benutzerdatenbanken
EXECUTE dbo.DatabaseIntegrityCheck
@Databases = 'USER_DATABASES',
@CheckCommands = 'CHECKDB',
@LogToTable = 'Y';
-- Physische Prüfung (schneller, aber weniger gründlich)
EXECUTE dbo.DatabaseIntegrityCheck
@Databases = 'USER_DATABASES',
@CheckCommands = 'CHECKDB',
@PhysicalOnly = 'Y';
-- Nur Katalogkonsistenz prüfen
EXECUTE dbo.DatabaseIntegrityCheck
@Databases = 'USER_DATABASES',
@CheckCommands = 'CHECKCATALOG';
🚨 Wichtig: Führen Sie eine vollständige CHECKDB mindestens wöchentlich durch. Nur so erkennen Sie Korruptionen frühzeitig, bevor sie sich ausbreiten. Bei Feststellung von Fehlern ist die Wiederherstellung aus einem intakten Backup die sicherste Methode.
💾 DatabaseBackup – Vollautomatisierte Backup-Strategie
NOTFALL
DatabaseBackup ist eine hochflexible Backup-Prozedur, die native SQL-Backups erstellt und dabei intelligente Logik für Always On Availability Groups, Spiegelung und verschiedene Wiederherstellungsmodelle bietet. Die wichtigsten Parameter:
- @BackupType = 'FULL' | 'DIFF' | 'LOG' – Art des Backups
- @Compress = 'Y' – Komprimierung (spart Platz und I/O)
- @Verify = 'Y' – Prüft die Backup-Integrität nach der Erstellung
- @CleanupTime = 168 – Löscht Backups älter als 168 Stunden (7 Tage)
- @Encrypt = 'Y' – Verschlüsselung für sensible Daten (ab SQL Server 2014)
-- Voll-Backup aller Benutzerdatenbanken (komprimiert, verifiziert)
EXECUTE dbo.DatabaseBackup
@Databases = 'USER_DATABASES',
@BackupType = 'FULL',
@Compress = 'Y',
@Verify = 'Y',
@LogToTable = 'Y';
-- Differenzielles Backup (jede 6 Stunden)
EXECUTE dbo.DatabaseBackup
@Databases = 'USER_DATABASES',
@BackupType = 'DIFF',
@Compress = 'Y';
-- Log-Backup alle 15 Minuten (nur bei FULL Recovery Model)
EXECUTE dbo.DatabaseBackup
@Databases = 'USER_DATABASES',
@BackupType = 'LOG',
@Compress = 'Y';
📌 Backup-Ziel: Definieren Sie im Skript den Parameter
@BackupDirectory vor der Installation. Verwenden Sie ein separates Laufwerk oder eine Netzwerkfreigabe, niemals das gleiche Volume wie die Datenbankdateien.
📊 CommandLog – Zentrale Protokollierung und Fehlerüberwachung
MONITORING
Alle drei Hauptprozeduren (IndexOptimize, DatabaseIntegrityCheck, DatabaseBackup) protokollieren ihre Ausführung in die Tabelle
dbo.CommandLog, wenn @LogToTable = 'Y' gesetzt ist. Die Tabelle enthält Start- und Endzeiten, den ausgeführten Befehl, die betroffene Datenbank sowie Fehlernummern und -meldungen. Eine regelmäßige Überwachung des CommandLog ist essenziell.
-- Fehlerhafte Ausführungen der letzten 7 Tage anzeigen
SELECT
ID,
DatabaseName,
CommandType,
StartTime,
EndTime,
ErrorNumber,
ErrorMessage
FROM dbo.CommandLog
WHERE ErrorNumber > 0
AND StartTime >= DATEADD(day, -7, GETDATE())
ORDER BY StartTime DESC;
-- Durchschnittliche Laufzeit der Indexwartung pro Datenbank
SELECT
DatabaseName,
AVG(DATEDIFF(second, StartTime, EndTime)) AS AvgDurationSeconds,
COUNT(*) AS ExecutionCount
FROM dbo.CommandLog
WHERE CommandType = 'INDEX_REBUILD'
AND StartTime >= DATEADD(day, -30, GETDATE())
GROUP BY DatabaseName
ORDER BY AvgDurationSeconds DESC;
💡 Best Practice: Richten Sie einen SQL Server Agent-Job ein, der das CommandLog täglich auf Fehler prüft und bei Bedarf eine E-Mail-Benachrichtigung versendet.
⏱️ Empfohlene Zeitpläne für die Automatisierungs-Jobs
BEST PRACTICES
Die Maintenance Solution erstellt standardmäßig mehrere SQL Server Agent-Jobs. Diese sollten an die individuellen Anforderungen Ihrer Umgebung angepasst werden.
📅 Bewährte Zeitplan-Empfehlungen:
- DatabaseBackup – FULL: Täglich um Mitternacht (z. B. 00:00 Uhr)
- DatabaseBackup – DIFF: Alle 4–6 Stunden (z. B. 06:00, 12:00, 18:00)
- DatabaseBackup – LOG: Alle 15–30 Minuten (bei FULL Recovery Model)
- DatabaseIntegrityCheck: Wöchentlich am Wochenende (z. B. Sonntag 02:00)
- IndexOptimize: Nächtlich/Wöchentlich – je nach Änderungsrate (z. B. Sonntag 03:00)
- CommandLog Cleanup & Output File Cleanup: Wöchentlich (z. B. Montag 04:00)
🧠 Tipp: Erwägen Sie eine Aufteilung: Statistikupdates täglich (schnell), Indexwartung nur am Wochenende. So bleibt der Server unter der Woche performant.
⚙️ Komplettlösung – Die drei Prozeduren im Zusammenspiel
ALL-IN-ONE
Für einen vollständig gewarteten SQL Server sollten Sie alle drei Kernprozeduren einsetzen. Der folgende Code zeigt eine typische nächtliche Wartung – zuerst die Integritätsprüfung, dann Indexwartung und abschließend ein Vollbackup.
-- Job-Step 1: Integritätsprüfung (CheckDB)
EXECUTE dbo.DatabaseIntegrityCheck
@Databases = 'USER_DATABASES',
@LogToTable = 'Y';
-- Job-Step 2: Index- und Statistikwartung
EXECUTE dbo.IndexOptimize
@Databases = 'USER_DATABASES',
@FragmentationLow = NULL,
@FragmentationMedium = 'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationLevel1 = 5,
@FragmentationLevel2 = 30,
@UpdateStatistics = 'ALL',
@OnlyModifiedStatistics = 'Y',
@LogToTable = 'Y';
-- Job-Step 3: Voll-Backup aller Benutzerdatenbanken
EXECUTE dbo.DatabaseBackup
@Databases = 'USER_DATABASES',
@BackupType = 'FULL',
@Compress = 'Y',
@Verify = 'Y',
@LogToTable = 'Y';
🚀 Erweiterte Konfigurationsmöglichkeiten: Passen Sie die Skripte weiter an: Parallelverarbeitung mit @DatabasesInParallel, SortInTempdb für große Indexrebuilds, MaxDOP zur Steuerung der CPU-Auslastung oder Backup zu Azure Blob Storage (@URL).
✅ Wöchentliche & monatliche Wartungs-Checkliste
BEST PRACTICES
- Täglich: Prüfung der Backup-Logs, Überwachung des freien Speicherplatzes, Kontrolle fehlgeschlagener Agent-Jobs.
- Wöchentlich: DBCC CHECKDB auf allen Benutzerdatenbanken, Indexwartung (je nach Fragmentierung), Aktualisierung der Statistiken, Wiederherstellungstest einer Sicherung.
- Monatlich: Überprüfung der Indexwartungsstrategie, Analyse der Wartezeiten (DMVs), Überprüfung der Datenbankdateigrößen, Planung von Wartungsfenstern für größere Änderungen (z. B. REBUILD mit OFFLINE).
- Vierteljährlich: Überprüfung der Serverkonfiguration (max. Grad der Parallelität, Cost Threshold for Parallelism), Auswertung des Pufferpools, Prüfen auf verwaiste Benutzer in Datenbanken.
📝 Dokumentation: Halten Sie Ihre Wartungsroutinen, Wiederherstellungspläne und Kontaktdaten im Notfall in einem zentralen Wiki fest – das spart im Ernstfall wertvolle Minuten.
⚠️ Häufige Fallstricke – und wie Sie sie umgehen
PRAXISIRRTÜMER
- ❌ Indexwartung nur mit REBUILD → Besser REORGANIZE bei geringer Fragmentierung nutzen, um Log-Wachstum zu vermeiden.
- ❌ Statistiken nie aktualisieren → Veraltete Statistiken ruinieren die Performance. Automatisieren Sie das Update (z. B. täglich).
- ❌ DBCC CHECKDB nur auf der Produktion, nie auf dem Backup → Testen Sie regelmäßig die Wiederherstellung und führen Sie CHECKDB auf dem wiederhergestellten Testserver aus.
- ❌ Volles Backup ohne Log-Backups im vollständigen Protokollierungsmodell → Das Log wächst unendlich. Planen Sie regelmäßige Log-Backups.
- ❌ Keine Überwachung von Job-Fehlern → Sie merken erst etwas, wenn alles stillsteht. Implementieren Sie Alerts (z. B. über das CommandLog).
🚀 Letzter Tipp: Testen Sie Ihre Wartungsskripte zuerst in einer Nicht-Produktionsumgebung. Ein falscher Index-REBUILD kann große Tabellen sperren und den Betrieb lahmlegen.