sql >> Databasteknik >  >> RDS >> Sqlserver

Felsökning av SQL Server-replikering

I den tidigare artikeln, Ställa in och konfigurera SQL Server-replikering, diskuterade vi ingående, SQL Server-replikeringskonceptet, dess komponenter, typer och hur man konfigurerar SQL-transaktionell replikering steg för steg. Det rekommenderas starkt att gå igenom den föregående artikeln och förstå replikeringskonceptet och dess komponenter innan du läser den här artikeln. I den här artikeln kommer vi att se hur du felsöker en befintlig SQL Server Replication-webbplats.

Felsökningsöversikt

Huvudmålet med SQL Server-replikeringen är att hålla data i utgivaren och abonnenten synkroniserade. I det lyckliga scenariot, om en transaktion utförs och genomförs i publiceringsdatabasen, kommer den att kopieras till distributionsdatabasen och sedan synkroniseras och tillämpas på alla prenumeranter som är anslutna till den utgivaren. Om ett problem uppstår i något steg av denna process, kommer utgivarändringarna inte att vara tillgängliga på prenumerantsidan. I det här fallet måste vi felsöka och åtgärda problemet så snart som möjligt innan vi slutar med en utgången SQL-replikeringswebbplats som bör synkroniseras igen från början eller att en databas med dess transaktionsloggfil får slut på ledigt utrymme, vilket pausar alla databastransaktioner .

Att identifiera vid vilket steg replikeringssynkroniseringen misslyckas och tilldela ett vägledande felmeddelande som leder till att problemet åtgärdas, är den mest utmanande delen av felsökningsprocessen för SQL Server-replikering. Att kontrollera den senaste synkroniseringstiden och vilka ändringar som utfördes vid/efter den tidpunkten som kan orsaka detta fel, kan också hjälpa till att felsöka replikeringssynkroniseringsfelet.

Att förstå rollen för SQL Server-replikeringsagenten hjälper till att identifiera i vilket steg synkroniseringen misslyckas. Kom ihåg att det finns tre replikeringsagenter som är gemensamma för de flesta SQL Server-replikeringstyper. Snapshot Agent är ansvarig för att skapa den första ögonblicksbilden för synkronisering. Log Reader Agent ansvarar för att läsa ändringarna från databasens transaktionsloggfil och kopiera den till distributionsdatabasen och slutligen Distribution agent som ansvarar för att synkronisera ändringarna till prenumeranterna.

I den här artikeln kommer vi att dra nytta av replikeringsmonitorn och Job Activity Monitor fönster för att övervaka SQL Server-replikeringsstatus och få information om eventuella synkroniseringsfel.

Felsökningsscenarier

Det bästa och enkla sättet att förstå hur man felsöker SQL Server-replikeringsproblemen är genom att tillhandahålla praktiska scenarier och visa hur man åtgärdar just detta problem. Låt oss börja diskutera scenarierna ett efter ett.

SQL Server Agent Service Problem

Tjänsten SQL Server Agent spelar en viktig roll i synkroniseringsprocessen för SQL Server-replikering. Detta beror på att varje replikeringsagent kommer att köras under ett SQL-agentjobb.

Som en proaktiv databasadministratör måste du dagligen kontrollera SQL-replikeringsplatsens status. För att kontrollera replikeringsplatsens status högerklickar du på publikationen under noden Replikering -> Lokala publikationer och väljer Starta replikeringsmonitor alternativ, som visas nedan:

I fönstret Replikeringsövervakning kan du se ett varningsmeddelande som visar att replikeringen kommer att löpa ut snart eller redan har gått ut, utan att se något indikativt felmeddelande, enligt nedan:

Om fönstret Replikeringsövervakning inte ger oss någon användbar information om varför replikeringsplatsen snart upphör, är nästa steg att kontrollera Jobbaktivitetsövervakaren under SQL Server Agent-noden. När du besöker SQL Server Agent-noden ser du direkt att SQL Server Agent Service inte körs (från den röda cirkeln bredvid). Om SQL Server Agent Service inte körs betyder det att alla jobb som skapats under den instansen inte fungerar, inklusive replikeringsagentjobben. Som ett resultat av detta fungerar inte den övergripande replikeringsplatsen.

För att åtgärda problemet måste vi starta SQL Server Agent-tjänsten direkt från SQL Server Management Studio eller använda SQL Server Configuration Manager (rekommenderas), som visas nedan:

Efter att ha startat SQL Server Agent-tjänsten, kontrollera replikeringsmonitorn igen och se till att prenumerantstatusen är Kör och alla pågående transaktioner synkroniseras med abonnenten framgångsrikt. Du kan kontrollera dessa steg ett efter ett genom att kontrollera att posterna är kopierade från avsnittet Utgivare till distributör:

Synkroniserades sedan från distributören till abonnenten, enligt nedan:

Och se till slutligen att det inte finns någon odistribuerad transaktion från den sista fliken, som visas nedan:

Efter det måste vi se till att replikeringsagentjobben är igång utan problem. SQL Agent-jobben kan kontrolleras genom att expandera SQL Server Agent-noden under SSMS Object Explorer och se övervakaren för jobbaktivitet och kontrollera sedan om Log Reader Agent och Distributor-agenten körs, med hänsyn till att Snapshot Agent endast kommer att fungera under processen för att skapa ögonblicksbilder, som visas nedan:

Du kan också granska historiken för replikeringsagentens jobb och kontrollera den tidigare felorsaken genom att högerklicka på det jobbet och välja Visa historik alternativ enligt nedan:

Där du kan hitta ett vägledande felmeddelande som hjälper dig att lösa det här problemet i framtiden, enligt nedan:

För att lösa det tidigare problemet bör SQL Server Agent-tjänstens startläge ändras från Manuell till Automatisk, på detta sätt ser du till att tjänsten startar automatiskt när värdservern startas om.

Snapshot Agent Permission Issue

Anta att när du kontrollerade SQL Server-replikeringsstatusen, med hjälp av replikeringsmonitorn, märkte du att det finns ett replikeringsfel, från X-tecknet inuti den röda cirkeln. Och replikeringsmonitorn visar att felet kommer från en av replikeringsagenterna, från X-tecknet inuti den röda cirkeln överst på fliken Agenter.

För att identifiera replikeringsfelet bör vi bläddra på fliken Agenter och kontrollera vilken agent som misslyckas. På sidan Agenter ser du att ögonblicksbildsagenten är den misslyckade. Dubbelklicka på Snapshot Agent och granska nedanstående felmeddelande:

Replikeringsagenten har inte loggat ett förloppsmeddelande på 10 minuter. Detta kan tyda på en agent som inte svarar eller hög systemaktivitet. Kontrollera att poster replikeras till destinationen och att anslutningarna till prenumeranten, utgivaren och distributören fortfarande är aktiva.

Tyvärr är detta felmeddelande generiskt och det visar bara att Snapshot Agent inte fungerar utan att ange orsaken, enligt följande:

Då måste vi söka efter användbar information på ett annat ställe, som är Snapshot Agent-jobbet. Från fönstret Job Activity Monitor, under SQL Server Agent-noden, kan du se att Snapshot Agent-jobbet misslyckades. Och från den jobbhistoriken kan du se att den misslyckades nyligen på grund av proxyautentiseringsproblemet. Med andra ord, autentiseringsuppgifterna för kontot som Snapshot Agent körs under är inte korrekta, som visas nedan:

För att åtgärda autentiseringsproblemet med Snapshot Agent högerklickar du på publikationen under replikeringsnoden -> Lokal publikation och väljer Egenskaper alternativ. I fönstret Publikationsegenskaper bläddrar du i Agentsäkerhet sida och sätt in autentiseringsuppgifterna för kontot som Snapshot Agent kommer att köras under.

Efter att ha uppdaterat användaruppgifterna för Snapshot Agent-kontot, starta Snapshot Agent-jobbet igen, från fönstret Job Activity Monitor, och se till att jobbet fungerar som det ska, enligt nedan:

Kontrollera också om Snapshot Agent fungerar bra nu och felmeddelandet inte längre visas under replikeringsmonitorn, som visas nedan:

Behörighetsproblem för ögonblicksbildmapp

Anta att när du försöker synkronisera utgivaren och prenumeranten med den första ögonblicksbilden eller omsynkronisera Snapshot-replikeringsplatsen med en ny ögonblicksbild, misslyckades processen för att skapa ögonblicksbild med åtkomstfelmeddelandet nedan:

Det här felmeddelandet visar att kontot som Snapshot Agent körs under inte har behörighet att komma åt ögonblicksbildsmappen som anges i felmeddelandet.

För att åtgärda problemet måste vi kontrollera kontot som Snapshot Agent körs under, från Agent Security-sidan i fönstret Publication Properties, som visas nedan:

Bläddra sedan i ögonblicksbildsmappen som anges i felmeddelandet och se till att detta Snapshot-konto har minsta läs- och skrivbehörighet för den mappen, kör sedan Snapshot Agent igen och se att problemet är åtgärdat nu och att ögonblicksbilden för synkronisering har skapats framgångsrikt, eftersom nedan:

Problembehörighet för prenumeranter

Anta att när du kontrollerar SQL Server-replikeringsplatsens status, med hjälp av replikeringsmonitorn, ser du att det finns ett fel med abonnenten, som visas nedan:

Om du klickar på felikonen ser du att felet har inträffat när du försöker synkronisera transaktionerna från distributören till abonnenten. Och från felmeddelandet är det tydligt att distributören inte kan ansluta till Subscriber SQL Server-instansen på grund av behörighetsproblem, som visas nedan:

För att åtgärda det problemet måste vi kontrollera och uppdatera autentiseringsuppgifterna som används för att ansluta till Subscriber-instansen. För att kontrollera referenserna, högerklicka på prenumerationen under replikeringsnoden -> Lokala publikationer -> det aktuella publikationsnamnet och välj alternativet Egenskaper. Från Subscriber Connection fältet under fönstret Subscriber Properties, uppdatera autentiseringsuppgifterna för kontot som kommer att användas för att ansluta till Subscriber-instansen, som visas nedan:

Efter det kontrollerar du replikeringsstatusen igen från replikeringsmonitorn och du kommer att se att problemet med abonnentanslutningen inte längre är tillgängligt och att replikeringsplatsen körs normalt, som visas nedan:

Prenumerant kan inte nås

Ett annat problem med SQL Server Replikering som du kan möta från abonnentsidan är att distributören inte kan ansluta till abonnenten, vilket visar under distributören till abonnentsidan att den inte kan öppna anslutningen med abonnenten på grund av "Nätverk Relaterat … ” anslutningsfel, visas i fönstret Replikeringsövervakning nedan:

Det här felmeddelandet indikerar att det finns ett anslutningsproblem mellan distributörsinstansen och abonnentinstansen. Det första och enkla sättet att kontrollera detta anslutningsproblem är att se till att Subscriber SQL Server-instansen är online. Detta kan kontrolleras från SQL Server Configuration Manager från abonnentsidan. I vår situation kan vi se att SQL Server Service på abonnentsidan är stoppad. För att åtgärda problemet startar du SQL Server Service och kontrollerar från replikeringsmonitorn att replikeringsplatsen är synkroniserad igen, som visas nedan. För mer avancerade SQL-anslutningsproblem, se dokumentet Felsökning av anslutningar MS:

Problembehörighet för prenumerantdatabas

Anta att du kontrollerar SQL Server-replikeringssynkroniseringsstatusen med hjälp av replikeringsmonitorn och det visar sig att replikeringen misslyckas när du försöker replikera ändringarna från distributören till abonnenten. Klicka på abonnentfelet och du ser att Distributören kan nå abonnenten och ansluta till den, men kan inte ansluta till prenumerationsdatabasen på grund av bristande behörighetsproblem, som visas nedan:

För att åtgärda problemet, anslut till prenumeranten och se till att kontot som används för att ansluta till prenumerantdatabasen är en medlem av den fasta rollen db_Owner databasen, som visas nedan:

Efter det, kontrollera replikeringsmonitorn igen och se till att distributören kan nå prenumerationsdatabasen och replikera ändringarna, enligt nedan:

Dataskillnadsproblem

Anta att ett av databasutvecklingsteamen hävdar att det finns några ändringar som utförs i tabellen Shifts på Publisher (SQL1) som inte återspeglas i de dagliga rapporterna som körs på Subscriber-instansen (SQL2), och han gav ögonblicksbilden nedan som visar att ändringarna inte replikeras:

Det första steget i att kontrollera replikeringssynkroniseringsproblemet är att öppna replikeringsmonitorn och hitta vid vilket steg den misslyckas. Från replikeringsmonitorn kan du se att Log Reader-agenten misslyckas, eftersom ändringarna inte replikeras från distributören till abonnenten, men inget tydligt meddelande returneras från den agenten, som visas nedan:

Eftersom vi inte kan hitta ett meningsfullt felmeddelande från replikeringsmonitorn kommer vi att kontrollera historiken för Log Reader Agent-jobbet med hjälp av Job Activity Monitor, som visar att autentiseringsuppgifterna för kontot som Log Reader Agent körs under är felaktiga , som visas nedan:

För att åtgärda problemet med autentiseringsuppgifterna för Log Reader Agent, bläddra på sidan Agentsäkerhet i fönstret Publication Properties och uppdatera log Reader Agent-uppgifterna med en giltig, enligt nedan:

Om du kontrollerar replikeringsmonitorn igen kommer du att se att ändringarna har replikerats framgångsrikt och att data uppdateras med de nya skiftändringarna, som visas nedan:

Rad hittades inte hos prenumerant

Låt oss titta på frågan från en annan sida. Låt oss säga att det har gjorts en förändring i skifttabellen som visas nedan:

Men denna ändring replikeras inte till abonnenten och den övergripande SQL Server-replikeringsplatsen misslyckades. Från replikeringsmonitorn kan du se att det misslyckas när du försöker göra ändringen från distributören till abonnenten och misslyckades på grund av att den inte kan uppdatera den specifika posten med ID lika med 3, eftersom denna post är inte tillgänglig i tabellen Prenumerantdatabas, som visas nedan:

Om du kontrollerar den posten på prenumerantsidan (SQL2) ser du att posten inte är tillgänglig, enligt nedan:

För att lösa det här problemet måste vi infoga den posten igen i abonnentdatabastabellen och låta distributören försöka uppdatera den igen och åtgärda problemet med replikeringssynkroniseringsfelet, som visas nedan:

SQL Server ger oss ett alternativ att låta replikeringsplatsen fortsätta att fungera även om ett datainkonsekvensproblem hittas, där du kan åtgärda detta inkonsekvensproblem manuellt senare. För att göra det, från replikeringsmonitorn, högerklicka på prenumeranten och välj Agentprofil alternativ, som visas nedan:

Från det visade fönstret kan du uppdatera Log Reader Agent-profilen och tillåta den att fortsätta replikera dataändringar i fall det finns problem med datainkonsekvens, som visas nedan:

Oinitierat prenumerationsproblem

Om replikeringsplatsen lämnas utan övervakning under en längre tid, och ett fel inträffade utan någon åtgärd i mer än tre dagar, kommer replikeringsplatsen att förfalla och prenumerationen kommer att markeras som oinitierad och väntar på att återinitieras igen med en ny ögonblicksbild . Samma scenario kan uppstå när du skapar en ny prenumeration utan att initiera den, som visas nedan:

För att åtgärda problemet bör vi återinitiera den prenumerationen genom att högerklicka på prenumerationen under replikeringsnoden -> Lokala publikationer och expandera publikationen, välj sedan alternativet Reinitialize och markera denna prenumeration för initiering och gör den redo att ta emot en ny ögonblicksbild, som visas nedan:

Om prenumerationsstatusen förblir Oinitierad efter att ha återinitierat den, kontrollera Snapshot Agent-jobbet med hjälp av fönstret Jobbaktivitetsövervakning och se varför det misslyckas. Från Snapshot Agent jobbhistorik kommer du att se att jobbet misslyckades på grund av ett problem som bestämmer ägaren till det agentjobbet, som visas nedan:

För att lösa detta problem, öppna Snapshot Agent-jobbet och ändra ägaren till jobbet till SA eller någon giltig administratörsanvändare, och jobbet kommer att köras framgångsrikt enligt nedan:

Nu kommer du att se att prenumerationsstatusen ändrades till Kör, vilket ger att den väntar på att den första ögonblicksbilden ska starta synkroniseringsprocessen, som visas nedan:

För att skapa en ny ögonblicksbild, högerklicka på publikationen, under replikeringsnoden-> Lokala publikationer, och välj Visa status för ögonblicksbildagent alternativ.

Från det öppnade fönstret klickar du på Start-knappen för att starta processen för att skapa ögonblicksbilder. När ögonblicksbilden som innehåller alla utgivarartiklar har skapats framgångsrikt öppnar du replikeringsmonitorn igen och kontrollerar prenumerationens status, där du ser att ögonblicksbilden tillämpas på prenumeranten och synkroniseras med utgivaren, som visas nedan:

Ägarproblem för utgivardatabas

Antag också att, när du kontrollerar statusen för SQL Server-replikeringsplatsen, med hjälp av replikeringsmonitorn, misslyckades replikeringsplatsen och felet upptäcktes hos Log Reader Agent. När du kontrollerar felmeddelandet som returneras från den agenten visar det sig att det finns ett problem som avgör den nuvarande ägaren av publikationsdatabasen, som visas nedan:

För att åtgärda problemet måste vi uppdatera den aktuella publikationens databasägare genom att ersätta den med en giltig databasanvändare med SP_changedbowner systemlagrad procedur, eller helt enkelt från databasegenskapersfönstret. Därefter kör du Log Reader Agent-jobbet igen, med hjälp av fönstret Job Activity Monitor, och verifiera sedan om agentproblemet inte längre är tillgängligt, med hjälp av replikeringsmonitorn, som visas nedan:

Slutsats

I den här artikeln visade vi olika problem som du kan möta när du använder SQL Server-replikeringsfunktionen för att kopiera data mellan olika webbplatser och hur du åtgärdar dessa problem.

Det rekommenderas starkt att hålla SQL Server Engine uppdaterad, med de senaste SP:erna och CU:erna, så att alla buggar relaterade till SQL Server Replication-funktionerna kommer att fixas automatiskt. Slutligen, som en proaktiv SQL Server-databasadministratör, håll ett öga på din replikeringswebbplats för att åtgärda eventuella problem från början innan det blir större och svårare att fixa.


  1. MariaDB JSON_QUERY() Förklarad

  2. Installera MySQL på Ubuntu utan en lösenordsuppmaning

  3. Hur man skapar en exekveringsplan i SQL Server

  4. Applikationsanvändare kontra Row Level Security