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