DBA Tooling · 2026
Die DBA-Toolbox
87 Funktionen. Ein Modul. Vom Backup bis zum automatischen AlwaysOn-Repair.
Uwe Janke · Senior SQL Server DBA · dtcSoftware
# AlwaysOn-Repair - vollautomatisch
PS> Repair-sqmAlwaysOnDatabases -SqlInstance 'SQL01' -Auto
[OK] Finanzen - removed, reseeded, joined AG
[OK] Controlling - removed, reseeded, joined AG
# AG-aware Backup - nur bevorzugter Knoten
PS> Invoke-sqmUserDatabaseBackup -SqlInstance 'SQL01' -All -CheckPreferredReplica
# Health-Check + Security
PS> Get-sqmDatabaseHealth -SqlInstance 'SQL01' | Format-Table
PS> Invoke-sqmSaObfuscation -SqlInstance 'SQL01'
# Inventar - HTML-Report generieren
PS> Invoke-sqmInstanceInventory -SqlInstance 'SQL01' -OutputPath 'C:\Reports'
Report saved: C:\Reports\SQL01_Inventory_20260520.html
Motivation
Manueller Eingriff: Remove DB, Cleanup Secondary, Backup, Restore, Add to AG. 30-90 Minuten. Nachts um 3 Uhr.
AG-Preferred-Replica nicht geprueft. Primary macht Backup statt Secondary. I/O-Spike im Produktivbetrieb.
Wer hat sysadmin? Welche DBs haben kein Backup? Welche Instanz hat welchen Patch-Stand? - Manuelle Abfragen, unvollstaendig.
Auditoren fragen: Wann war das letzte CHECKDB? SA-Account noch aktiv? Login-Audit vorhanden? - Kein zentraler Report.
Extended Events manuell einrichten, Trace-Datei auswerten. Bis die Analyse fertig ist, ist das Problem vergessen.
Jeder DBA hat eigene Scripts. Kein Standard, keine Nachvollziehbarkeit, keine Pester-Tests.
Business Value
Ein Modul - kein Tool-Zoo
automatisch statt manuell
bei naectlichem AG-Fehler
| Situation | Frueher | Mit sqmSQLTool |
|---|---|---|
| AG-DB nicht synchron | Manuelle Reparatur 30-90 Min. | ✓ Automatischer Repair-Job (stuendlich) |
| Backup-Audit | Excel-Liste, veraltet | ✓ Get-sqmDatabaseHealth - Bericht per Klick |
| Deadlock-Analyse | Extended Events manuell | ✓ Get-sqmDeadlockReport - sofort |
| SA-Account aktiv | Oft uebersehen | ✓ Invoke-sqmSaObfuscation - 1 Befehl |
| Patch-Stand | Ad-hoc Abfrage | ✓ Invoke-sqmPatchAnalysis - alle Instanzen |
Ueberblick
87 Funktionen - 6 Themengebiete. Jedes Gebiet in sich vollstaendig.
Set-sqmConfig -Language 'en-US' bzw. 'de-DE'.Repair, Sync, Failover, Seeding, AG-Add/Remove, Repair-Job - vollstaendiger AG-Lebenszyklus
Backup mit AG-Aware-Logik, Backup-Exclude-Tabelle, Integrity-Check, Restore, Ola-Jobs
Database Health, Wait Stats, Blocking, AutoGrowth, VLF-Count, Long Running Queries, Missing Indexes
SA-Obfuscation, Login-Audit, Sysadmin-Report, AD-Account-Status, SPN-Report, Zertifikate
PerfBaseline, PerfCounters, Index-Fragmentierung, Missing Indexes, Query Store, Wait Statistics
Instance Inventory, Database Documentation, Server Configuration Compare, Patch Analysis
Eye-Catcher · AlwaysOn & HA
Eine AG-DB verliert die Synchronisation - das Tool erkennt es, repariert vollautomatisch, schreibt ins Windows Event Log.
Prueft SynchronizationState aller AG-Datenbanken. Nicht HEALTHY oder SYNCHRONIZED = Kandidat
Invoke-sqmSqlAlwaysOnAutoseeding auf allen Replicas - Voraussetzung fuer AutoSeed-Repair
Remove-DbaAgDatabase - sauber, mit dbaTools
DB auf allen Secondaries loeschen - kein verwaister Zustand
Setzt auf FULL falls abgewichen - sonst schlaegt Add fehl
Add-DbaAgDatabase -SeedingMode Automatic - kein Backup/Restore noetig
EventId 1000/1001/1002 in Windows Application Log. Invoke-sqmLogging fuer File-Log
# Manuell aufrufen:
Repair-sqmAlwaysOnDatabases
# Als stuendlichen Agent-Job einrichten:
New-sqmAlwaysOnRepairJob -Schedule "FREQ=HOURLY;INTERVAL=1"
# Testen ohne Aenderungen:
Repair-sqmAlwaysOnDatabases -WhatIf
# Ausgabe:
# SqlInstance DatabaseName AvailabilityGroup Status
# ----------- ------------ ----------------- ------
# SQLNODE01 SalesDB AG_PROD_01 RepairSuccess
# SQLNODE01 HRDB AG_PROD_01 RepairSuccess
Eye-Catcher · Backup & Integritaet
Invoke-sqmUserDatabaseBackup kennt AlwaysOn. Prueft sys.fn_hadr_backup_is_preferred_replica() - laeuft nur auf dem richtigen Node.
Liest master.dbo.sqm_BackupExclude - Datenbanken die bewusst ausgeschlossen sind (Sync-sqmBackupExcludeTable pflegt die Tabelle)
Backup-Report per SQL Database Mail - standardmaessig nur bei Fehler oder Abbruch. -MailOnSuccess fuer immer.
Liest BackupDirectory automatisch aus den Server Properties. Kein hardcodierter Pfad im Job.
# Standard: alle User-DBs, AG-aware
Invoke-sqmUserDatabaseBackup -All -CheckPreferredReplica
# Mit Exclude-Tabelle und Mail-Report
Invoke-sqmUserDatabaseBackup -All `
-CheckPreferredReplica `
-UseExcludeTable `
-MailTo "dba-team@firma.de"
# Als Backup-Maintenance-Job anlegen
New-sqmBackupMaintenanceJob `
-SqlInstance "SQLNODE01" `
-CheckPreferredReplica `
-MailTo "dba-team@firma.de"
Deep Dive · Health & Diagnose
Get-sqmDatabaseHealth prueft 8 Dimensionen pro Datenbank. Ergebnis: TXT-Report + CSV. Sofort verwendbar.
| Pruefpunkt | Schwellwert |
|---|---|
| Recovery Model | Warnung wenn nicht FULL |
| Letztes CHECKDB | Warnung wenn aelter als 14 Tage (konfigurierbar) |
| Letztes Backup (Full) | Rot wenn nie / aelter als konfiguriert |
| Letztes Backup (Diff/Log) | Warnung wenn nicht vorhanden |
| AutoGrowth Events | Letzte 30 Tage (konfigurierbar) |
| VLF-Anzahl | Warnung ab 200 (konfigurierbar) |
| Datenbankgroesse | Info |
| DB-Status | Rot wenn nicht Online |
# Einzelne Instanz
Get-sqmDatabaseHealth
# Mehrere Instanzen
Get-sqmDatabaseHealth `
-SqlInstance "SQL01","SQL02" `
-MaxCheckDbAgeDays 7 `
-MaxVlfCount 100 `
-OutputPath "D:\Reports"
# Ausgabe (Auszug):
# Database Status LastFull VLFs CheckDB AutoGrowth
# -------- ------ -------- ---- ------- ----------
# SalesDB ok 2026-05-19 48 ok 3 Events
# HRDB WARN 2026-05-01 312 ok 0 Events
# ArchiveDB ERROR never 89 14d ago 0 Events
Deep Dive · Sicherheit & Compliance
Auditoren fragen konkrete Fragen. sqmSQLTool liefert konkrete Antworten - und behebt Schwachstellen automatisch.
Invoke-sqmSaObfuscation - umbenennen + zufaelliges 32-Zeichen Passwort. Voraussetzung: AD-Gruppe als sysadmin gesetzt. Rueckgabe: neuer Name + Passwort als Objekt.
Invoke-sqmLoginAudit - alle Logins, Rollen, letzter Login-Zeitpunkt. Erkennt verwaiste, deaktivierte und inaktive Accounts. Als CSV exportierbar.
Get-sqmSysadminAccounts - sofortige Uebersicht welche Accounts sysadmin-Rechte haben. Fuer Audit-Nachweise.
| Audit-Frage | Funktion | Aufwand |
|---|---|---|
| SA-Account noch aktiv? | Invoke-sqmSaObfuscation | 1 Befehl |
| Wer hat sysadmin? | Get-sqmSysadminAccounts | 1 Befehl |
| Letzte CHECKDB? | Get-sqmDatabaseHealth | Automatischer Report |
| Inaktive Logins? | Invoke-sqmLoginAudit | CSV-Export |
| SPNs korrekt? | Get-sqmSpnReport | Vergleich AD vs. erwartet |
| Zertifikate ablaufend? | Get-sqmCertificateReport | Warnung bei <30 Tage |
Deep Dive · Performance
Kein manuelles DMV-Stoebern mehr. sqmSQLTool liefert priorisierte Empfehlungen.
Get-sqmWaitStatistics - Top Wait Types mit Gewichtung. Sofort sichtbar ob I/O, CPU, Locking oder Memory das Problem ist.
Get-sqmMissingIndexes - aus sys.dm_db_missing_index_details, priorisiert nach Impact Score. Mit CREATE INDEX Statement.
Get-sqmLongRunningQueries - aktuelle + historische Langlaeufer aus DMVs, mit Query-Text-Auszug.
Invoke-sqmPerfBaseline - sammelt Performance-Counters ueber einen Zeitraum, speichert als CSV-Baseline fuer Vergleiche.
# Schritt 1: Was wartet gerade?
Get-sqmWaitStatistics | Select-Object -First 5
# WaitType WaitMs Percentage
# -------- ------ ----------
# PAGEIOLATCH_SH 45823 38.2 %
# LCK_M_S 12401 10.3 %
# CXPACKET 9822 8.2 %
# Schritt 2: Welche Indexes fehlen?
Get-sqmMissingIndexes -SqlInstance "SQL01" |
Sort-Object ImpactScore -Descending |
Select-Object -First 3
# Schritt 3: Baseline aufzeichnen (15 Min.)
Invoke-sqmPerfBaseline -Duration 15 `
-OutputPath "D:\Baseline"
Deep Dive · Inventory & Doku
Invoke-sqmInstanceInventory dokumentiert eine Instanz vollstaendig: Version, DBs, Logins, Jobs, AlwaysOn. TXT + CSV automatisch.
Version, Edition, Patch-Level, Collation, Max Memory, CPU-Anzahl, sp_configure-Werte
Name, Status, Recovery Model, Groesse, letztes Backup, Owner, Collation - alle User-DBs
Alle Logins mit Typ, Status, Serverrollen - sofort fuer Audit verwendbar
Alle Jobs mit Status, Owner, Schedule, letzter Ausfuehrung und Ergebnis
AGs, Replicas, Listener, Sync-Status - nur wenn konfiguriert
# Einzelne Instanz dokumentieren
Invoke-sqmInstanceInventory
# Mehrere Instanzen (Fleet)
'SQL01','SQL02','SQL03' |
Invoke-sqmInstanceInventory `
-ContinueOnError `
-OutputPath "\\srv\DBA-Reports\Inventory"
# Patch-Stand aller Instanzen
Invoke-sqmPatchAnalysis `
-SqlInstance 'SQL01','SQL02','SQL03'
# Ausgabe:
# Instance Version CU LatestCU Status
# -------- ------- -- -------- ------
# SQL01 2022 CU14 CU16 WARN
# SQL02 2022 CU16 CU16 ok
# SQL03 2019 RTM CU27 ERROR
Qualitaet & Testbarkeit
sqmSQLTool ist keine Skript-Sammlung. Es ist ein PS-Modul mit Unit-Tests, strukturiertem Logging und einheitlichen Konventionen.
Klare Trennung oeffentlicher API (87 Funktionen) und interner Helpers. Invoke-sqmLogging, Invoke-sqmHelpers nur intern.
Tests unter /tests/Unit/ fuer alle kritischen Funktionen. Mocking von dbaTools-Calls - kein echter SQL Server noetig.
Invoke-sqmLogging: File + EventLog + Verbose. Jede Funktion loggt konsistent. Zentrales OutputPath per Set-sqmConfig.
Install.cmd / Install.ps1: Auto-detect Admin, AllUsers oder CurrentUser. Robocopy ohne Zone.Identifier. Update.ps1 fuer Upgrades.
| Eigenschaft | Wert |
|---|---|
| Oeffentliche Funktionen | 87 |
| Pester-Test-Dateien | ~15 |
| PowerShell-Version | 5.1 (PS 7 kompatibel) |
| Abhaengigkeiten | dbaTools ≥ 2.0 |
| Logging | File + Windows EventLog |
| Konfiguration | Set-sqmConfig / Get-sqmConfig |
| Install-Scope | Auto-detect Admin → AllUsers |
Toolchain
sqmSQLTool ist das operative Rueckgrat. Alle anderen Tools stuetzen sich darauf.
PostInstall ruft: Invoke-sqmNtfsSetup, Invoke-sqmSaObfuscation, Invoke-sqmMonitoringKey, Install-sqmOlaMaintenanceSolution, New-sqmOlaMaintenanceJobs
Endpoint-Konfiguration, Monitoring-Key, SA-Check nach AG-Einrichtung
Basis fuer alle SQL-Operationen. sqmSQLTool ist eine Unternehmens-Erweiterungsschicht ueber dbaTools
Repair-sqmAlwaysOnDatabases schreibt EventId 1000/1001/1002 - sichtbar im SIEM/Splunk
Abgrenzung
| Aufgabe | sqmSQLTool? |
|---|---|
| AlwaysOn Auto-Repair | ✓ Ja - Repair-sqmAlwaysOnDatabases |
| AG-Aware Backup | ✓ Ja - Invoke-sqmUserDatabaseBackup |
| Instanz-Inventar | ✓ Ja - Invoke-sqmInstanceInventory |
| SA-Haertung | ✓ Ja - Invoke-sqmSaObfuscation |
| SQL Server installieren | - Nein → SQLSetupTool |
| AlwaysOn einrichten | - Nein → AlwaysOnSetup |
| Datenbanken migrieren | - Nein → SQLMigration |
| SSRS Reports deployen | - Nein → SSRSDeploymentTool |
| Deadlock-Sammlung GUI | - Nein → DeadlockCollector |
Referenz
Die Befehle die ein DBA taeglich oder woechentlich braucht.
| Aufgabe | Befehl |
|---|---|
| AG-Health pruefen | Get-sqmAgHealthReport |
| Blocking pruefen | Get-sqmBlockingReport |
| Lange Queries | Get-sqmLongRunningQueries |
| Disk Space | Get-sqmDiskSpaceReport |
| Instanz-Check | Get-sqmSQLInstanceCheck |
| AG Repair | Repair-sqmAlwaysOnDatabases |
| User-DB Backup | Invoke-sqmUserDatabaseBackup -All |
| Aufgabe | Befehl |
|---|---|
| DB Health Report | Get-sqmDatabaseHealth |
| Patch-Stand | Invoke-sqmPatchAnalysis |
| Missing Indexes | Get-sqmMissingIndexes |
| VLF/AutoGrowth | Get-sqmAutoGrowthReport |
| Login-Audit | Invoke-sqmLoginAudit |
| Sysadmin-Pruefung | Get-sqmSysadminAccounts |
| Inventarisierung | Invoke-sqmInstanceInventory |
Zusammenfassung
Repair-sqmAlwaysOnDatabases + New-sqmAlwaysOnRepairJob. AG-DB Fehler = Agent Job repariert automatisch
sys.fn_hadr_backup_is_preferred_replica geprueft. Kein Doppel-Backup mehr auf Primary und Secondary
SA-Obfuscation, Login-Audit, Sysadmin-Report, CHECKDB-Status - alle Compliance-Fragen beantwortet
Pipeline-faehige Funktionen: Inventar, Patch-Stand, Health-Report fuer N Instanzen gleichzeitig
87 Funktionen, Pester-Tests, einheitliches Logging - keine Script-Sammlung sondern ein Modul
# Von Share installieren (empfohlen)
Install.cmd # auto-detect Admin -> AllUsers
# Manuell als Admin (AllUsers)
.\Install.ps1 -Scope AllUsers
# Manuell CurrentUser
.\Install.ps1 -Scope CurrentUser
# Konfiguration setzen
Set-sqmConfig -OutputPath "D:\DBA-Reports"
| GitHub | github.com/JankeUwe/sqmSQLTool |
| Website | www.powershelldba.de |
| Modul-Import | Import-Module sqmSQLTool |