sqmSQLTool · Inventory & Dokumentation · 2026
Transparenz auf Knopfdruck.
Wer betreibt was auf welchem Server, in welchem Patch-Stand, mit welchen Datenbanken - beantwortet in Sekunden statt Stunden.
Uwe Janke · Senior SQL Server DBA · dtcSoftware
Motivation
Welche Datenbanken liegen auf SQL03? Wer ist DB-Owner von "Archiv_alt"? Recovery-Modell korrekt gesetzt? Ohne Dokumentation beginnt die Suche bei Null.
Patch-Stand aller Instanzen? Privilegierte Accounts? Zertifikat-Ablaufdaten? Ohne Werkzeug bedeutet jede Auditfrage Stunden manuelle Arbeit auf dutzenden Servern.
"War das gestern schon so?" Ohne regelmaessige Snapshots ist unbekannt ob eine Konfigurations-Abweichung alt oder neu ist. Ursachenanalyse dauert Stunden statt Minuten.
Datenbanken wachsen still. Erst wenn der Platz ausgeht gibt es eine Meldung - dann ist es zu spaet. Prognose-Daten fehlen komplett.
Ueberblick
Vollstaendiger Snapshot einer Instanz: Version, Datenbanken, Logins, AG, Jobs, Konfiguration.
Pro Datenbank: Dateien, Groessen, Autogrowth, Backup-Zeiten, Objekte, User - als HTML-Report.
Vergleich installierter Build gegen aktuelle CUs. Ampel-Status pro Instanz und Version.
Disk-Prognose, AG-Health, Zertifikat-Ablauf, AutoGrowth, SPN-Status - taeglich automatisiert.
Inventar
Ein vollstaendiger Snapshot einer SQL-Server-Instanz - TXT (lesbar) + CSV (maschinenlesbar). Automatisch im zentralen Archiv abgelegt.
| ℹ️ Instanz-Info | Version, Edition, Patch-Level, Collation, Auth-Modus, MAXDOP, Max/Min Memory, CPU-Anzahl |
| 💾 Datenbanken | Name, Status, Recovery Model, Groesse (MB), letztes Full-Backup, Owner, Erstelldatum |
| 🔑 Logins | Name, Typ (Windows/SQL), aktiv/inaktiv, Server-Rollen |
| 🔗 Linked Server | Name, Produkt, Provider, Datenquelle |
| 🗓️ Agent-Jobs | Name, aktiv/inaktiv, Owner, letzte Ausfuehrung + Status |
| ⚙️ sp_configure | Nur Abweichungen vom Standard - sofort sichtbar was veraendert wurde |
| 🔄 AlwaysOn | AG-Name, Primary, Replicas + Rollen, Listener (Port/IP), Sync-Status |
# Einzelne Instanz
Invoke-sqmInstanceInventory `
-SqlInstance 'SQL01\PROD' `
-OutputPath 'C:\Reports\SQL'
# Alle Instanzen aus einer Liste
'SQL01','SQL02','SQL03' | Invoke-sqmInstanceInventory
Dateiname: InstanceInventory_SQL01_PROD_2026-05-20.txt
Datenbank-Dokumentation
Self-contained HTML-Report pro Instanz - kein externes CSS, direkt im Browser oeffenbar. Farbkodierte Status-Badges.
| Eigenschaften | Status, Recovery, Collation, Owner, Erstelldatum, Compat-Level |
| Dateigroessen | Data / Log separat, inkl. Autogrowth-Einstellungen und Wachstumstyp |
| Backup-Alter | Letztes FULL / DIFF / LOG mit Altersangabe - sofort sichtbar ob Backup fehlt |
| CHECKDB | Datum des letzten Integritaets-Checks mit Alterswarnung |
| VLF-Count | Anzahl Virtual Log Files (ab SQL 2016) - zu hohe Werte werden markiert |
| Objekte | Anzahl Tabellen, Views, Procs, Functions, Trigger, Synonyme |
| DB-User | Name, Login-Name, Typ - Orphaned Users sofort erkennbar |
Export-sqmDatabaseDocumentation `
-SqlInstance 'SQL01' `
-Database 'Finanzen*' `
-OutputPath 'C:\Reports'
Dateiname: DatabaseDoc_SQL01_20260520_2015.html
Compliance
Invoke-sqmPatchAnalysis - Vergleicht installierten Build mit der eingebetteten Referenztabelle aller bekannten CUs. Ampel-Status und konkrete Empfehlung je Instanz.
| Instanz | Version | Build | Stand | Empfehlung |
|---|---|---|---|---|
| SQL01 | 2022 | 16.0.4175 | CU17 - aktuell | Kein Handlungsbedarf |
| SQL02 | 2022 | 16.0.4135 | CU14 - 3 hinter aktuell | CU-Update empfohlen |
| SQL03 | 2019 | 15.0.2000 | RTM - 29 hinter aktuell | Sofort patchen |
| SQL04 | 2019 | 15.0.4405 | CU29 - aktuell | Kein Handlungsbedarf |
Referenztabelle eingebettet: SQL 2016 SP3, 2017 bis CU40, 2019 bis CU29, 2022 bis CU17.
# Alle Instanzen analysieren, CSV speichern
'SQL01','SQL02','SQL03','SQL04' |
Invoke-sqmPatchAnalysis `
-OutputPath 'C:\Reports\Patch'
# Nur veraltete anzeigen
'SQL01','SQL02','SQL03','SQL04' |
Invoke-sqmPatchAnalysis |
Where-Object { -not $_.IsLatest }
BuildsBehind: konkrete Anzahl versaeumter CUsRecommendation: direkt zitierbare EmpfehlungKonfigurationsvergleich
Soll/Ist-Vergleich zweier Instanzen. Vor/nach Migration, Produktiv vs. Test, Knoten 1 vs. Knoten 2 in einem AG-Paar.
# Produktiv vs. Test vergleichen
Compare-sqmServerConfiguration `
-SourceInstance 'SQL01\PROD' `
-TargetInstance 'SQL02\TEST' `
-CompareDatabases
# Ergebnis: nur Abweichungen
Setting SourceValue TargetValue
MaxMemory 32768 8192 <-- Abweichung
MaxDOP 4 8 <-- Abweichung
Collation Latin1... Latin1... (OK)
CostThreshold 50 25 <-- Abweichung
-CompareDatabases: nur Instanz-Konfiguration. Mit dem Schalter zusaetzlich Datenbankebene (Owner, RecoveryModel, Collation).Quell- und Zielserver vergleichen - sicherstellen dass alle relevanten Settings uebernommen wurden.
Beide Knoten eines AlwaysOn-Paares muessen identisch konfiguriert sein. Abweichungen sind Risiken.
Nach einem Change-Request nachweisen dass nur die geplanten Werte geaendert wurden.
Goldener Standard-Server vs. produktive Instanz. Abweichungen als CSV an den Auditor.
Taeglich Betrieb
Get-sqmDiskSpaceReport
| D:\ | 68 % frei |
| E:\ | 18 % frei |
| F:\ | 8 % — 11 Tage |
Zeigt Wachstums-Rate und "Days until full" basierend auf 30-Tage-Verlauf.
Get-sqmAutoGrowthReport
Markiert prozentbasiertes Wachstum, zu kleine Schritte (<64 MB) und unbegrenzte Log-Dateien als Warnung.
Get-sqmAgHealthReport
| Finanzen | SYNC • 0 MB |
| Reporting | SYNC • 82 MB |
Redo-Queue und Send-Queue je DB. Warnschwellen konfigurierbar.
Get-sqmBlockingReport
Blocking-Ketten mit Head-Blocker, SQL-Text, Wartedauer und betroffenen Ressourcen - fuer sofortige Diagnose.
Get-sqmCertificateReport
| HADR_Cert | 248 Tage |
| TDE_Cert | 62 Tage |
| SB_Cert | ABGELAUFEN |
Zweck: AlwaysOn / TDE / ServiceBroker / Backup. ALERTS.csv mit nur kritischen Eintraegen.
Get-sqmSpnReport
Kerberos-SPN-Registrierung pruefen. Fehlende SPNs werden mit fertigen setspn.exe-Befehlen geliefert.
Zentrales Archiv
CentralPath: Jede Report-Funktion kopiert ihr Ergebnis automatisch in den konfigurierten Ziel-Pfad - ohne zusaetzliche Schritte.
# Zentrales Archiv setzen (einmalig)
Set-sqmConfig `
-CentralPath '\\fileserver\SQLReports' `
-OutputPath 'C:\Reports\Local'
# Ab jetzt: jede Funktion kopiert automatisch
Invoke-sqmInstanceInventory -SqlInstance 'SQL01'
# Ergebnis landet in:
# C:\Reports\Local\InstanceInventory_SQL01_...txt
# \\fileserver\SQLReports\InstanceInventory_SQL01_...txt
\\fileserver\SQLReports\
InstanceInventory_SQL01_PROD_2026-05-20.txt
InstanceInventory_SQL01_PROD_2026-05-20.csv
InstanceInventory_SQL02_PROD_2026-05-20.txt
InstanceInventory_SQL03_TEST_2026-05-20.txt
DatabaseDoc_SQL01_PROD_20260520_2015.html
DatabaseDoc_SQL01_PROD_20260520_2015.csv
PatchAnalysis_20260520_2014.csv
DiskSpaceReport_SQL01_PROD_2026-05-20.txt
DiskSpaceReport_SQL01_PROD_2026-05-20.csv
CertReport_SQL01_PROD_20260520_2013.txt
CertReport_SQL01_PROD_20260520_2013_ALERTS.csv
AgHealthReport_SQL01_PROD_2026-05-20.txt
Skalierung
Alle Report-Funktionen sind Pipeline-faehig. Instanzliste aus Datei, Datenbank oder AD - sqmSQLTool verarbeitet alle parallel.
# Instanzliste aus Textdatei
Get-Content 'C:\Config\instances.txt' |
Invoke-sqmInstanceInventory
# Patch-Analyse aller Produktiv-Instanzen
Get-Content 'C:\Config\prod_instances.txt' |
Invoke-sqmPatchAnalysis `
-OutputPath '\\fileserver\SQLReports\Patch'
# Nur veraltete als Tabelle - fuer Ticket
Get-Content 'C:\Config\prod_instances.txt' |
Invoke-sqmPatchAnalysis |
Where-Object { -not $_.IsLatest } |
Select-Object SqlInstance,PatchStatus,BuildsBehind,Recommendation |
Format-Table -AutoSize
-ContinueOnError: eine nicht erreichbare Instanz unterbricht nicht den gesamten Lauf.| Job | Rhythmus | Befehl |
|---|---|---|
| Inventar | Woechtentlich | Invoke-sqmInstanceInventory |
| DB-Doku | Woechentlich | Export-sqmDatabaseDocumentation |
| Patch-Analyse | Woechentlich | Invoke-sqmPatchAnalysis |
| Disk-Prognose | Taeglich | Get-sqmDiskSpaceReport |
| AG-Health | Taeglich | Get-sqmAgHealthReport |
| Zertifikate | Taeglich | Get-sqmCertificateReport |
Alle Jobs koennen als SQL Agent Job oder Windows Task Scheduler Aufgabe eingerichtet werden - einmal konfiguriert, laufen sie vollautomatisch und speichern im CentralPath.
Referenz
| Aufgabe | Funktion | Ausgabe |
|---|---|---|
| Instanz-Snapshot | Invoke-sqmInstanceInventory | TXT + CSV |
| DB-Dokumentation | Export-sqmDatabaseDocumentation | HTML + CSV |
| Patch-Compliance | Invoke-sqmPatchAnalysis | Konsole + CSV |
| Config-Vergleich | Compare-sqmServerConfiguration | Konsole |
| Disk-Prognose | Get-sqmDiskSpaceReport | TXT + CSV |
| AG-Health | Get-sqmAgHealthReport | TXT + CSV |
| Zertifikat-Ablauf | Get-sqmCertificateReport | TXT + CSV + ALERTS.csv |
| AutoGrowth-Pruefung | Get-sqmAutoGrowthReport | Konsole |
| Blocking-Analyse | Get-sqmBlockingReport | Konsole + CSV |
| SPN-Audit | Get-sqmSpnReport | TXT + CSV |
| Zentrales Archiv | Set-sqmConfig -CentralPath | automatisch |
-OutputPath | Ziel-Verzeichnis fuer Report-Dateien |
-ContinueOnError | Fehler je Instanz ueberspringen |
-CompareDatabases | Vergleich auch auf DB-Ebene |
-WarnThresholdPct | Warn-Schwelle Disk-Freiraum (Standard: 20 %) |
-CriticalThresholdPct | Kritisch-Schwelle (Standard: 10 %) |
-WarningThresholdDays | Zertifikat-Warnung (Standard: 90 Tage) |
-HistoryDays | Zeitraum fuer Disk-Wachstumsprognose |
# Reports auf Englisch
Set-sqmConfig -Language 'en-US'
# Zurueck zu Deutsch
Set-sqmConfig -Language 'de-DE'
Zusammenfassung
Jederzeit abrufbar: welche Instanzen sind veraltet, wie dringend ist der Handlungsbedarf?
Prognose liefert 10+ Tage Vorlaufzeit - genug fuer Kapazitaetsplanung ohne Nacht-Notfaelle.
Zertifikate, Logins, Konfiguration - alles tagesaktuell im Share. Der Auditor greift selbst zu.
Neue Kollegen bekommen den aktuellen Inventar-Report - kein wochenlanger Einlese-Aufwand.
Compare-sqmServerConfiguration belegt nach jedem Change dass nur das Geplante geaendert wurde.
Vor jeder Migration Soll/Ist-Vergleich - keine vergessenen Settings mehr auf dem Zielsystem.