Das SQL Server AlwaysOn Setup Tool ist ein PowerShell-Script mit WinForms-Oberfläche, das alle Schritte zur Einrichtung einer Always On Availability Group (AG) auf einem bestehenden Windows Server Failover Cluster (WSFC) automatisiert. Es liest Cluster- und SQL-Informationen automatisch ein, präsentiert diese im PropertyGrid zur Überprüfung, und führt nach Bestätigung alle Konfigurationsschritte durch.
1. Übersicht und Konfigurationsschritte
Das Tool führt die folgenden neun Schritte in dieser Reihenfolge aus. Übersprungene Schritte werden im Log ausgewiesen.
| Schritt | Bezeichnung | Beschreibung |
|---|---|---|
| 1 | SQL-Service-Konto | Optional: Konto und Passwort per WMI auf allen Nodes ändern und Dienst neu starten |
| 2 | HADR aktivieren | Always On per sp_configure 'hadr enabled', 1 auf allen Nodes; Dienst-Neustart mit aktivem Bereitschaftstest |
| 3 | Endpoint erstellen | Datenbankspiegelungs-Endpoint (Port 5022) per T-SQL anlegen und starten |
| 4 | CONNECT-Berechtigung | Windows-Login anlegen, GRANT CONNECT ON ENDPOINT auf alle Nodes |
| 5 | Testdatenbank | Datenbank anlegen, Recovery-Modell FULL setzen, initiales Full-Backup erstellen |
| 6 | Availability Group | AG per reinem T-SQL (sqlcmd) anlegen, Replicas beitreten, Autoseed aktivieren |
| 7 | Listener | AG-Listener mit IP-Adresse und Port per ALTER AVAILABILITY GROUP |
| 8 | Status | AG-Synchronisierungsstatus und Replica-Rollen per DMV ausgeben |
| 9 | SPN-Prüfung | Fehlende MSSQLSvc-SPNs erkennen, setspn-Befehle als Textdatei für das AD-Team exportieren |
2. Voraussetzungen
Infrastruktur
- Windows Server 2022 oder neuer auf allen Cluster-Nodes
- SQL Server 2022 oder neuer (Enterprise oder Standard Edition)
- Bestehender Windows Server Failover Cluster (WSFC) mit 2 oder 3 Nodes
- Gemeinsamer Backup-Share (UNC), beschreibbar von allen Nodes
- Port 5022 zwischen allen Nodes geöffnet (HADR Endpoint)
Berechtigungen
- Lokaler Administrator auf dem ausführenden Cluster-Node
- SQL Server
sysadmin-Rolle auf allen Nodes - Domänen-Leserecht (für SPN-Prüfung in Schritt 9)
- PowerShell als Administrator (
#Requires -RunAsAdministrator)
PowerShell-Module
| Modul | Installation | Hinweis |
|---|---|---|
FailoverClusters | RSAT-Clustering-PowerShell | Wird vom Script automatisch installiert |
dbaTools >= 2.0 | Install-Module dbatools | Wird automatisch installiert; bereits geladene Version wird nicht neu importiert |
Invoke-DbaQuery (T-SQL-Ausführung mit Credential-Support) und Connect-DbaInstance (Verbindungstest). Alle anderen Operationen laufen über direktes T-SQL (sqlcmd), WMI (Win32_Service) oder FailoverClusters-Cmdlets – um Versionsabhängigkeiten und interne Seiteneffekte zu vermeiden.
3. Bedienung
Start
- PowerShell ISE oder PowerShell 5.1+ als Administrator öffnen
- Script
SetupAlwaysOn.ps1ausführen - Das Tool prüft Module, liest Cluster-Informationen automatisch ein
- Erkannte Werte erscheinen im PropertyGrid (linke Seite der Oberfläche)
PropertyGrid – Konfigurationsfelder
| Feld | Kategorie | Beschreibung |
|---|---|---|
| AG-Name | 3 – AG | Name der Availability Group (= WSFC-Rollenname) |
| Listener-Name | 3 – AG | DNS-Name des AG-Listeners |
| Listener-IP | 3 – AG | IP-Adresse des Listeners (aus Cluster übernommen) |
| Listener-Port | 3 – AG | TCP-Port des Listeners (Standard: 1433) |
| Endpoint-Port | 3 – AG | HADR Endpoint Port (Standard: 5022) |
| Failover-Modus | 3 – AG | Automatic = synchron mit auto. Failover; Manual = asynchron |
| Backup-Präferenz | 3 – AG | Primary / Secondary / PreferSecondary / None (Standard: Primary) |
| Test-Datenbank | 3 – AG | Name der in die AG aufzunehmenden Datenbank |
| Backup-Share | 4 – Backup | UNC-Pfad für das initiale Full-Backup |
| Service-Konto | 2 – Dienst | SQL-Dienstkonto (automatisch erkannt, optional änderbar) |
Ablauf nach dem Start
4. Service Principal Names (SPNs)
Service Principal Names (SPNs) sind Einträge im Active Directory, die SQL Server ermöglichen, Kerberos-Authentifizierung zu verwenden. Fehlen die SPNs, erscheint der Fehler „Cannot generate SSPI context" und Windows-Auth schlägt fehl.
Auswirkung fehlender SPNs
| Situation | Auswirkung | Ablauf |
|---|---|---|
| SPNs gesetzt ✓ | Windows-Auth (Kerberos) auf allen Nodes | Vollautomatischer Durchlauf, kein manueller Eingriff |
| SPNs fehlen ✗ | SSPI-Fehler auf betroffenen Nodes | Tool pausiert → T-SQL-Block anzeigen → manuell ausführen → Weiter → Fortsetzung per SQL-Auth |
Benötigte SPNs
Je Node und für den Listener-Namen sind zwei SPNs erforderlich (Kurzname und FQDN):
# Je SQL-Node – Kurzname und FQDN setspn -S MSSQLSvc/SQLNODE01:1433 DOMAIN\SQLServiceAccount setspn -S MSSQLSvc/SQLNODE01.domain.com:1433 DOMAIN\SQLServiceAccount setspn -S MSSQLSvc/SQLNODE02:1433 DOMAIN\SQLServiceAccount setspn -S MSSQLSvc/SQLNODE02.domain.com:1433 DOMAIN\SQLServiceAccount # AG-Listener setspn -S MSSQLSvc/AG-LISTENER:1433 DOMAIN\SQLServiceAccount setspn -S MSSQLSvc/AG-LISTENER.domain.com:1433 DOMAIN\SQLServiceAccount # Prüfung nach dem Setzen: setspn -L DOMAIN\SQLServiceAccount
Das Tool generiert in Schritt 9 automatisch die konkreten setspn-Befehle und speichert sie als Textdatei:
C:\System\WinSrvLog\MSSQL\AlwaysOn_SPN_ADTeam_<Datum>.txt
Ablauf wenn SPNs fehlen
5. Ausgaben und Logdateien
Farbcodierung im Live-Log
| Farbe | Bedeutung |
|---|---|
| Blau (fett) | Abschnittsüberschrift (=== ... ===) |
| Hellgrün (fett) | Erfolg – Aktion erfolgreich abgeschlossen |
| Gelb | Warnung – Aktion übersprungen oder Hinweis |
| Rot (fett) | Fehler – Aktion fehlgeschlagen |
| Hellgrau | Information – allgemeine Statusmeldung |
Gespeicherte Dateien
Alle Dateien werden automatisch unter C:\System\WinSrvLog\MSSQL\ gespeichert.
| Datei | Inhalt | Zeitpunkt |
|---|---|---|
AlwaysOn_ClusterSettings_<Datum>.txt | Cluster-Konfiguration, AG-Parameter, Node-Status – Backup vor Änderungen | Vor Schritt 1 |
AlwaysOn_Setup_<Datum>.log | Vollständiges Text-Log aller Schritte mit Zeitstempeln | Nach Abschluss |
AlwaysOn_Setup_<Datum>.rtf | Farbiges RTF-Log (über Schaltfläche im Tool speicherbar) | Manuell |
AlwaysOn_SPN_ADTeam_<Datum>.txt | Fertige setspn-Befehle für das AD-Team mit Erklärung und Prüfbefehl | Schritt 9 |
6. Fehlerbehebung
| Fehlermeldung | Ursache | Lösung |
|---|---|---|
Cannot generate SSPI context |
SPNs für den Node fehlen im Active Directory | Kurzfristig: manuellen SQL-Login-Schritt im Tool durchführen. Langfristig: SPNs durch AD-Team setzen lassen |
WSFC group … already exists |
Überrest eines fehlgeschlagenen Setup-Versuchs | Tool bereinigt automatisch: Remove-ClusterGroup + Registry-Key HadrAgNameToldMap auf allen Nodes |
Login failed for user AGSetup_… |
SQL Server nicht im Mixed Mode oder Password-Policy blockiert | Mixed Mode in SSMS prüfen: Server Properties → Security → SQL Server and Windows Authentication mode |
Backup-Verzeichnis nicht erreichbar |
UNC-Pfad ungültig oder keine Schreibrechte | Pfad im PropertyGrid korrigieren; muss von allen Nodes beschreibbar sein |
Endpoint-Port 5022 bereits belegt |
Bestehender Endpoint oder Firewall blockiert den Port | SELECT * FROM sys.endpoints WHERE type=4 ausführen; Port im PropertyGrid anpassen |
AG nach 60s noch nicht sichtbar |
SQL Server nach HADR-Aktivierung noch nicht vollständig initialisiert | Tool wartet aktiv per SELECT 1 (max. 2 Minuten). Bei Timeout Dienst manuell prüfen |
7. Technische Details
Verbindungsstrategie
Einlesen: Windows-Auth per WMI für Dienst-Informationen; T-SQL für HADR-Status.
Konfiguration: Windows-Auth (Kerberos) auf allen Nodes testen. Bei SSPI-Fehler → temporäres SQL-Login mit kryptografisch zufälligem Passwort (28 Zeichen, RNGCryptoServiceProvider).
Cleanup: Temporäres Login nach Abschluss auf allen Nodes automatisch gelöscht, Policy reaktiviert.
AG-Anlage per sqlcmd
Für CREATE AVAILABILITY GROUP und alle AG-Join-Befehle wird sqlcmd direkt verwendet statt Invoke-DbaQuery. Grund: Nach dem Dienst-Neustart in Schritt 2 hält dbaTools intern gecachte Verbindungen, über die sys.availability_groups noch leer erscheint. sqlcmd öffnet bei jedem Aufruf eine frische TCP-Verbindung.
WSFC-Cleanup bei wiederholten Versuchen
Das Tool prüft vor der AG-Anlage ob eine verwaiste WSFC-Gruppe existiert und bereinigt automatisch:
Stop-ClusterGroup+Remove-ClusterGroup -RemoveResources -Force- Registry-Key
HKLM:\Cluster\HadrAgNameToldMapauf allen Nodes perInvoke-Commandbereinigen
Sicherheit
- Temporäres SQL-Login: kryptografisch zufälliges Passwort, ausschließlich T-SQL-sichere Sonderzeichen
- Passwort wird nie in Logdateien gespeichert – nur im RTF-Fenster der laufenden Sitzung sichtbar
- Policy Enforce Password Policy wird nur für die Dauer der Login-Anlage deaktiviert
- Login und Policy werden am Ende garantiert zurückgesetzt
Ein Beispiel-Report erstellt mit Export-mssDatabaseDocumentation aus den mssSQLTool....
📊 Datenbank-Dokumentation
📈 AlwaysOnTest
NormalAllgemeine Eigenschaften
Letzte Backups
| Typ | LetzteAusführung | AgeTage |
|---|---|---|
| Full (D) | 2026-03-20 13:08 | 35 |
| Diff (I) | - | - |
| Log (L) | n/a (Simple Recovery) | - |
✓ Letzte DBCC CHECKDB: 1900-01-01 00:00 (vor 46135 Tagen)
Datenbankdateien
| Dateigruppe | Dateiname | Typ | Größe (MB) | Autogrow | Pfad |
|---|---|---|---|---|---|
| PRIMARY | AlwaysOnTest | Data | 8 | 64 MB | C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\AlwaysOnTest.mdf |
| LOG | AlwaysOnTest_log | Log | 8 | 64 MB | C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\AlwaysOnTest_log.ldf |
Objekt-Zusammenfassung
Datenbank-User
Keine Benutzer gefunden.
📈 amazon
NormalAllgemeine Eigenschaften
Letzte Backups
| Typ | LetzteAusführung | AgeTage |
|---|---|---|
| Full (D) | 2026-03-20 12:15 | 35 |
| Diff (I) | - | - |
| Log (L) | n/a (Simple Recovery) | - |
✓ Letzte DBCC CHECKDB: 1900-01-01 00:00 (vor 46135 Tagen)
Datenbankdateien
| Dateigruppe | Dateiname | Typ | Größe (MB) | Autogrow | Pfad |
|---|---|---|---|---|---|
| PRIMARY | amazon | Data | 8 | 64 MB | C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\amazon.mdf |
| LOG | amazon_log | Log | 8 | 64 MB | C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\amazon_log.ldf |
Objekt-Zusammenfassung
Datenbank-User
Keine Benutzer gefunden.
📈 dtcSN
NormalAllgemeine Eigenschaften
Letzte Backups
| Typ | LetzteAusführung | AgeTage |
|---|---|---|
| Full (D) | 2026-03-20 12:15 | 35 |
| Diff (I) | - | - |
| Log (L) | n/a (Simple Recovery) | - |
✓ Letzte DBCC CHECKDB: 1900-01-01 00:00 (vor 46135 Tagen)
Datenbankdateien
| Dateigruppe | Dateiname | Typ | Größe (MB) | Autogrow | Pfad |
|---|---|---|---|---|---|
| PRIMARY | dtcSN | Data | 8 | 64 MB | C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\dtcSN.mdf |
| LOG | dtcSN_log | Log | 8 | 64 MB | C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\dtcSN_log.ldf |
Objekt-Zusammenfassung
Datenbank-User
Keine Benutzer gefunden.
📈 Eilinfo_New_Prod
NormalAllgemeine Eigenschaften
Letzte Backups
| Typ | LetzteAusführung | AgeTage |
|---|---|---|
| Full (D) | 2026-03-20 12:15 | 35 |
| Diff (I) | - | - |
| Log (L) | n/a (Simple Recovery) | - |
✓ Letzte DBCC CHECKDB: 1900-01-01 00:00 (vor 46135 Tagen)
Datenbankdateien
| Dateigruppe | Dateiname | Typ | Größe (MB) | Autogrow | Pfad |
|---|---|---|---|---|---|
| PRIMARY | Eilinfo_New_Prod | Data | 8 | 64 MB | C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\Eilinfo_New_Prod.mdf |
| LOG | Eilinfo_New_Prod_log | Log | 8 | 64 MB | C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\Eilinfo_New_Prod_log.ldf |
Objekt-Zusammenfassung
Datenbank-User
Keine Benutzer gefunden.
📈 FSQL
NormalAllgemeine Eigenschaften
Letzte Backups
| Typ | LetzteAusführung | AgeTage |
|---|---|---|
| Full (D) | 2026-04-03 19:47 | 21 |
| Diff (I) | - | - |
| Log (L) | n/a (Simple Recovery) | - |
✓ Letzte DBCC CHECKDB: 2024-05-26 06:15 (vor 698 Tagen)
Datenbankdateien
| Dateigruppe | Dateiname | Typ | Größe (MB) | Autogrow | Pfad |
|---|---|---|---|---|---|
| PRIMARY | FSQL | Data | 128 | 128 MB | C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\FSQL.mdf |
| LOG | FSQL_log | Log | 64 | 64 MB | C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\FSQL_log.ldf |
Objekt-Zusammenfassung
Datenbank-User
| Benutzername | Typ | LoginName | ErstelltAm |
|---|---|---|---|
| FITSSQL | SQL_USER | (kein Login) | 20.03.2024 23:21:40 |
| NT AUTHORITY\SYSTEM | WINDOWS_USER | NT-AUTORITÄT\SYSTEM | 09.10.2018 17:44:32 |
📈 OperationsManagerDW
NormalAllgemeine Eigenschaften
Letzte Backups
| Typ | LetzteAusführung | AgeTage |
|---|---|---|
| Full (D) | 2026-03-20 12:15 | 35 |
| Diff (I) | - | - |
| Log (L) | n/a (Simple Recovery) | - |
✓ Letzte DBCC CHECKDB: 1900-01-01 00:00 (vor 46135 Tagen)
Datenbankdateien
| Dateigruppe | Dateiname | Typ | Größe (MB) | Autogrow | Pfad |
|---|---|---|---|---|---|
| PRIMARY | OperationsManagerDW | Data | 8 | 64 MB | C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\OperationsManagerDW.mdf |
| LOG | OperationsManagerDW_log | Log | 8 | 64 MB | C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\OperationsManagerDW_log.ldf |
Objekt-Zusammenfassung
Datenbank-User
Keine Benutzer gefunden.
📈 ReportServer
NormalAllgemeine Eigenschaften
Letzte Backups
| Typ | LetzteAusführung | AgeTage |
|---|---|---|
| Full (D) | (kein Backup gefunden) | - |
| Diff (I) | - | - |
| Log (L) | n/a (Simple Recovery) | - |
✓ Letzte DBCC CHECKDB: 1900-01-01 00:00 (vor 46135 Tagen)
Datenbankdateien
| Dateigruppe | Dateiname | Typ | Größe (MB) | Autogrow | Pfad |
|---|---|---|---|---|---|
| PRIMARY | ReportServer | Data | 72 | 64 MB | C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\ReportServer.mdf |
| LOG | ReportServer_log | Log | 72 | 64 MB | C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\ReportServer_log.ldf |
Objekt-Zusammenfassung
Datenbank-User
| Benutzername | Typ | LoginName | ErstelltAm |
|---|---|---|---|
| NT SERVICE\SQLServerReportingServices | WINDOWS_USER | NT SERVICE\SQLServerReportingServices | 20.04.2026 17:58:22 |
📈 ReportServerTempDB
NormalAllgemeine Eigenschaften
Letzte Backups
| Typ | LetzteAusführung | AgeTage |
|---|---|---|
| Full (D) | (kein Backup gefunden) | - |
| Diff (I) | - | - |
| Log (L) | n/a (Simple Recovery) | - |
✓ Letzte DBCC CHECKDB: 1900-01-01 00:00 (vor 46135 Tagen)
Datenbankdateien
| Dateigruppe | Dateiname | Typ | Größe (MB) | Autogrow | Pfad |
|---|---|---|---|---|---|
| PRIMARY | ReportServerTempDB | Data | 8 | 64 MB | C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\ReportServerTempDB.mdf |
| LOG | ReportServerTempDB_log | Log | 8 | 64 MB | C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\ReportServerTempDB_log.ldf |
Objekt-Zusammenfassung
Datenbank-User
| Benutzername | Typ | LoginName | ErstelltAm |
|---|---|---|---|
| NT SERVICE\SQLServerReportingServices | WINDOWS_USER | NT SERVICE\SQLServerReportingServices | 20.04.2026 17:58:22 |
📈 Solutioninfo
NormalAllgemeine Eigenschaften
Letzte Backups
| Typ | LetzteAusführung | AgeTage |
|---|---|---|
| Full (D) | 2026-03-20 12:15 | 35 |
| Diff (I) | - | - |
| Log (L) | n/a (Simple Recovery) | - |
✓ Letzte DBCC CHECKDB: 1900-01-01 00:00 (vor 46135 Tagen)
Datenbankdateien
| Dateigruppe | Dateiname | Typ | Größe (MB) | Autogrow | Pfad |
|---|---|---|---|---|---|
| PRIMARY | Solutioninfo | Data | 8 | 64 MB | C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\Solutioninfo.mdf |
| LOG | Solutioninfo_log | Log | 8 | 64 MB | C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\Solutioninfo_log.ldf |
Objekt-Zusammenfassung
Datenbank-User
Keine Benutzer gefunden.
📈 SolutioninfoSTA
NormalAllgemeine Eigenschaften
Letzte Backups
| Typ | LetzteAusführung | AgeTage |
|---|---|---|
| Full (D) | 2026-03-20 12:15 | 35 |
| Diff (I) | - | - |
| Log (L) | n/a (Simple Recovery) | - |
✓ Letzte DBCC CHECKDB: 1900-01-01 00:00 (vor 46135 Tagen)
Datenbankdateien
| Dateigruppe | Dateiname | Typ | Größe (MB) | Autogrow | Pfad |
|---|---|---|---|---|---|
| PRIMARY | SolutioninfoSTA | Data | 8 | 64 MB | C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\SolutioninfoSTA.mdf |
| LOG | SolutioninfoSTA_log | Log | 8 | 64 MB | C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\SolutioninfoSTA_log.ldf |
Objekt-Zusammenfassung
Datenbank-User
Keine Benutzer gefunden.
📈 SSISDB
NormalAllgemeine Eigenschaften
Letzte Backups
| Typ | LetzteAusführung | AgeTage |
|---|---|---|
| Full (D) | 2026-03-20 12:15 | 35 |
| Diff (I) | - | - |
| Log (L) | n/a (Simple Recovery) | - |
✓ Letzte DBCC CHECKDB: 1900-01-01 00:00 (vor 46135 Tagen)
Datenbankdateien
| Dateigruppe | Dateiname | Typ | Größe (MB) | Autogrow | Pfad |
|---|---|---|---|---|---|
| PRIMARY | data | Data | 40 | 10 % | C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\SSISDB.mdf |
| LOG | log | Log | 61,9 | 10 % | C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\SSISDB.ldf |
Objekt-Zusammenfassung
Datenbank-User
| Benutzername | Typ | LoginName | ErstelltAm |
|---|---|---|---|
| ##MS_SSISServerCleanupJobUser## | SQL_USER | ##MS_SSISServerCleanupJobLogin## | 27.05.2025 11:24:36 |
| AllSchemaOwner | SQL_USER | (kein Login) | 08.10.2022 06:30:32 |
📈 TestDB
NormalAllgemeine Eigenschaften
Letzte Backups
| Typ | LetzteAusführung | AgeTage |
|---|---|---|
| Full (D) | 2026-03-20 12:15 | 35 |
| Diff (I) | - | - |
| Log (L) | n/a (Simple Recovery) | - |
✓ Letzte DBCC CHECKDB: 1900-01-01 00:00 (vor 46135 Tagen)
Datenbankdateien
| Dateigruppe | Dateiname | Typ | Größe (MB) | Autogrow | Pfad |
|---|---|---|---|---|---|
| HISTORY | HistoryData | Data | 8 | 64 MB | C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\TesDB_2.mdf |
| PRIMARY | TestDB | Data | 8 | 64 MB | C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\TestDB.mdf |
| LOG | TestDB_log | Log | 8 | 64 MB | C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\TestDB_log.ldf |
Objekt-Zusammenfassung
Datenbank-User
Keine Benutzer gefunden.
Wie kann ich…?
mssSQLTool in der Praxis
Praxis-Tipps und fertige Einzeiler für die täglichen Aufgaben des SQL Server-Administrators.
Monitoring & täglicher Status-Check
4 TippsGet-mssDatabaseHealth # → Schreibt TXT + CSV in den OutputPath
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
Get-mssOperationStatus
while ($true) { Clear-Host Get-mssOperationStatus -SqlInstance "SQL01" | Format-Table Database, OperationType, PercentComplete, EstTimeRemaining -AutoSize Start-Sleep 15 }
Get-mssAgentJobHistory -Status Failure ` -Since (Get-Date).AddDays(-1) | Format-Table JobName, RunDate, Message -AutoSize
Get-mssAgentJobHistory -JobName '*Backup*' -Status Failure ` -Since (Get-Date).AddDays(-1)
Get-mssDiskSpaceReport -SqlInstance "SQL01" -WarnThresholdPct 10 | Where-Object Status -eq 'Warning' | Sort-Object DaysUntilFull | Format-Table VolumeName, FreeGB, DaysUntilFull, Status -AutoSize
AlwaysOn Availability Groups
4 TippsGet-mssAgHealthReport # Kritische Befunde herausfiltern: Get-mssAgHealthReport -SqlInstance "SQL01" | Where-Object OverallStatus -ne 'Healthy' | Format-Table AgName, ReplicaName, DbSyncState, RedoQueueMB
Invoke-mssAddDatabaseToAvailabilityGroup ` -AvailabilityGroup "AG_Prod" -Database "NeueDB"
Invoke-mssAddDatabaseToAvailabilityGroup ` -AvailabilityGroup "AG_Prod" -All
Sync-mssAgNode # erkennt Primary selbst Sync-mssAgNode -SqlInstance "SQL01" # explizit
Sync-mssAgNode -SqlInstance "SQL01" ` -ExcludeType Jobs,LinkedServers,Operators,Alerts
Repair-mssAlwaysOnDatabases
# Job erstellen (stündlich): New-mssAlwaysOnRepairJob -SqlInstance "SQL01"
Backup & Restore
3 TippsInvoke-mssUserDatabaseBackup -All
Invoke-mssUserDatabaseBackup -SqlInstance "SQL01" ` -Database "SalesDB","InventoryDB"
Invoke-mssRestoreDatabase -SqlInstance "SQL01" ` -BackupFile "D:\Backup\SalesDB.bak" ` -DatabaseName "SalesDB"
$seq = @( "D:\Bak\SalesDB_Full.bak", "D:\Bak\SalesDB_Diff.bak", "D:\Bak\SalesDB_Log.trn" ) Invoke-mssRestoreDatabase -SqlInstance "SQL01" ` -BackupFiles $seq -DatabaseName "SalesDB"
Invoke-mssRestoreDatabase -SqlInstance "SQL01" ` -BackupFile "D:\Bak\SalesDB.bak" ` -DatabaseName "SalesDB" -CreatePreRestoreBackup
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 TippsGet-mssIndexFragmentation ` -Database "SalesDB" -MinFragmentationPercent 10 | Sort-Object FragmentationPercent -Descending | Format-Table TableName, IndexName, FragmentationPercent, Recommendation
# 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
Invoke-mssLogShrink -SqlInstance "SQL01" -All -WhatIf
Get-mssTempDbRecommendation -SqlInstance "SQL01"
Get-mssTempDbRecommendation -SqlInstance "SQL01" | Where-Object Status -ne 'OK' | Select-Object Status, Messages
# 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$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)"
"SQL01","SQL02","SQL03" | ForEach-Object { Invoke-mssSaObfuscation -SqlInstance $_ -ContinueOnError } | Select-Object SqlInstance, NewLoginName, Status | Format-Table
Get-mssSysadminAccounts -SqlInstance "SQL01" ` -ExcludeLogin "NT SERVICE\*","NT AUTHORITY\*","msssa" ` -ExcludeSysAccounts | Where-Object Status -in 'Unexpected','BuiltinAdmins' | Format-Table LoginName, LoginType, IsEnabled -AutoSize
Invoke-mssLoginAudit -SqlInstance "SQL01" ` -InactivityThresholdDays 90 ` -MaxPasswordAgeDays 180 ` -ExcludeLogin "NT SERVICE\*"
Invoke-mssLoginAudit -SqlInstance "SQL01" -CheckAdOrphans
Konfiguration & Inventar
4 Tipps$instances = Get-Content "C:\Admin\sql_instances.txt" Invoke-mssInstanceInventory ` -SqlInstance $instances -ContinueOnError # Dateien in: (Get-mssConfig -Key 'OutputPath')
Compare-mssServerConfiguration ` -SourceInstance "SQL01" -TargetInstance "SQL02" | Where-Object { $_.SourceValue -ne $_.TargetValue } | Format-Table Setting, SourceValue, TargetValue -AutoSize
Invoke-mssSetDatabaseRecoveryMode -All -RecoveryMode Full
Invoke-mssSetDatabaseRecoveryMode ` -Database "ArchiveDB" -RecoveryMode Simple
Find-mssDatabaseObject -SqlInstance "SQL01" ` -ObjectName "sp_GetOrders" | Format-Table Database, Schema, ObjectType, ObjectName
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