dtcSoftware
  1. Aktuelle Seite:  
  2. Startseite
  3. HowTo....
  4. Tools

AlwaysOn Automation

Details
Kategorie: Tools

SQL Server AlwaysOn Setup Tool – Dokumentation

DBA-Team  ·  Intern  ·  Version 1.0.0  ·  April 2026
SQL Server AlwaysOn Setup Tool
Vollautomatische Konfiguration von Always On Availability Groups auf Windows Server Failover Clustern
SQL Server 2022 / 2025 Windows Server 2022 PowerShell 5.1+ FailoverClusters RSAT dbaTools >= 2.0

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.

⚡ Empfehlung: SPNs vor dem Setup setzen
Wenn die Service Principal Names (SPNs) für das SQL-Dienstkonto im Active Directory vor dem Setup registriert sind, läuft das Tool vollautomatisch durch – ohne manuellen Eingriff. Fehlen SPNs, pausiert das Tool und erfordert einen zusätzlichen manuellen Schritt. Details in Abschnitt 4 – SPNs.

1. Übersicht und Konfigurationsschritte

Das Tool führt die folgenden neun Schritte in dieser Reihenfolge aus. Übersprungene Schritte werden im Log ausgewiesen.

SchrittBezeichnungBeschreibung
1SQL-Service-KontoOptional: Konto und Passwort per WMI auf allen Nodes ändern und Dienst neu starten
2HADR aktivierenAlways On per sp_configure 'hadr enabled', 1 auf allen Nodes; Dienst-Neustart mit aktivem Bereitschaftstest
3Endpoint erstellenDatenbankspiegelungs-Endpoint (Port 5022) per T-SQL anlegen und starten
4CONNECT-BerechtigungWindows-Login anlegen, GRANT CONNECT ON ENDPOINT auf alle Nodes
5TestdatenbankDatenbank anlegen, Recovery-Modell FULL setzen, initiales Full-Backup erstellen
6Availability GroupAG per reinem T-SQL (sqlcmd) anlegen, Replicas beitreten, Autoseed aktivieren
7ListenerAG-Listener mit IP-Adresse und Port per ALTER AVAILABILITY GROUP
8StatusAG-Synchronisierungsstatus und Replica-Rollen per DMV ausgeben
9SPN-PrüfungFehlende 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

ModulInstallationHinweis
FailoverClustersRSAT-Clustering-PowerShellWird vom Script automatisch installiert
dbaTools >= 2.0Install-Module dbatoolsWird automatisch installiert; bereits geladene Version wird nicht neu importiert
ℹ dbaTools-Nutzung bewusst minimiert
Das Tool verwendet aus dbaTools nur 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

  1. PowerShell ISE oder PowerShell 5.1+ als Administrator öffnen
  2. Script SetupAlwaysOn.ps1 ausführen
  3. Das Tool prüft Module, liest Cluster-Informationen automatisch ein
  4. Erkannte Werte erscheinen im PropertyGrid (linke Seite der Oberfläche)

PropertyGrid – Konfigurationsfelder

FeldKategorieBeschreibung
AG-Name3 – AGName der Availability Group (= WSFC-Rollenname)
Listener-Name3 – AGDNS-Name des AG-Listeners
Listener-IP3 – AGIP-Adresse des Listeners (aus Cluster übernommen)
Listener-Port3 – AGTCP-Port des Listeners (Standard: 1433)
Endpoint-Port3 – AGHADR Endpoint Port (Standard: 5022)
Failover-Modus3 – AGAutomatic = synchron mit auto. Failover; Manual = asynchron
Backup-Präferenz3 – AGPrimary / Secondary / PreferSecondary / None (Standard: Primary)
Test-Datenbank3 – AGName der in die AG aufzunehmenden Datenbank
Backup-Share4 – BackupUNC-Pfad für das initiale Full-Backup
Service-Konto2 – DienstSQL-Dienstkonto (automatisch erkannt, optional änderbar)

Ablauf nach dem Start

1
Alle Felder im PropertyGrid prüfen und ggf. anpassen
2
Primary-Node in der Dropdown-Liste wählen
3
Schaltfläche Konfiguration starten klicken
4
Fortschritt im Log-Bereich (rechts) farbkodiert in Echtzeit verfolgen
5
Falls SPNs fehlen: Weiter-Button nach manuellem SQL-Login-Setup klicken (→ Abschnitt 4)
6
Am Ende: SPN-Anforderungsdatei an das AD-Team weiterleiten

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.

⚠ SPNs vor dem Setup setzen – dringend empfohlen
Wenn SPNs fehlen, pausiert das Tool und fordert den Anwender auf, ein temporäres SQL-Login manuell per SSMS lokal auf jedem betroffenen Node anzulegen. Dieser Schritt entfällt vollständig, wenn die SPNs bereits im Active Directory registriert sind.

Auswirkung fehlender SPNs

SituationAuswirkungAblauf
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

1
Tool erkennt automatisch welche Nodes nicht per Kerberos erreichbar sind
2
T-SQL-Block zur manuellen Login-Anlage wird im Log angezeigt (fertig zum Kopieren)
3
Anwender führt das T-SQL per SSMS lokal auf jedem betroffenen Node aus (per RDP)
4
Klick auf Weiter – Tool prüft SQL-Auth-Verbindung auf allen Nodes
5
Temporäres Login wird am Ende automatisch entfernt, Policy reaktiviert

5. Ausgaben und Logdateien

Farbcodierung im Live-Log

FarbeBedeutung
Blau (fett)Abschnittsüberschrift (=== ... ===)
Hellgrün (fett)Erfolg – Aktion erfolgreich abgeschlossen
GelbWarnung – Aktion übersprungen oder Hinweis
Rot (fett)Fehler – Aktion fehlgeschlagen
HellgrauInformation – allgemeine Statusmeldung

Gespeicherte Dateien

Alle Dateien werden automatisch unter C:\System\WinSrvLog\MSSQL\ gespeichert.

DateiInhaltZeitpunkt
AlwaysOn_ClusterSettings_<Datum>.txtCluster-Konfiguration, AG-Parameter, Node-Status – Backup vor ÄnderungenVor Schritt 1
AlwaysOn_Setup_<Datum>.logVollständiges Text-Log aller Schritte mit ZeitstempelnNach Abschluss
AlwaysOn_Setup_<Datum>.rtfFarbiges RTF-Log (über Schaltfläche im Tool speicherbar)Manuell
AlwaysOn_SPN_ADTeam_<Datum>.txtFertige setspn-Befehle für das AD-Team mit Erklärung und PrüfbefehlSchritt 9

6. Fehlerbehebung

FehlermeldungUrsacheLö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:

  1. Stop-ClusterGroup + Remove-ClusterGroup -RemoveResources -Force
  2. Registry-Key HKLM:\Cluster\HadrAgNameToldMap auf allen Nodes per Invoke-Command bereinigen

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

 

AlwaysOn Setup Wiz

Datenbank-Report - Beispiel

Details
Kategorie: Tools

 

Ein Beispiel-Report erstellt mit Export-mssDatabaseDocumentation  aus den mssSQLTool....

 

DB-Doku DEV02

📊 Datenbank-Dokumentation

Instanz: DEV02  ·  Erstellt: 2026-04-24 13:59:38
AlwaysOnTestamazondtcSNEilinfo_New_ProdFSQLOperationsManagerDWReportServerReportServerTempDBSolutioninfoSolutioninfoSTASSISDBTestDB

📈 AlwaysOnTest

Normal

Allgemeine Eigenschaften

Recovery-ModellSimple
KompatibilitätslevelVersion160
CollationLatin1_General_CI_AS
OwnerDEV02\Janke
Erstellt am2026-03-20
StatusNormal
Data-Größe (MB)8
Log-Größe (MB)8
Gesamt (MB)16
VLF-Anzahl4
ReadOnlyFalse
AutoCloseFalse
AutoShrinkFalse

Letzte Backups

TypLetzteAusführungAgeTage
Full (D)2026-03-20 13:0835
Diff (I)--
Log (L)n/a (Simple Recovery)-

✓ Letzte DBCC CHECKDB: 1900-01-01 00:00 (vor 46135 Tagen)

Datenbankdateien

DateigruppeDateinameTypGröße (MB)AutogrowPfad
PRIMARYAlwaysOnTestData864 MBC:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\AlwaysOnTest.mdf
LOGAlwaysOnTest_logLog864 MBC:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\AlwaysOnTest_log.ldf

Objekt-Zusammenfassung

Datenbank-User

Keine Benutzer gefunden.

📈 amazon

Normal

Allgemeine Eigenschaften

Recovery-ModellSimple
KompatibilitätslevelVersion160
CollationLatin1_General_CI_AS
Ownermsssa
Erstellt am2025-05-17
StatusNormal
Data-Größe (MB)8
Log-Größe (MB)8
Gesamt (MB)16
VLF-Anzahl4
ReadOnlyFalse
AutoCloseFalse
AutoShrinkFalse

Letzte Backups

TypLetzteAusführungAgeTage
Full (D)2026-03-20 12:1535
Diff (I)--
Log (L)n/a (Simple Recovery)-

✓ Letzte DBCC CHECKDB: 1900-01-01 00:00 (vor 46135 Tagen)

Datenbankdateien

DateigruppeDateinameTypGröße (MB)AutogrowPfad
PRIMARYamazonData864 MBC:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\amazon.mdf
LOGamazon_logLog864 MBC:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\amazon_log.ldf

Objekt-Zusammenfassung

Datenbank-User

Keine Benutzer gefunden.

📈 dtcSN

Normal

Allgemeine Eigenschaften

Recovery-ModellSimple
KompatibilitätslevelVersion160
CollationLatin1_General_CI_AS
OwnerDEV02\Janke
Erstellt am2026-02-05
StatusNormal
Data-Größe (MB)8
Log-Größe (MB)8
Gesamt (MB)16
VLF-Anzahl4
ReadOnlyFalse
AutoCloseFalse
AutoShrinkFalse

Letzte Backups

TypLetzteAusführungAgeTage
Full (D)2026-03-20 12:1535
Diff (I)--
Log (L)n/a (Simple Recovery)-

✓ Letzte DBCC CHECKDB: 1900-01-01 00:00 (vor 46135 Tagen)

Datenbankdateien

DateigruppeDateinameTypGröße (MB)AutogrowPfad
PRIMARYdtcSNData864 MBC:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\dtcSN.mdf
LOGdtcSN_logLog864 MBC:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\dtcSN_log.ldf

Objekt-Zusammenfassung

Datenbank-User

Keine Benutzer gefunden.

📈 Eilinfo_New_Prod

Normal

Allgemeine Eigenschaften

Recovery-ModellSimple
KompatibilitätslevelVersion160
CollationLatin1_General_CI_AS
OwnerDEV02\Janke
Erstellt am2025-09-10
StatusNormal
Data-Größe (MB)8
Log-Größe (MB)8
Gesamt (MB)16
VLF-Anzahl4
ReadOnlyFalse
AutoCloseFalse
AutoShrinkFalse

Letzte Backups

TypLetzteAusführungAgeTage
Full (D)2026-03-20 12:1535
Diff (I)--
Log (L)n/a (Simple Recovery)-

✓ Letzte DBCC CHECKDB: 1900-01-01 00:00 (vor 46135 Tagen)

Datenbankdateien

DateigruppeDateinameTypGröße (MB)AutogrowPfad
PRIMARYEilinfo_New_ProdData864 MBC:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\Eilinfo_New_Prod.mdf
LOGEilinfo_New_Prod_logLog864 MBC:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\Eilinfo_New_Prod_log.ldf

Objekt-Zusammenfassung

Datenbank-User

Keine Benutzer gefunden.

📈 FSQL

Normal

Allgemeine Eigenschaften

Recovery-ModellSimple
KompatibilitätslevelVersion130
CollationSQL_Latin1_General_CP1_CI_AS
Ownermsssa
Erstellt am2026-03-09
StatusNormal
Data-Größe (MB)128
Log-Größe (MB)64
Gesamt (MB)192
VLF-Anzahl4
ReadOnlyFalse
AutoCloseFalse
AutoShrinkFalse

Letzte Backups

TypLetzteAusführungAgeTage
Full (D)2026-04-03 19:4721
Diff (I)--
Log (L)n/a (Simple Recovery)-

✓ Letzte DBCC CHECKDB: 2024-05-26 06:15 (vor 698 Tagen)

Datenbankdateien

DateigruppeDateinameTypGröße (MB)AutogrowPfad
PRIMARYFSQLData128128 MBC:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\FSQL.mdf
LOGFSQL_logLog6464 MBC:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\FSQL_log.ldf

Objekt-Zusammenfassung

Datenbank-User

BenutzernameTypLoginNameErstelltAm
FITSSQLSQL_USER(kein Login)20.03.2024 23:21:40
NT AUTHORITY\SYSTEMWINDOWS_USERNT-AUTORITÄT\SYSTEM09.10.2018 17:44:32

📈 OperationsManagerDW

Normal

Allgemeine Eigenschaften

Recovery-ModellSimple
KompatibilitätslevelVersion160
CollationLatin1_General_CI_AS
Ownermsssa
Erstellt am2024-09-26
StatusNormal
Data-Größe (MB)8
Log-Größe (MB)8
Gesamt (MB)16
VLF-Anzahl4
ReadOnlyFalse
AutoCloseFalse
AutoShrinkFalse

Letzte Backups

TypLetzteAusführungAgeTage
Full (D)2026-03-20 12:1535
Diff (I)--
Log (L)n/a (Simple Recovery)-

✓ Letzte DBCC CHECKDB: 1900-01-01 00:00 (vor 46135 Tagen)

Datenbankdateien

DateigruppeDateinameTypGröße (MB)AutogrowPfad
PRIMARYOperationsManagerDWData864 MBC:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\OperationsManagerDW.mdf
LOGOperationsManagerDW_logLog864 MBC:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\OperationsManagerDW_log.ldf

Objekt-Zusammenfassung

Datenbank-User

Keine Benutzer gefunden.

📈 ReportServer

Normal

Allgemeine Eigenschaften

Recovery-ModellSimple
KompatibilitätslevelVersion160
CollationLatin1_General_100_CI_AS_KS_WS
OwnerDEV02\Janke
Erstellt am2026-04-20
StatusNormal
Data-Größe (MB)72
Log-Größe (MB)72
Gesamt (MB)144
VLF-Anzahl5
ReadOnlyFalse
AutoCloseFalse
AutoShrinkFalse

Letzte Backups

TypLetzteAusführungAgeTage
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

DateigruppeDateinameTypGröße (MB)AutogrowPfad
PRIMARYReportServerData7264 MBC:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\ReportServer.mdf
LOGReportServer_logLog7264 MBC:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\ReportServer_log.ldf

Objekt-Zusammenfassung

Datenbank-User

BenutzernameTypLoginNameErstelltAm
NT SERVICE\SQLServerReportingServicesWINDOWS_USERNT SERVICE\SQLServerReportingServices20.04.2026 17:58:22

📈 ReportServerTempDB

Normal

Allgemeine Eigenschaften

Recovery-ModellSimple
KompatibilitätslevelVersion160
CollationLatin1_General_100_CI_AS_KS_WS
OwnerDEV02\Janke
Erstellt am2026-04-20
StatusNormal
Data-Größe (MB)8
Log-Größe (MB)8
Gesamt (MB)16
VLF-Anzahl4
ReadOnlyFalse
AutoCloseFalse
AutoShrinkFalse

Letzte Backups

TypLetzteAusführungAgeTage
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

DateigruppeDateinameTypGröße (MB)AutogrowPfad
PRIMARYReportServerTempDBData864 MBC:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\ReportServerTempDB.mdf
LOGReportServerTempDB_logLog864 MBC:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\ReportServerTempDB_log.ldf

Objekt-Zusammenfassung

Datenbank-User

BenutzernameTypLoginNameErstelltAm
NT SERVICE\SQLServerReportingServicesWINDOWS_USERNT SERVICE\SQLServerReportingServices20.04.2026 17:58:22

📈 Solutioninfo

Normal

Allgemeine Eigenschaften

Recovery-ModellSimple
KompatibilitätslevelVersion160
CollationLatin1_General_CI_AS
Ownermsssa
Erstellt am2024-09-21
StatusNormal
Data-Größe (MB)8
Log-Größe (MB)8
Gesamt (MB)16
VLF-Anzahl4
ReadOnlyFalse
AutoCloseFalse
AutoShrinkFalse

Letzte Backups

TypLetzteAusführungAgeTage
Full (D)2026-03-20 12:1535
Diff (I)--
Log (L)n/a (Simple Recovery)-

✓ Letzte DBCC CHECKDB: 1900-01-01 00:00 (vor 46135 Tagen)

Datenbankdateien

DateigruppeDateinameTypGröße (MB)AutogrowPfad
PRIMARYSolutioninfoData864 MBC:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\Solutioninfo.mdf
LOGSolutioninfo_logLog864 MBC:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\Solutioninfo_log.ldf

Objekt-Zusammenfassung

Datenbank-User

Keine Benutzer gefunden.

📈 SolutioninfoSTA

Normal

Allgemeine Eigenschaften

Recovery-ModellSimple
KompatibilitätslevelVersion160
CollationLatin1_General_CI_AS
OwnerDEV02\Janke
Erstellt am2025-10-01
StatusNormal
Data-Größe (MB)8
Log-Größe (MB)8
Gesamt (MB)16
VLF-Anzahl4
ReadOnlyFalse
AutoCloseFalse
AutoShrinkFalse

Letzte Backups

TypLetzteAusführungAgeTage
Full (D)2026-03-20 12:1535
Diff (I)--
Log (L)n/a (Simple Recovery)-

✓ Letzte DBCC CHECKDB: 1900-01-01 00:00 (vor 46135 Tagen)

Datenbankdateien

DateigruppeDateinameTypGröße (MB)AutogrowPfad
PRIMARYSolutioninfoSTAData864 MBC:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\SolutioninfoSTA.mdf
LOGSolutioninfoSTA_logLog864 MBC:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\SolutioninfoSTA_log.ldf

Objekt-Zusammenfassung

Datenbank-User

Keine Benutzer gefunden.

📈 SSISDB

Normal

Allgemeine Eigenschaften

Recovery-ModellSimple
KompatibilitätslevelVersion160
CollationSQL_Latin1_General_CP1_CI_AS
Ownermsssa
Erstellt am2025-05-27
StatusNormal
Data-Größe (MB)40
Log-Größe (MB)61.9
Gesamt (MB)101.9
VLF-Anzahl43
ReadOnlyFalse
AutoCloseFalse
AutoShrinkFalse

Letzte Backups

TypLetzteAusführungAgeTage
Full (D)2026-03-20 12:1535
Diff (I)--
Log (L)n/a (Simple Recovery)-

✓ Letzte DBCC CHECKDB: 1900-01-01 00:00 (vor 46135 Tagen)

Datenbankdateien

DateigruppeDateinameTypGröße (MB)AutogrowPfad
PRIMARYdataData4010 %C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\SSISDB.mdf
LOGlogLog61,910 %C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\SSISDB.ldf

Objekt-Zusammenfassung

Datenbank-User

BenutzernameTypLoginNameErstelltAm
##MS_SSISServerCleanupJobUser##SQL_USER##MS_SSISServerCleanupJobLogin##27.05.2025 11:24:36
AllSchemaOwnerSQL_USER(kein Login)08.10.2022 06:30:32

📈 TestDB

Normal

Allgemeine Eigenschaften

Recovery-ModellSimple
KompatibilitätslevelVersion160
CollationLatin1_General_CI_AS
OwnerDEV02\Janke
Erstellt am2026-02-20
StatusNormal
Data-Größe (MB)16
Log-Größe (MB)8
Gesamt (MB)24
VLF-Anzahl4
ReadOnlyFalse
AutoCloseFalse
AutoShrinkFalse

Letzte Backups

TypLetzteAusführungAgeTage
Full (D)2026-03-20 12:1535
Diff (I)--
Log (L)n/a (Simple Recovery)-

✓ Letzte DBCC CHECKDB: 1900-01-01 00:00 (vor 46135 Tagen)

Datenbankdateien

DateigruppeDateinameTypGröße (MB)AutogrowPfad
HISTORYHistoryDataData864 MBC:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\TesDB_2.mdf
PRIMARYTestDBData864 MBC:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\TestDB.mdf
LOGTestDB_logLog864 MBC:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\TestDB_log.ldf

Objekt-Zusammenfassung

Datenbank-User

Keine Benutzer gefunden.

Erstellt durch mssSQLTool · Export-mssDatabaseDocumentation · 2026-04-24 13:59:38

HowTo...

Details
Kategorie: Tools

mssSQLTool — Wie kann ich…? SQL-Admin Handout

mssSQLTool
Monitoring AlwaysOn Backup Performance Sicherheit Konfiguration Checkliste
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 🔄 AlwaysOn 💾 Backup & Restore ⚡ Performance 🔒 Sicherheit ⚙️ Konfiguration ☑️ Checkliste
🔍

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

Main Menu

  • Home
  • SQL-Blog - Technisch
  • SQL-Blog - Allgemein
  • SQL-Tipps
  • SSIS-Tipps
  • T-SQL Scripts
  • ----------------------------------------
  • Reporting - Transparenz und Kontrolle
  • SCOM-basierte SQL Server Dokumentation
  • Standardisierte SQL-Server Installationen
  • AlwaysOn Availability - Automation
  • DeadlockCollector
  • ----------------------------------------
  • HowTo....
  • Beispiel Report
  • Downloads
  • ----------------------------------------
  • Background
  • Datenschutz­erklärung
  • Kontakt

Impressum

Hinweis zur verantwortlichen Stelle

dtcSoftware
U.Janke
Herrengasse 5
83521 Wasserburg
Telefon: +4915253552640
E-Mail: Janke@dtcsoftware.de