Sdílet prostřednictvím


Poradce při potížích: Vyhledání chyb s transakční replikací SQL Serveru

platí pro:SQL Serverazure SQL Managed Instance

Řešení chyb replikace může být frustrující, aniž byste měli základní znalosti o tom, jak funguje transakční replikace. Prvním krokem při vytváření publikace je vytvoření snímku agentem snímku a jeho uložení do složky snímku. Distribuční agent aplikuje snímek na odběratele.

Tento proces vytvoří publikaci a umístí ji do stavu synchronizace . Synchronizace funguje ve třech fázích:

  1. Transakce probíhají u objektů replikovaných a jsou v transakčním protokolu označeny jako "pro replikaci".

  2. Agent čtenáře protokolů prochází transakční protokol a hledá transakce, které jsou označené jako "pro replikaci". Tyto transakce se pak uloží do distribuční databáze.

  3. Distribuční agent prohledá distribuční databázi pomocí vlákna čtenáře. Poté se tento agent pomocí vlákna zapisovače připojí k odběrateli, aby na něj aplikoval tyto změny.

K chybám může dojít v jakémkoli kroku tohoto procesu. Nalezení těchto chyb může být nejnáročnějším aspektem řešení potíží se synchronizací. Použití služby Replication Monitor naštěstí usnadňuje tento proces.

Poznámka:

Účelem tohoto průvodce odstraňováním potíží je naučit metodiku řešení potíží. Je navržená tak, aby nevyřešil vaši konkrétní chybu, ale poskytovala obecné pokyny k hledání chyb s replikací. K dispozici jsou některé konkrétní příklady, ale rozlišení se může lišit v závislosti na prostředí. Ukázkové chyby jsou založené na tutoriálu: Konfigurace replikace mezi dvěma plně propojenými servery (transakční).

Metodologie řešení potíží

Otázky k kladení

  1. Kde v procesu synchronizace dochází k selhání replikace?
  2. U kterého agenta dochází k chybě?
  3. Kdy se replikace naposledy úspěšně dokončila? Změnilo se od té doby něco?

Kroky, které je potřeba provést

  1. Pomocí monitorování replikace zjistěte, ve kterém okamžiku replikace dochází k chybě (který agent?):

    • Pokud v oddílu Publisher to Distributor dochází k chybám, jedná se o problém s agentem čtečky protokolů.
    • Pokud v části Distributor do odběratele dochází k chybám, jedná se o problém s distribučním agentem.
  2. Prohlédněte si historii úloh daného agenta ve službě Sledování aktivit úloh a zjistěte podrobnosti o chybě. Pokud historie úloh nezobrazuje dostatek podrobností, můžete pro konkrétního agenta povolit podrobné protokolování .

  3. Pokuste se určit řešení chyby.

Vyhledání chyb pomocí agenta snímků

Agent snímku vygeneruje snímek a zapíše ho do zadané složky snímků.

  1. Zobrazení stavu agenta snímků:

    1. V Průzkumníku objektů rozbalte uzel Místní publikace v části Replikace.

    2. Klikněte pravým tlačítkem na publikaci AdvWorksProductTrans>Zobrazit stav agenta snímku.

    Snímek obrazovky příkazu 'Zobrazit stav agenta snímku' v místní nabídce

  2. Pokud se ve stavu agenta snímků zobrazí chyba, najdete další podrobnosti v historii úloh agenta snímků:

    1. Rozbalte agenta SQL Serveru v Průzkumníku objektů a otevřete monitorování aktivit úloh.

    2. Seřaďte podle kategorie a identifikujte agenta snímků podle kategorie REPL-Snapshot.

    3. Klikněte pravým tlačítkem myši na agenta snímku a pak vyberte Zobrazit historii.

    Snímek obrazovky s výběrem pro otevření historie agenta snímků

  3. V historii agenta snímků vyberte příslušnou položku protokolu. Obvykle se jedná o řádek nebo dva před položkou, která hlásí chybu. (Červený symbol X označuje chyby.) Zkontrolujte text zprávy v poli pod protokoly:

    Snímek obrazovky s chybou agenta snímků pro odepřený přístup

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

Pokud vaše oprávnění Windows nejsou pro složku snímků správně nakonfigurovaná, zobrazí se u agenta snímků chyba "Přístup byl odepřen". Potřebujete ověřit oprávnění ke složce, ve které je váš snímek uložený, a ujistěte se, že účet použitý ke spuštění agenta snímků má oprávnění pro přístup ke sdílené složce.

Vyhledání chyb pomocí agenta Log Reader

Agent Log Reader se připojí k vaší databázi vydavatele a zkontroluje transakční protokol všech transakcí, které jsou označené jako "pro replikaci". Potom tyto transakce přidá do distribuční databáze.

  1. Připojte se k vydavateli v aplikaci SQL Server Management Studio. Rozbalte uzel serveru, klikněte pravým tlačítkem na složku Replikace a pak vyberte Spustit monitorování replikace:

    Snímek obrazovky s příkazem 'Spustit monitor replikace' v kontextové nabídce.

    Monitor replikace se otevře

    Snímek obrazovky monitoru replikace

  2. Červený symbol X označuje, že se publikace nesynchronizuje. Rozbalte položku Vydavatelé na levé straně a potom rozbalte příslušný server vydavatele.

  3. Vyberte publikaci AdvWorksProductTrans na levé straně a vyhledejte červenou X na jedné z karet, abyste zjistili, kde je problém. V tomto případě je červený symbol X na kartě Agenti , takže u jednoho z agentů dochází k chybě:

    Snímek obrazovky s červeným X na kartě Agenti v monitorování replikace

  4. Vyberte kartu Agenti a určete, u kterého agenta dochází k chybě:

    Snímek obrazovky s červeným X u failujícího agenta čtenáře protokolů v Replication Monitor

  5. Toto zobrazení ukazuje dva agenty, agenta pro snapshot a čtenáře protokolu. Ta, která má chybu, má červené X. V tomto případě jde o agenta pro čtení logů.

    Poklikejte na řádek, který hlásí chybu, a otevřete historii agenta pro agenta pro čtení protokolů. Tato historie obsahuje další informace o chybě:

    Snímek obrazovky s podrobnostmi o chybě pro Agenta pro čtení protokolů

    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. K chybě obvykle dochází v případě, že vlastník databáze vydavatele není správně nastavený. K tomu může dojít při obnovení databáze. Jak to ověříte:

    1. Rozbalte databáze v Průzkumníku objektů.

    2. Klikněte pravým tlačítkem myši na Vlastnosti AdventureWorks2025>.

    3. Ověřte, že na stránce Soubory existuje vlastník. Pokud je toto pole prázdné, jedná se o pravděpodobnou příčinu vašeho problému.

    Snímek obrazovky se stránkou Soubory ve vlastnostech databáze s prázdným polem Vlastník

  7. Pokud je vlastník na stránce Soubory prázdný, otevřete okno Nový dotaz v kontextu AdventureWorks2025 databáze. Spusťte následující kód T-SQL:

    -- 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. Možná budete muset restartovat agenta Log Reader:

    1. Rozbalte uzel agenta SQL Serveru v Průzkumníku objektů a otevřete Monitorování aktivit úloh.

    2. Seřaďte podle kategorie a identifikujte agenta čtenáře protokolů podle kategorie REPL-LogReader .

    3. Klikněte pravým tlačítkem na úlohu agenta Čtenář protokolu a vyberte Spustit úlohu v kroku.

    Snímek obrazovky s výběrem pro restartování agenta pro čtení protokolů

  9. Opětovným otevřením nástroje Replication Monitor ověřte, že se vaše publikace synchronizuje. Pokud ještě není otevřený, můžete ho najít tak, že v Průzkumníku objektů kliknete pravým tlačítkem na Replikaci .

  10. Vyberte publikaci AdvWorksProductTrans , vyberte kartu Agenti a poklikáním otevřete historii agenta čtenáře protokolu. Teď byste měli vidět, že je spuštěný agent Log Reader a replikuje příkazy nebo nemá replikované transakce:

    Snímek obrazovky se spuštěným agentem Log Reader bez replikovaných transakcí

Vyhledání chyb s distribučním agentem

Distribuční agent najde data v distribuční databázi a pak je použije pro odběratele.

  1. Připojte se k vydavateli v aplikaci SQL Server Management Studio. Rozbalte uzel serveru, klikněte pravým tlačítkem na složku Replikace a pak vyberte Spustit monitorování replikace.

  2. V Nástroji Sledování replikace vyberte publikaci AdvWorksProductTrans a vyberte kartu Všechna předplatná . Klikněte pravým tlačítkem na předplatné a vyberte Zobrazit podrobnosti:

    Snímek obrazovky s příkazem Zobrazit Podrobnosti v místní nabídce

  3. Otevře se dialogové okno Historie distributora k odběrateli a objasňuje, jakou chybu agent zaznamenává.

    Snímek obrazovky s podrobnostmi o chybě pro distribučního agenta

    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. Tato chyba značí, že distribuční agent zkouší to znovu. Další informace najdete v historii úloh distribučního agenta:

    1. Rozbalte SQL Server Agent v >Monitor aktivity úloh.

    2. Seřaďte úlohy podle kategorie.

    3. Identifikujte distribučního agenta podle kategorie REPL-Distribution. Klikněte pravým tlačítkem na agenta a vyberte Zobrazit historii.

    Snímek obrazovky s výběrem pro zobrazení historie distribučního agenta

  5. Vyberte jednu z chybových položek a zobrazte text chyby v dolní části okna:

    Snímek obrazovky s textem chyby, který označuje nesprávné heslo pro distribučního agenta

    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. Tato chyba značí, že heslo použitého distribučního agenta je nesprávné. Řešení:

    1. Rozbalte uzel Replikace v Průzkumníku objektů.

    2. Klikněte pravým tlačítkem na > předplatného.

    3. Vyberte trojtečku (...) vedle účtu procesu agenta a upravte heslo.

    Snímek obrazovky s výběrem pro úpravu hesla pro distribučního agenta

  7. Znovu zkontrolujte monitorování replikace kliknutím pravým tlačítkem na Replikaci v Průzkumníku objektů. Červený symbol X pod všechna předplatná naznačuje, že distribuční agent stále naráží na chybu.

    Otevřete historii distribuce pro předplatitele tak, že kliknete pravým tlačítkem na předplatné v Replication Monitor> a zobrazíte podrobnosti. Chyba je nyní odlišná.

    Snímek obrazovky s chybou, která značí, že se distribuční agent nemůže připojit

    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. Tato chyba značí, že se distribuční agent nemohl připojit k odběrateli, protože přihlášení uživatele NODE2 selhalo\repl_distribution. Pokud chcete provést další šetření, připojte se k odběrateli a otevřete aktuální protokol chyb SQL Serveru v uzlu Správa v Průzkumníku objektů:

    Snímek obrazovky s chybou, která značí, že přihlášení pro odběratele selhalo

    Pokud se zobrazí tato chyba, přihlášení u předplatitele chybí. Pokud chcete tuto chybu vyřešit, přečtěte si téma Požadavky na roli zabezpečení pro replikaci.

  9. Po vyřešení chyby přihlášení znovu zkontrolujte monitorování replikace. Pokud byly vyřešeny všechny problémy, měla by se vedle názvu publikace zobrazit zelená šipka a stav Spuštěno ve všech předplatných.

    Kliknutím pravým tlačítkem myši na předplatné znovu otevřete historii distributor na odběratele, aby byla ověřena úspěšnost. Pokud agenta distribuce spouštíte poprvé, uvidíte, že snímek byl hromadně zkopírován odběratelem.

    Snímek obrazovky distribučního agenta se stavem Spuštěno a zprávou o hromadném kopírování

Vyhledání chyb pomocí agenta sloučení

Agent slučování může pro replikaci změn potřebovat hodně času. Pokud chcete zjistit, který krok procesu synchronizace při replikaci pomocí slučování trvá nejvíce času, použijte příznak trasování 101 společně s protokolováním agenta slučování. Za tímto účelem použijte následující parametry jako parametry agenta pro sloučení a následně agenta restartujte:

-T 101
-output
-outputverboselevel

Poznámka:

Pokud potřebujete do tabulky <distribution-server>..msmerge_history zapisovat statistiky, použijte příznak trasování 102.

Ukázkový výstup agenta sloučení po dokončení synchronizace replikace sloučení je následující:

**************************************************************
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
**************************************************************

Povolení podrobného protokolování u libovolného agenta

Podrobné protokolování můžete použít k zobrazení podrobnějších informací o chybách, ke kterým dochází u jakéhokoli agenta v topologii replikace. Postup je stejný pro každého agenta. Ujistěte se, že ve Sledování aktivity úloh vybíráte správného agenta.

Poznámka:

Agenti mohou být buď na straně vydavatele nebo odběratele, v závislosti na tom, zda se jedná o odebírání nebo zasílání předplatného. Pokud agent není na serveru, který prošetřujete, dostupný, zkontrolujte druhý server.

  1. Rozhodněte, kam chcete podrobné protokolování uložit, a ujistěte se, že složka existuje. V tomto příkladu se používá c:\temp.

  2. Rozbalte uzel agenta SQL Serveru v Průzkumníku objektů a otevřete Monitorování aktivit úloh.

    Snímek obrazovky s příkazem

  3. Seřaďte podle kategorie a identifikujte agenta, který zajímá. V tomto příkladu se používá agent Log Reader. Klikněte pravým tlačítkem myši na agenta, který vás zajímá >Vlastnosti.

    Snímek obrazovky s možnostmi Výběru pro otevření vlastností agenta

  4. Vyberte stránku Kroky a zvýrazněte krok Spustit agenta . Vyberte Upravit.

    Snímek obrazovky s výběrem pro úpravu kroku Spustit agenta

  5. Do pole Příkaz spusťte nový řádek, zadejte následující text a vyberte OK:

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

    Úroveň umístění a podrobností můžete upravit podle svých preferencí.

    Snímek obrazovky s podrobným výstupem ve vlastnostech kroku úlohy

    Při přidávání parametru podrobného výstupu můžou následující chyby způsobit selhání agenta nebo že soubor outfile chybí:

    • Došlo k problému s formátováním, kdy se pomlčka stala spojovníkem.

    • Umístění na disku neexistuje nebo účet, na kterém běží agent, nemá oprávnění k zápisu do zadaného umístění.

    • Mezi posledním parametrem a parametrem chybí mezera -Output .

    • Různí agenti podporují různé úrovně rozhovoru. Pokud povolíte podrobné protokolování, ale agent se nespustí, zkuste snížit zadanou úroveň podrobností o 1.

  6. Restartujte agenta Log Reader tak, že v kroku kliknete pravým tlačítkem na agenta >Zastavit úlohu. Aktualizujte výběrem ikony Aktualizovat z panelu nástrojů. Klikněte pravým tlačítkem na agenta >Spustit úlohu ve fázi.

  7. Zkontrolujte výstup na disku.

    Snímek obrazovky s výstupním textovým souborem

  8. Pokud chcete zakázat podrobné protokolování, postupujte podle předchozích kroků a odstraňte celou řádku -Output, kterou jste přidali dříve.

Získejte pomoc

Přispějte k dokumentaci SQL

Věděli jste, že obsah SQL můžete upravovat sami? Pokud to uděláte, nejen že vám pomůžete vylepšit naši dokumentaci, ale také jste získali kredit jako přispěvatel na stránku.

Další informace naleznete v Upravit dokumentaci Microsoft Learn.