-- =================================================================================================================== -- SQLI-REPL-002: Replikering er forsinket -- =================================================================================================================== -- Regel-id: SQLI-REPL-002 -- Titel: Replikering er forsinket -- Alvor: Medium -- Versioner: SQL Server 2005 og nyere, kun på en distributør (som SQLI-REPL-001). -- -- Hvad tjekkes, og hvorfor: -- Om ændringer tager lang tid om at nå abonnenten. -- -- Vurdering (sker i C# ud fra de indsamlede data, ikke i SQL'en, medmindre andet er nævnt): -- Fund for agenter, der ikke er fejlet, hvor delivery_latency i seneste historikpost er mindst 5 minutter. -- -- Grænseværdier (konfigurationsnøgle i agentens appsettings.json og standardværdi): -- 300.000 ms (ReplicationSnapshot.LatencyThresholdMs, fast i koden). -- -- Rettigheder til agentens login (se db/permissions/grant-least-privilege.sql; [agent] = agentens login): -- GRANT VIEW ANY DEFINITION TO [agent]; -- metadata; giver IKKE adgang til data -- Kun på en distributør, valgfrit (gives ikke af grant-least-privilege.sql): -- USE distribution; CREATE USER [agent] FOR LOGIN [agent]; -- GRANT SELECT ON dbo.MSdistribution_agents TO [agent]; GRANT SELECT ON dbo.MSdistribution_history TO [agent]; GRANT SELECT ON dbo.MSrepl_errors TO [agent]; -- -- Data kommer fra (collector, fil : medlemmer, interval): -- ReplicationCollector -- Fil: src/SQLInsight.Collectors/Instance/ReplicationCollector.cs -- Medlemmer: ReplicationCollector.DistributionDatabaseSql, Db.CurrentDatabaseSql, -- ReplicationCollector.AgentsSql, ReplicationCollector.ErrorsSql -- Interval: 15 min som standard (SQLInsight:CollectorIntervals:replication) -- Delt script: SQL Scripts/_collectors/ReplicationCollector.sql -- Regelkode: src/SQLInsight.Rules/Availability/ReplicationRules.cs : ReplicationLatencyRule.Evaluate -- -- Read-only: Ja: kun SELECT samt USE (skifter sessionens database), SET-sessionsindstillinger. Intet ændrer data, -- indstillinger eller objekter. -- Kørsel: Kør i SSMS som agentens login (eller et login med samme rettigheder). Hver variant er sin egen batch -- (GO); en variant for en anden SQL Server-version end din kan fejle - det er forventet. -- Per-database-forespørgsler er vist for databasen msdb, som findes overalt: ret navnet til den -- database, du vil se. -- =================================================================================================================== -- ------------------------------------------------------------------------------------------------------------------- -- Forbindelsen: Sessionsindstillinger, agenten sætter på hver forbindelse -- ------------------------------------------------------------------------------------------------------------------- -- Variant: Alle versioner: sættes på hver forbindelse, agenten åbner -- Kilde: SqlConnectionFactory.SessionSettings -- Kode: src/SQLInsight.Connectivity/SqlConnectionFactory.cs : SqlConnectionFactory.SessionSettings SET LOCK_TIMEOUT 5000; SET DEADLOCK_PRIORITY LOW; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; GO -- ------------------------------------------------------------------------------------------------------------------- -- ReplicationCollector: På en distributør: hver distributionsagents seneste status, forsinkelse og besked samt -- replikeringsfejl det seneste døgn. -- ------------------------------------------------------------------------------------------------------------------- -- Variant: SQL Server 2005 og nyere -- Kilde: ReplicationCollector.DistributionDatabaseSql -- Kode: src/SQLInsight.Collectors/Instance/ReplicationCollector.cs : ReplicationCollector.DistributionDatabaseSql SELECT TOP 1 name FROM sys.databases WHERE is_distributor = 1 AND state = 0 GO -- Variant: Kun på en distributør: husk databasen, der skal skiftes tilbage til -- Kilde: ReplicationCollector.CurrentDatabaseSql -- Kode: src/SQLInsight.Collectors/Db.cs : Db.CurrentDatabaseSql SELECT DB_NAME() GO -- Variant: Kun på en distributør, i distributionsdatabasen -- Kilde: ReplicationCollector.AgentsSql -- Kode: src/SQLInsight.Collectors/Instance/ReplicationCollector.cs : ReplicationCollector.AgentsSql -- Agenten sender "USE [];" foran (navnet fra DistributionDatabaseSql). Ret navnet, hvis det ikke er distribution. USE [distribution]; SELECT TOP 500 a.name, a.publisher_db, h.runstatus, DATEADD(minute, DATEDIFF(minute, GETDATE(), GETUTCDATE()), h.time), h.delivery_latency, CAST(h.comments AS nvarchar(500)) FROM dbo.MSdistribution_agents a OUTER APPLY (SELECT TOP 1 x.runstatus, x.time, x.delivery_latency, x.comments FROM dbo.MSdistribution_history x WHERE x.agent_id = a.id ORDER BY x.timestamp DESC) h GO -- Variant: Kun på en distributør, i distributionsdatabasen -- Kilde: ReplicationCollector.ErrorsSql -- Kode: src/SQLInsight.Collectors/Instance/ReplicationCollector.cs : ReplicationCollector.ErrorsSql -- Agenten sender "USE [];" foran (navnet fra DistributionDatabaseSql). Ret navnet, hvis det ikke er distribution. USE [distribution]; SELECT COUNT(*) FROM dbo.MSrepl_errors WHERE time > DATEADD(hour, -24, GETDATE()) GO