# SQLInsight Pro **Gratis, on-prem overvågning af SQL Server med dyb ekspertise indbygget. Betalt support til dem der har brug for det.** SQLInsight Pro er et overvågningsværktøj til Microsoft SQL Server, skrevet i C# på .NET. Det kører hos kunden og forlader ikke netværket, medmindre kunden selv vælger det. Værktøjet nøjes ikke med at vise tal. Det forklarer, hvad der er galt, hvorfor det er et problem, og hvordan det løses. Rådene har samme niveau som dem, man får fra en erfaren DBA. > **Status:** Fase 1–4 er implementeret: agent, 81 indbyggede regler plus community-regler, notifikationer, lokalt repository og web-UI, licenser, signerede opdateringer, SQLInsight Hub med portal, erfaring på tværs af kunder, PDF-rapporter og integration med Prometheus, Grafana og SCOM, plus MSI-installer, community-websted og Discourse-forum. Se [installation](docs/installation.md), [opdateringer](docs/opdatering.md), [integration](docs/integration.md), [rapporter](docs/rapporter.md), [egne regler](docs/regler.md), [databehandling](docs/databehandling.md), [community](docs/community.md), [Roadmap](#roadmap) og [CONTRIBUTING.md](CONTRIBUTING.md). --- ## Vision De fleste gratis værktøjer til SQL Server kan vise, *at* noget er galt, fx blocking, høj CPU eller lange ventetider. Men de siger sjældent *hvorfor*, og endnu sjældnere *hvad man skal gøre*. De kommercielle værktøjer er dyre og låser ofte den vigtigste viden bag en licens. SQLInsight Pro vil gøre det anderledes: 1. **Hele produktet er gratis.** Overvågning, analyse og anbefalinger koster ikke noget. Vi fjerner ikke funktioner for at sælge en betalt version. 2. **Dyb SQL Server-ekspertise.** Hvert fund kommer med en forklaring, en vurdering af alvor, konkret evidens og et forslag til løsning, fx et script, en konfiguration eller en ændring af et index. 3. **On-prem først.** Agenten, databasen og web-UI'et kører i kundens eget miljø. Der sendes ingen data ud, uden at kunden aktivt har slået det til. 4. **Altid opdateret.** Selve værktøjet og regel-/vidensbasen opdateres løbende, så nye SQL Server-versioner, CU'er og kendte fejl bliver dækket. 5. **Betalt support er en service, ikke en funktion.** Kunder, der betaler, får adgang til mennesker med prioritet, og ikke til flere knapper i programmet. --- ## Forretningsmodel | | **Community** | **Professional** | **Enterprise** | |---|---|---|---| | Pris | Gratis | Abonnement | Abonnement | | Al overvågning og analyse | ✅ | ✅ | ✅ | | Opdateringer af værktøj og regelpakker | ✅ | ✅ | ✅ | | Community support ([forum](https://forum.seosoft.dk/c/sqlinsight)) | ✅ | ✅ | ✅ | | Prioriteret mailsupport med svartidsgaranti | – | ✅ | ✅ | | Telefonsupport | – | – | ✅ | | Findings-sync til SQLInsight Hub (proaktiv opfølgning) | – | Valgfrit | ✅ | | Hjælp til fortolkning af fund og tuning | – | Begrænset | ✅ | Professional og Enterprise låser ikke op for funktioner i softwaren. De giver adgang til **ekspertise og svartid**. Når en betalende kunde slår *findings-sync* til, kan supportteamet se kundens aktuelle problemer, før kunden ringer. --- ## Hvad analyseres? (dyb ekspertise, ikke kun låsninger) Blocking og deadlocks er kun ét område. Regelmotoren dækker hele SQL Server-instansen: **Performance** - Wait statistics med fortolkning (hvilke waits er normale, og hvilke peger på et reelt problem) - Blocking-kæder, head blockers og deadlock-grafer med analyse af årsagen - Query Store: plan-regressioner, forcerede planer der fejler, og queries med høj varians - Parameter sniffing og planer, der er følsomme over for parametre - Plan cache-analyse: implicitte konverteringer, key lookups, spills, manglende statistikker og for store memory grants - CPU-pres, scheduler-pres og worker thread exhaustion - Memory grants, RESOURCE_SEMAPHORE og buffer pool-pres - I/O-latens pr. fil og pr. database - TempDB-contention (PFS/GAM/SGAM) og konfiguration af TempDB **Indexes og statistikker** - Manglende indexes, vurderet kritisk (ikke bare DMV-forslagene ukritisk videregivet) - Ubrugte, duplikerede og overlappende indexes - Forældede statistikker og ascending key-problemer - Heaps med forwarded records **Konfiguration og best practice** - MAXDOP, cost threshold for parallelism, max server memory og optimize for ad hoc workloads - Database scoped configurations og compatibility level - Antal VLF'er, autogrowth-indstillinger og placering af filer - Trace flags og deres relevans for den aktuelle version **Drift og sikkerhed for data** - Backup-dækning og RPO i forhold til recovery model - Status for DBCC CHECKDB og tegn på korruption (suspect pages, 823/824/825) - Sundhed for Always On Availability Groups (send/redo queue, synkroniseringsstatus) - SQL Agent-jobs der fejler, og vigtige fejl i error log **Version og patch-niveau** - Registrering af SQL Server-version, edition og CU-niveau - Advarsel ved manglende CU'er eller sikkerhedsopdateringer og ved versioner, der ikke længere supporteres - Kendte fejl, der rammer den installerede build, med link til Microsofts dokumentation Hvert **finding** indeholder: - **Titel og alvor** (Info / Lav / Middel / Høj / Kritisk) - **Evidens**: de konkrete målinger, queries eller objekter, der udløste fundet - **Forklaring**: hvorfor det er et problem, skrevet så både DBA'er og udviklere kan følge med - **Anbefaling**: konkrete trin og, hvor det giver mening, et script (som aldrig køres automatisk) - **Referencer**: Microsoft Learn og anden anerkendt dokumentation --- ## Arkitektur ``` ┌──────────────────────── Kundens netværk (on-prem) ────────────────────────┐ │ │ │ ┌───────────────┐ DMV'er, Query Store, ┌──────────────────────────┐ │ │ │ SQL Server(e) │◄──Extended Events───────►│ SQLInsight Agent │ │ │ └───────────────┘ │ (Windows Service / │ │ │ │ Linux systemd) │ │ │ │ • Collectors │ │ │ │ • Regelmotor + regelpak.│ │ │ └────────────┬─────────────┘ │ │ │ │ │ ┌────────────▼─────────────┐ │ │ │ Lokalt repository │ │ │ │ (SQL Server-database) │ │ │ └────────────┬─────────────┘ │ │ │ │ │ ┌────────────▼─────────────┐ │ │ │ SQLInsight Web │ │ │ │ (ASP.NET Core + Blazor) │ │ │ └────────────┬─────────────┘ │ └──────────────────────────────────────────────────────────┼────────────────┘ │ HTTPS (opt-in, │ kun betalende) ┌────────────▼─────────────┐ │ SQLInsight Hub │ │ Ingestion API │ │ (ASP.NET Core) │ └────────────┬─────────────┘ │ ┌────────────▼─────────────┐ │ PostgreSQL │ │ Findings fra alle │ │ betalende kunder │ └──────────────────────────┘ ``` ### Komponenter | Komponent | Teknologi | Ansvar | |---|---|---| | **SQLInsight.Agent** | .NET Worker Service | Indsamler data, kører regelmotoren og gemmer fund lokalt | | **SQLInsight.Rules** | C#-bibliotek + versionerede regelpakker | Den samlede SQL Server-ekspertise som testbare regler | | **SQLInsight.Web** | ASP.NET Core + Blazor | Dashboard, fund, historik, trends og administration | | **SQLInsight.Updates** | .NET-bibliotek | Signeret opdateringsfeed: regelpakker, programpakker, verifikation og installation med tilbagerulning (`SQLInsight.Agent update …`) | | **SQLInsight.Licensing** | .NET-bibliotek | Signerede licenser og manifester (ECDSA P-256), verificeret offline | | **SQLInsight.Hub** | ASP.NET Core + EF Core (Npgsql) + Blazor | Centralt API, der modtager fund fra betalende kunder og skriver dem til PostgreSQL, og den interne portal: hvilke kunder har hvilke problemer, og hvor alvorlige er de? | | **SQLInsight.LicenseTool** | .NET-konsol (kun hos SEOSoft) | Nøglepar, licenser, regelpakker og udgivelse af opdateringsfeedet | ### Designprincipper - **Least privilege, aldrig sysadmin.** Agenten ændrer aldrig noget på de overvågede servere. Rettighederne leveres som ét versionsafhængigt script: - `VIEW SERVER STATE`. På SQL Server 2022+ bruges de mere granulære `VIEW SERVER PERFORMANCE STATE` og `VIEW SERVER SECURITY STATE`. - `VIEW DATABASE STATE` i hver database, som Query Store-data skal læses fra. - Læseadgang til `msdb`, som giver backup-historik og SQL Agent-jobs. - Seneste gode CHECKDB læses med `DATABASEPROPERTYEX(..., 'LastGoodCheckDbTime')` og ikke med `DBCC DBINFO`, som kræver sysadmin. - Tjenesten kører som gMSA med Windows-autentificering. SQL-login understøttes kun, hvor det er nødvendigt. - **Lav overhead, målt og ikke antaget.** - Alle DMV-queries kører med `SET LOCK_TIMEOUT`, `SET DEADLOCK_PRIORITY LOW`, korte command timeouts og `READ UNCOMMITTED`. - Tunge kilder hentes i trin med en grænse for rækker og bytes. Det gælder især plan cache med showplan-XML og `sys.dm_db_index_physical_stats`, der altid bruges i `LIMITED`-mode. - Kumulative tællere som wait stats, file stats og query stats lagres som deltaer mellem snapshots. Tidspunktet for genstart af instansen gemmes, så en genstart ikke giver fejlagtige tal. - Deadlocks hentes fra den eksisterende `system_health`-session, før der oprettes egne Extended Events-sessioner. - **Repository på en separat instans.** Overvågningsdata bør ikke ligge på den instans, der overvåges. SQL Server Express kan bruges til små installationer, men har en grænse på 10 GB pr. database. Der er derfor en fast retention-politik og aggregering af ældre data. - **Krypterede forbindelser som standard.** Microsoft.Data.SqlClient bruger `Encrypt=True`. Installeren validerer certifikaterne, og `TrustServerCertificate` kræver et bevidst valg. - **Findings-sync er opt-in og gennemsigtig.** Kunden kan se præcis, hvad der sendes. Som standard sendes kun fund og metadata, ikke data fra tabellerne. Querytekst kan anonymiseres eller udelades. Forbindelsen er TLS-krypteret og autentificeret med kundens licensnøgle. - **Hub'en er aldrig en direkte databaseforbindelse.** Agenten taler med et HTTPS-API og aldrig direkte med PostgreSQL. - **Regler er data med tests.** Hver regel har unit tests med kendte input og forventede fund, så ekspertisen kan udbygges uden regressioner. - **Opdateringer er signerede og kontrollerede.** Både binære filer og regelpakker er kodesignerede og verificeres, før de installeres. On-prem-kunder vælger selv mellem automatisk opdatering, opdatering efter godkendelse og offline-pakker til air-gapped miljøer. Hver opdatering af databaseskemaet kan rulles tilbage. - **Build- og CU-katalog er data.** Oversigten over SQL Server-builds, CU'er, support-livscyklus og kendte fejl ligger i regelpakken. Den kan derfor opdateres, uden at der skal frigives en ny version af selve værktøjet. --- ## Roadmap ### Fase 0: Fundament - [x] Solution-struktur (.NET 10 LTS): Agent, Rules, Web, Hub, fælles domænemodel - [x] CI-pipeline til Forgejo Actions (build, test, statisk analyse). Endnu ikke kørt på en runner - [x] Integrationstests mod rigtige SQL Server-containere (2017, 2019, 2022 og 2025) med Testcontainers. Indtil videre verificeret på 2022. Versionerne 2000–2016 findes ikke som containere og testes på VM'er - [x] Least-privilege-script til opsætning af rettigheder og en test, der verificerer det - [x] Capability-model: collectors og regler angiver, hvilken minimumsversion, edition og funktion de kræver - [ ] Spike: forbindelse til SQL Server 2000, 2005 og 2008 (driver, TLS 1.0 og ODBC-fallback). Resultatet afgør, om legacy-laget er et separat modul. ODBC-fallback er bygget, men ikke verificeret. Se [docs/legacy-versions.md](docs/legacy-versions.md) - [ ] Testmiljø med VM'er til de legacy-versioner, der ikke findes som containere (2000–2016) - [x] Datamodel for findings (fælles kontrakt mellem Agent og Hub) - [x] Bidragsguide, code of conduct og issue templates ### Fase 1: Community MVP - [x] Agent som Windows Service (og systemd) med forbindelse til en eller flere SQL Server-instanser, parallelt og isoleret - [x] Collectors: wait stats, blocking, deadlocks (system_health), CPU, hukommelse, I/O-latens, konfiguration, databaser, backups, CHECKDB, VLF'er, Query Store, tempdb, trace flags, suspect pages og plan cache - [x] Regelmotor med 42 regler, som hver har forklaring, evidens, anbefaling og eventuelt et fix-script - [x] Lokalt repository med migrationer, sporing af fund (set første gang, senest, løst), timeaggregering og retention - [x] Web-UI: oversigt, fund, detaljer, trends, ventetider, I/O, blocking og deadlocks (.xdl). Kan køre på IIS eller som Windows-tjeneste, med Windows-login - [x] Registrering af version og CU-niveau med advarsel om manglende opdateringer (katalog pr. september 2026) - [x] Legacy-collectors til 2000/2005/2008: versionsspecifik SQL er skrevet og unit-testet, men ikke kørt mod rigtige instanser (kræver VM'er, se Fase 0) - [x] Installationsvejledning ([docs/installation.md](docs/installation.md)) - [x] MSI-installer: agent og web som Windows-tjenester, indbygget .NET, installationsguide eller stille installation med parametre, opgradering, der bevarer indstillinger, og valgfri opdateringsopgave. Bygges på Linux (wixl) og i CI. Afprøvet under Wine, endnu ikke på en rigtig Windows Server ### Fase 2: Dyb analyse - [x] Query Store: planregressioner (med script til at forcere den gode plan), forcerede planer der fejler, og parameterfølsomme forespørgsler - [x] Plananalyse af de tungeste statements: implicitte konverteringer, joins uden betingelse, skalare UDF'er, spills og overdimensionerede memory grants - [x] Indexes og statistik: manglende indexes (vurderet mod eksisterende), ubrugte, duplikerede, heaps med forwarded records, forældede statistikker og slået-fra auto-statistik - [x] Always On availability groups (sundhed, datatab, redo-tid) og SQL Agent-jobs (fejl med trinbesked, Agent stoppet) - [x] Baselines pr. time på ugen og anomalier (CPU, trafik der stiger eller falder bort, page life expectancy) - [x] Notifikationer via e-mail, Microsoft Teams (Workflows) og signeret webhook - [x] Linux-agent (systemd) og Azure SQL Managed Instance (evergreen, Entra ID-login, Azure-håndterede områder vises som sådan). MI er ikke testet mod en rigtig instans ### Fase 3: Kommerciel platform - [x] Licensmodel: signerede licensnøgler (ECDSA P-256), der verificeres offline, og et værktøj til at udstede dem - [x] Auto-update af regelpakker (uden genstart) og af værktøjet, med stable- og preview-kanal. Feedet er signeret og kan ligge på https eller et fildrev (offline). Installationen er privilegeret, med backup, sundhedstjek og tilbagerulning. Se [docs/opdatering.md](docs/opdatering.md). Afprøvet på Linux; Windows-stien (tjenester, IIS app_offline, planlagt opgave) er ikke kørt på Windows endnu - [x] Findings-sync fra Agent til Hub API med kø, retry og backoff. Følsomme målinger udelades som standard, og kunden kan se præcis det sendte - [x] SQLInsight Hub med PostgreSQL: modtagelse, deduplikering (idempotent), historik pr. kunde, spærring af licenser og Docker Compose. Se [docs/hub.md](docs/hub.md) - [x] Hub-portal: overblik over kunder, kritiske fund og de mest udbredte problemer på tværs af kunder. Grafer over tendenser over tid mangler endnu - [x] Integration med support-flowet: fund kan knyttes til en supportsag (sagsnummer fra supportsystemet). Der er endnu ingen direkte kobling til et bestemt supportsystem - [x] Dokumentation til databehandleraftale (GDPR), opbevaringsfrister og sletning af kunder i hubben. Se [docs/databehandling.md](docs/databehandling.md) - [ ] Log over medarbejderes adgang og tofaktorlogin i portalen ### Fase 4: Videre - [x] Anbefalinger på tværs af kunder: Hubben ser, hvilke fund der forsvinder efter en opdatering, og agenterne viser "hos 4 kunder forsvandt dette efter CU21" på fundet. Deles kun samlet og anonymt fra mindst 3 kunder. Se [docs/hub.md](docs/hub.md#erfaring-på-tværs-af-kunder) - [x] Rapporter (PDF) til ledelse og compliance: nøgletal, sammenfatning i almindeligt sprog, kontroller, instanser og alvorlige fund. Kan hentes i webbrugerfladen og sendes månedligt på mail. Se [docs/rapporter.md](docs/rapporter.md) - [x] Rettighedsrevision: sysadmin og øvrige serverroller med Windows-grupper foldet ud via AD, ændringer med hvem/hvornår fra default trace, fund ved nye medlemmer og revisionsrapport (PDF). Se [docs/rettigheder.md](docs/rettigheder.md) - [x] Mulighed for, at community selv bidrager med regler: regler som SQL i JSON (community via pull request og signeret regelpakke, lokale regler hos kunden), med validering og `rules test` mod en instans. Se [docs/regler.md](docs/regler.md) - [x] API til integration med eksisterende monitorering: JSON-API og Prometheus-endpoint med API-tokens, Grafana-dashboard, og Windows' hændelseslog med faste event-id'er til SCOM. Se [docs/integration.md](docs/integration.md) - [x] Community-websted (download af signerede udgivelser, dokumentation, SQL Server-versioner, regler, support) og Discourse-forum på dansk med kategorier, løste svar og opsætning som kode. Se [docs/community.md](docs/community.md) ## Understøttede versioner SQLInsight Pro overvåger **alle SQL Server-versioner fra SQL Server 2000 og frem**. Ikke alt kan måles på alle versioner. Agenten registrerer derfor, hvad instansen kan (version, edition og funktioner), og vælger de collectors og regler, der passer til den. Hvis en regel ikke kan vurderes på en given version, vises den som **"ikke målbar på denne version"**. Den må aldrig fremstå som "OK". | Version | Datakilder | Hvad kan analyseres | Begrænsninger | |---|---|---|---| | **2000** (8.0) | `sysprocesses`, `DBCC SQLPERF(WAITSTATS)`, `sysindexes`, `sp_configure`, `msdb`, error log | Blocking, waits, konfiguration, backup, filstørrelser og version | Ingen DMV'er og ingen granulære rettigheder. Deadlocks kun via trace flag 1204 i error log. Ingen plananalyse. | | **2005** (9.0) | DMV'er, default trace | Waits, query stats, plan cache, missing/unused indexes, I/O-latens, blocking-kæder | Ingen Extended Events. Deadlocks via trace flag 1222 og error log. | | **2008 / 2008 R2** (10.x) | + Extended Events, `system_health` | Deadlock-grafer fra ring buffer og Resource Governor | `system_health` har kun ring buffer. Deadlock-XML er ufuldstændig før 2008 R2. | | **2012 / 2014** (11–12) | + `system_health` med file target, AlwaysOn-DMV'er | Always On AG, historik over deadlocks, udvidede query-metrikker | | | **2016** (13) | + Query Store, `LastGoodCheckDbTime` (SP2) | Planregressioner og CHECKDB uden sysadmin | | | **2017 / 2019** (14–15) | + automatic tuning, `dm_exec_query_plan_stats` | Tilgængelighed af seneste faktiske plan og Linux-instanser | | | **2022 / 2025** (16–17) | + granulære rettigheder, Query Store hints, PSP optimization | Fuld dækning | | **Livscyklus:** Alle versioner til og med SQL Server 2016 er uden for Microsofts support (extended support for 2016 sluttede i juli 2026). De bliver overvåget, men versionen vises altid som et **kritisk fund** med en anbefalet opgraderingssti. **Legacy-forbindelser:** Moderne .NET-drivere og TLS 1.2 er ikke kompatible med de ældste versioner. Uopdaterede 2005/2008-instanser understøtter typisk kun TLS 1.0, og Microsoft.Data.SqlClient understøtter ikke SQL Server 2000. Agenten har derfor et separat forbindelseslag til legacy-versioner (ODBC-baseret), som bruges automatisk ved behov. Kunden får en tydelig advarsel om den svagere kryptering. **Rettigheder på ældre versioner:** På SQL Server 2000 findes `VIEW SERVER STATE` ikke, så nogle checks kræver forhøjede rettigheder. Det er dokumenteret pr. regel, og kunden vælger selv, hvilke checks der slås til. Øvrige mål: Standard, Enterprise, Developer og Express edition. Senere kommer Azure SQL Managed Instance. --- ## Bidrag Projektet er i en tidlig fase. Idéer til regler, eller eksempler på SQL Server-problemer du gerne vil have værktøjet til at fange, er meget velkomne som issues. ## Licens [MIT](LICENSE)