Dela via


Felsökare: Hitta fel med SQL Server-transaktionsreplikering

gäller för:SQL ServerAzure SQL Managed Instance

Felsökning av replikeringsfel kan vara frustrerande utan grundläggande förståelse för hur transaktionsreplikering fungerar. Det första steget när du skapar en publikation är att låta ögonblicksbildsagenten skapa ögonblicksbilden och spara den i mappen ögonblicksbild. Därefter tillämpar distributionsagenten ögonblicksbilden på prenumeranten.

Den här processen skapar publikationen och placerar den i synkroniseringstillståndet . Synkroniseringen fungerar i tre faser:

  1. Transaktioner sker på objekt som replikeras och markeras "för replikering" i transaktionsloggen.

  2. Loggläsaragenten söker igenom transaktionsloggen och letar efter transaktioner som har markerats som "för replikering". Dessa transaktioner sparas sedan i distributionsdatabasen.

  3. Distributionsagenten söker igenom distributionsdatabasen med hjälp av läsartråden. Genom att använda skrivtråden ansluter agenten sedan till prenumeranten för att tillämpa ändringarna på prenumeranten.

Fel kan inträffa i alla steg i den här processen. Att hitta dessa fel kan vara den mest utmanande aspekten av felsökning av synkroniseringsproblem. Tack och lov gör användningen av Replikeringsövervakaren den här processen enkelt.

Anmärkning

Syftet med den här felsökningsguiden är att lära ut felsökningsmetoder. Den är utformad för att inte lösa ditt specifika fel, utan för att ge allmän vägledning för att hitta fel med replikering. Vissa specifika exempel tillhandahålls, men lösningen för dem kan variera beroende på miljön. Exempelfel baseras på handledningen Konfigurera replikering mellan två fullständigt anslutna servrar (transaktionella).

Felsökningsmetodik

Frågor att ställa

  1. Var i synkroniseringsprocessen misslyckas replikeringen?
  2. Vilken agent har ett fel?
  3. När fungerade replikeringen senast? Har något förändrats sedan dess?

Steg att vidta

  1. Använd Replikeringsövervakaren för att identifiera vid vilken tidpunkt replikeringen stöter på felet (vilken agent?):

    • Om det uppstår fel i avsnittet Utgivare till distributör är problemet med Log Reader-agenten.
    • Om det uppstår fel i avsnittet Distributör till prenumerant gäller problemet distributionsagenten.
  2. Titta igenom agentens jobbhistorik i Jobbaktivitetsövervakaren för att identifiera information om felet. Om jobbhistoriken inte visar tillräckligt med information kan du aktivera utförlig loggning på den specifika agenten.

  3. Försök att fastställa en lösning för felet.

Hitta fel med ögonblicksbildsagenten

Ögonblicksbildsagenten genererar ögonblicksbilden och skriver den till den angivna ögonblicksbildmappen.

  1. Visa status för din ögonblicksbildsagent:

    1. I Object Explorer expanderar du noden Lokal publikation under Replikering.

    2. Högerklicka på AdvWorksProductTrans>Visa status för Snapshot Agent.

    Skärmbild av kommandot Visa status för ögonblicksbildagent på snabbmenyn.

  2. Om ett fel rapporteras i Status för ögonblicksbildsagenten kan du hitta mer information i jobbhistoriken för ögonblicksbildsagenten:

    1. Expandera SQL Server-agenten i Object Explorer och öppna Jobbaktivitetsövervakaren.

    2. Sortera efter kategori och identifiera ögonblicksbildsagenten efter kategorin REPL-Snapshot.

    3. Högerklicka på ögonblicksbildsagenten och välj sedan Visa historik.

    Skärmbild av val för att öppna historiken för ögonblicksbildsagenten.

  3. I historiken för ögonblicksbildsagenten väljer du relevant loggpost. Det här är vanligtvis en rad eller två före posten som rapporterar felet. (Ett rött X anger fel.) Granska meddelandetexten i rutan under loggarna:

    Skärmbild av fel för ögonblicksbildagent vid nekad åtkomst.

    The replication agent had encountered an exception.
    Exception Message: Access to path '\\node1\repldata.....' is denied.
    

Om dina Windows-behörigheter inte har konfigurerats korrekt för ögonblicksbildmappen visas felet "åtkomst nekas" för ögonblicksbildsagenten. Du måste verifiera behörigheter till mappen där ögonblicksbilden lagras och se till att kontot som används för att köra Ögonblicksbildsagenten har behörighet att komma åt resursen.

Hitta fel med Log Reader-agenten

Loggläsaragenten ansluter till din utgivardatabas och söker igenom transaktionsloggen efter transaktioner som har markerats som "för replikering". Sedan läggs dessa transaktioner till i distributionsdatabasen.

  1. Anslut till utgivaren i SQL Server Management Studio. Expandera servernoden, högerklicka på mappen Replikering och välj sedan Starta replikeringsövervakaren:

    Skärmbild av kommandot Starta replikeringsövervakaren på snabbmenyn.

    Replikeringsövervakaren öppnas:

    Skärmbild av Replikeringsövervakaren.

  2. Det röda X anger att publikationen inte synkroniseras. Expandera Mina utgivare till vänster och expandera sedan relevant utgivarserver.

  3. Välj publikationen AdvWorksProductTrans till vänster och leta sedan efter det röda X:et på en av flikarna för att identifiera var problemet finns. I det här fallet finns det röda X på fliken Agenter , så en av agenterna får ett fel:

    Skärmbild av Red X på fliken Agenter i Replikeringsövervakaren.

  4. Välj fliken Agenter för att identifiera vilken agent som stöter på felet:

    Skärmbild av Red X på den misslyckade Log Reader-agenten i Replikeringsövervakaren.

  5. I den här vyn visas två agenter, Snapshot Agent och Log Reader Agent. Den som stöter på ett fel har det röda X:et. I det här fallet är det loggläsaragenten.

    Dubbelklicka på raden som rapporterar felet för att öppna agenthistoriken för Log Reader Agent. Den här historiken innehåller mer information om felet:

    Skärmbild av felinformation för loggläsaragenten.

    Status: 0, code: 20011, text: 'The process could not execute 'sp_replcmds' on 'NODE1\SQL2016'.'.
    The process could not execute 'sp_replcmds' on 'NODE1\SQL2016'.
    Status: 0, code: 15517, text: 'Cannot execute as the database principal because the principal "dbo" does not exist, this type of principal cannot be impersonated, or you do not have permission.'.
    Status: 0, code: 22037, text: 'The process could not execute 'sp_replcmds' on 'NODE1\SQL2016'.'.
    
  6. Felet uppstår vanligtvis när utgivarens databasägare inte har angetts korrekt. Detta kan inträffa när en databas återställs. Så här kontrollerar du det:

    1. Expandera Databaser i Objektutforskaren.

    2. Högerklicka på AdventureWorks2022>Egenskaper.

    3. Kontrollera att en ägare finns under sidan Filer . Om den här rutan är tom är det den troliga orsaken till problemet.

    Skärmbild av sidan Filer i databasegenskaperna med en tom

  7. Om ägaren är tom på sidan Filer, öppna ett nytt frågefönster i AdventureWorks2022-databasens kontext. Kör följande T-SQL-kod:

    -- set the owner of the database to 'sa' or a specific user account, without the brackets.
    EXECUTE sp_changedbowner '<useraccount>';
    -- example for sa: exec sp_changedbowner 'sa'
    -- example for user account: exec sp_changedbowner 'sqlrepro\administrator'
    
  8. Du kan behöva starta om Log Reader-agenten:

    1. Expandera SQL Server Agent-noden i Object Explorer och öppna Jobbaktivitetsövervakaren.

    2. Sortera efter kategori och identifiera Log Reader Agent efter kategorin REPL-LogReader .

    3. Högerklicka på jobbet Log Reader Agent och välj Starta jobb i Steg.

    Skärmbild av val för att starta om log reader-agenten.

  9. Kontrollera att publikationen nu synkroniseras genom att öppna Replikeringsövervakaren igen. Om den inte redan är öppen kan du hitta den genom att högerklicka på Replikering i Object Explorer.

  10. Välj publikationen AdvWorksProductTrans , välj fliken Agenter och dubbelklicka på Log Reader Agent för att öppna agenthistoriken. Nu bör du se att Loggläsaragenten körs och antingen replikerar kommandon eller har "inga replikerade transaktioner":

    Skärmbild av Log Reader Agent som körs utan replikerade transaktioner.

Hitta fel med distributionsagenten

Distributionsagenten hittar data i distributionsdatabasen och tillämpar dem sedan på prenumeranten.

  1. Anslut till utgivaren i SQL Server Management Studio. Expandera servernoden, högerklicka på mappen Replikering och välj sedan Starta replikeringsövervakaren.

  2. I Replikeringsövervakaren väljer du publikationen AdvWorksProductTrans och väljer fliken Alla prenumerationer . Högerklicka på prenumerationen och välj Visa information:

    Skärmbild av kommandot Visa information på snabbmenyn.

  3. Dialogrutan Historik för distributör till prenumerant öppnas och anger vilket fel agenten stöter på:

    Skärmbild av felinformation för distributionsagenten.

    Error messages:
    Agent 'NODE1\SQL2016-AdventureWorks2022-AdvWorksProductTrans-NODE2\SQL2016-7' is retrying after an error. 89 retries attempted. See agent job history in the Jobs folder for more details.
    
  4. Felet anger att distributionsagenten försöker igen. Mer information finns i jobbhistoriken för distributionsagenten:

    1. Expandera SQL Server Agent i Objectutforskaren >Jobbaktivitetsövervakaren.

    2. Sortera jobben efter kategori.

    3. Identifiera distributionsagenten efter kategorin REPL-Distribution. Högerklicka på agenten och välj Visa historik.

    Skärmbild av val för att visa distributionsagenthistoriken.

  5. Välj en av felposterna och visa feltexten längst ned i fönstret:

    Skärmbild av Feltext som anger ett felaktigt lösenord för distributionsagenten.

    Message:
    Unable to start execution of step 2 (reason: Error authenticating proxy NODE1\repl_distribution, system error: The user name or password is incorrect.)
    
  6. Det här felet anger att lösenordet som distributionsagenten använde är felaktigt. Så här löser du det:

    1. Expandera Replication noden i Object Explorer.

    2. Högerklicka på prenumerationens >egenskaper.

    3. Välj ellipsen (...) bredvid Agentprocesskonto och ändra lösenordet.

    Skärmbild av val för att ändra lösenordet för distributionsagenten.

  7. Kontrollera Replikeringsövervakaren igen genom att högerklicka på Replikering i Object Explorer. Ett rött X under Alla prenumerationer anger att distributionsagenten fortfarande stöter på ett fel.

    Öppna prenumeranthistorik för distribution genom att högerklicka på prenumerationen i Replikeringsövervakaren>Se detaljer. Här är felet nu annorlunda:

    Skärmbild av Fel som anger att distributionsagenten inte kan ansluta.

    Connecting to Subscriber 'NODE2\SQL2016'
    Agent message code 20084. The process could not connect to Subscriber 'NODE2\SQL2016'.
    Number:  18456
    Message: Login failed for user 'NODE2\repl_distribution'.
    
  8. Det här felet anger att distributionsagenten inte kunde ansluta till prenumeranten eftersom inloggningen misslyckades för användaren NODE2\repl_distribution. Om du vill undersöka saken ytterligare ansluter du till prenumeranten och öppnar den aktuella SQL Server-felloggen under noden Hantering i Object Explorer:

    Skärmbild av Fel som anger att inloggningen misslyckades för prenumeranten.

    Om du ser det här felet saknas inloggningen för prenumeranten. Information om hur du löser det här felet finns i Säkerhetskrav för replikering.

  9. När inloggningsfelet har lösts kontrollerar du Replikeringsövervakaren igen. Om alla problem har åtgärdats bör du se en grön pil bredvid Publikationsnamn och statusen Körs under Alla prenumerationer.

    Högerklicka på prenumerationen för att öppna historiken för distributör till prenumerant igen för att verifiera att den har slutförts. Om det är första gången du kör distributionsagenten ser du att ögonblicksbilden har masskopierats till prenumeranten:

    Skärmbild av distributionsagenten med statusen

Hitta fel med Merge-Agent

Det kan ta lång tid att replikera ändringar i sammanslagningsagenten. Använd spårningsflagga 101 tillsammans med loggning av sammanslagningsagenten för att avgöra vilket steg i synkroniseringsprocessen för sammanslagningsreplikering som tar mest tid. För att göra detta använder du följande parametrar för sammanslagningsagenten och sedan starta om agenten:

-T 101
-output
-outputverboselevel

Anmärkning

Om du måste skriva statistik till <distribution-server>..msmerge_history tabellen använder du spårningsflagga 102.

Ett exempel på utdata från sammanslagningsagenten när synkroniseringen av sammanslagningsreplikering har slutförts är följande:

**************************************************************
CONNECTION TIMES --> time took to establish the connection to the servers. Publisher (all connections) 156 msec   Subscriber (all connections) 32 msec Distributor 93 msec
**************************************************************
UPLOAD COUNTERS  --> upload phase (changes from the Sub to the Pub) stats MakeGeneration Time = 343 msec. InsertGenHistory Time = 31 msec. UpdateGenHistory Time = 0 msec. ProxiedMetadata Time = 0 msec.
**************************************************************
DOWNLOAD COUNTERS  --> download phase (changes from the Pub to the Sub) stats MakeGeneration Time = 219 msec. InsertGenHistory Time = 0 msec. UpdateGenHistory Time = 0 msec.
**************************************************************
RETENTION-BASED CLEANUP STATISTICS --> sp_mergemetadataretentioncleanup proc stats Publisher: Cleanup Time 281 msec MSmerge_genhistory rows cleaned up 0 MSmerge_contents rows cleaned up 0 MSmerge_tombstone rows cleaned up 0 Subscriber: Cleanup Time 187 msec MSmerge_genhistory rows cleaned up 0 MSmerge_contents rows cleaned up 0 MSmerge_rowtrack rows cleaned up 0 MSmerge_tombstone rows cleaned up 0
**************************************************************
RETRY STATISTICS Retry Time (Upload) 0 msec. Retry Time (Download) 0 msec. Total changes retried 0 Number of Iterations through rows needing retry 0 Total number of changes that failed despite retry 0
**************************************************************
PROXY METADATA QUEUE COUNTERS Queue Full: Number of Waits: 0, Total Wait Time: 0 msec
**************************************************************
Distributor-side History Logging Time = 219 msec. Number of Distributor-side History Messages Logged = 11 Subscriber-side History Logging Time = 295 msec. Number of Subscriber-side History Messages Logged = 11
**************************************************************
2013-05-28 17:24:11.820 OLE DB Subscriber '<SQL Server name>\sql2008r2': DBCC SQLPERF (NETSTATS)  2013-05-28 17:24:11.822 OLE DB Publisher '<SQL Server name>\SQL2008R2':  DBCC SQLPERF (NETSTATS)  2013-05-28 17:24:11.824 OLE DB Distributor '<SQL Server name>\SQL2008R2':  DBCC SQLPERF (NETSTATS)  NETWORK STATISTICS Server  Reads  Writes  Bytes Read Bytes Written Publisher 74  74  19112  37526 Subscriber 73  73  19032  36931 Distributor 75  75  19192  38121
**************************************************************
NETWORK STATUS Network Connection: The computer has one or more LAN cards that are active. Network link speed: Destination Incoming  Outgoing Publisher Unreachable  Unreachable Subscriber Unreachable  Unreachable Distributor Unreachable  Unreachable
**************************************************************

Aktivera utförlig loggning på alla agenter

Du kan använda utförlig loggning för att se mer detaljerad information om fel som inträffar med alla agenter i replikeringstopologin. Stegen är desamma för varje agent. Kontrollera bara att du väljer rätt agent i Jobbaktivitetsövervakaren.

Anmärkning

Agenterna kan finnas hos prenumeranten eller utgivaren, beroende på om det är en pull- eller push-prenumeration. Om agenten inte är tillgänglig på den server som du undersöker kontrollerar du den andra servern.

  1. Bestäm var du vill att den utförliga loggningen ska sparas och se till att mappen finns. I det här exemplet används c:\temp.

  2. Expandera SQL Server Agent-noden i Object Explorer och öppna Jobbaktivitetsövervakaren.

    Skärmbild av kommandot Visa jobbaktivitet på snabbmenyn för Jobbaktivitetsövervakaren.

  3. Sortera efter kategori och identifiera agenten av intresse. I det här exemplet används Log Reader Agent. Högerklicka på den agent som är av intresse >Egenskaper.

    Skärmbild av Val för att öppna agentegenskaper.

  4. Välj sidan Steg och markera sedan steget Kör agent . Välj Redigera.

    Skärmbild av val för redigering av steget Kör agent.

  5. I rutan Kommando startar du en ny rad, anger följande text och väljer OK:

    -Output C:\Temp\OUTPUTFILE.txt -Outputverboselevel 3
    

    Du kan ändra plats- och verbositetsnivån enligt dina önskemål.

    Skärmbild av detaljerade utdata i egenskaperna för jobbsteg.

    När du lägger till den utförliga utdataparametern kan följande problem orsaka att agenten misslyckas eller att utfilfilen saknas:

    • Det finns ett formateringsproblem där bindestrecket blev ett bindestreck.

    • Platsen finns inte på disken, eller så saknar kontot som kör agenten behörighet att skriva till den angivna platsen.

    • Det saknas ett utrymme mellan den sista parametern och parametern -Output .

    • Olika agenter stöder olika nivåer av verbositet. Om du aktiverar utförlig loggning men agenten inte startar kan du försöka minska den angivna utförlighetsnivån med 1.

  6. Starta om loggläsaragenten genom att högerklicka på agenten >Stoppa jobb vid steg. Uppdatera genom att välja ikonen Uppdatera i verktygsfältet. Högerklicka på agenten >Starta jobb vid steg.

  7. Granska utdata på disken.

    Skärmbild av utdatatestfil.

  8. Om du vill inaktivera utförlig loggning följer du samma föregående steg för att ta bort hela -Output raden som du lade till tidigare.

Få hjälp

Bidra till SQL-dokumentation

Visste du att du kan redigera SQL-innehåll själv? Om du gör det hjälper du inte bara till att förbättra vår dokumentation, utan du får även kredit som deltagare på sidan.

Mer information finns i Redigera Microsoft Learn-dokumentation.