Teilen über


Problembehandlung: Suchen von Fehlern bei SQL Server-Transaktionsreplikationen

Gilt für:SQL ServerAzure SQL Managed Instance

Die Problembehandlung von Replikationsfehlern kann ohne grundlegende Kenntnisse der Transaktionsreplikation frustrierend sein. Der erste Schritt beim Erstellen einer Veröffentlichung besteht darin, den Momentaufnahmen-Agent eine Momentaufnahme erstellen zu lassen und diese im Ordner für Momentaufnahmen zu speichern. Anschließend wendet der Verteilungs-Agent die Momentaufnahme auf den Abonnenten an.

Bei diesem Vorgang wird die Veröffentlichung erstellt und in den Zustand Wird synchronisiert versetzt. Die Synchronisierung erfolgt in drei Phasen:

  1. Transaktionen treten bei Objekten auf, die repliziert werden. Diese werden im Transaktionsprotokoll als „Für Replikation“ gekennzeichnet.

  2. Der Protokolllese-Agent durchsucht das Transaktionsprotokoll nach Transaktionen, die „zur Replikation“ gekennzeichnet sind. Anschließend werden diese Transaktionen in der Verteilungsdatenbank gespeichert.

  3. Der Verteilungs-Agent durchsucht die Verteilungsdatenbank mithilfe des Leserthreads. Anschließend stellt dieser Agent mithilfe des Schreibthreads eine Verbindung zum Abonnenten her, um die Änderung auf diesen anzuwenden.

In jedem Schritt dieses Vorgangs können Fehler auftreten. Diese zu finden kann der schwierigste Aspekt bei der Behandlung von Synchronisierungsproblemen sein. Dieser Vorgang wird durch die Verwendung des Replikationsmonitors jedoch vereinfacht.

Hinweis

In diesem Leitfaden zur Problembehandlung soll die Methodik der Problembehandlung vermittelt werden. Er wurde nicht dafür entworfen, ein bestimmtes Problem zu beheben, sondern stellt einen allgemeinen Leitfaden zum Suchen von Replikationsfehlern dar. Es sind einige spezifische Beispiele enthalten, deren Lösung jedoch abhängig von der Umgebung variieren kann. Die Beispielfehler basieren auf dem Tutorial: Konfigurieren der Replikation zwischen zwei vollständig verbundenen Servern (transaktional)-Tutorial.

Problembehandlungsmethoden

Wichtige Fragen

  1. Wo im Synchronisierungsprozess schlägt die Replikation fehl?
  2. Bei welchem Agent ist ein Fehler aufgetreten?
  3. Wann wurde eine Replikation zuletzt erfolgreich ausgeführt? Hat sich seitdem etwas verändert?

Erforderliche Schritte

  1. Verwenden Sie den Replikationsmonitor, um zu ermitteln, an welchem Punkt die Replikation auf den Fehler (welcher Agent?) stößt:

    • Wenn Fehler im Abschnitt Verleger zu Verteiler auftreten, tritt der Fehler im Protokolllese-Agent auf:
    • Wenn Fehler im Abschnitt Verteiler zu Abonnent auftreten, tritt der Fehler im Verteilungs-Agent auf:
  2. Durchsuchen Sie den Auftragsverlauf dieses Agents im Auftragsaktivitätsmonitor, um die Details des Fehlers zu ermitteln. Wenn die Historie des Jobs nicht genügend Details anzeigt, können Sie die ausführliche Protokollierung für diesen speziellen Agent aktivieren.

  3. Versuchen Sie, eine Lösung für den Fehler zu ermitteln.

Suchen von Fehlern des Momentaufnahmen-Agents

Der Momentaufnahmen-Agent generiert die Momentaufnahme und schreibt diese in den angegebenen Ordner für Momentaufnahmen.

  1. Zeigen Sie den Status des Momentaufnahmen-Agents an:

    1. Erweitern Sie im Objekt-Explorer den Knoten Lokale Veröffentlichung unter Replikation.

    2. Klicken Sie mit der rechten Maustaste auf Ihre Veröffentlichung AdvWorksProductTransView, und wählen Sie > aus.

    Screenshot des Befehls „Status des Momentaufnahmen-Agents anzeigen“ im Kontextmenü.

  2. Wenn im Status des Momentaufnahmen-Agents ein Fehler gemeldet wird, finden Sie im Auftragsverlauf des Momentaufnahmen-Agents weitere Einzelheiten:

    1. Erweitern Sie SQL Server-Agent im Objekt-Explorer, und öffnen Sie den Auftragsaktivitätsmonitor.

    2. Legen Sie eine Sortierung nach Kategorie fest, und identifizieren Sie den Momentaufnahmen-Agent nach der Kategorie REPL-Snapshot.

    3. Klicken Sie mit der rechten Maustaste auf den Momentaufnahmen-Agent, und wählen Sie Verlauf anzeigen aus.

    Screenshot der Optionen zum Öffnen des Verlaufs des Momentaufnahmen-Agents.

  3. Wählen Sie im Verlauf des Momentaufnahmen-Agents den relevanten Protokolleintrag aus. Dieser befindet sich üblicherweise ein oder zwei Zeilen vor dem Eintrag, der den Fehler meldet. (Ein rotes X weist auf einen Fehler hin.) Überprüfen Sie die Meldung in dem Feld unter den Protokollen:

    Screenshot des Snapshot-Agent-Fehlers bei verweigertem Zugriff.

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

Wenn Ihre Windows-Berechtigungen für Ihren Momentaufnahmeordner nicht ordnungsgemäß konfiguriert sind, wird für den Snapshot-Agent ein Fehler "Zugriff verweigert" angezeigt. Sie müssen die Berechtigungen für den Ordner, in dem Ihr Snapshot gespeichert ist, überprüfen und sicherstellen, dass das Konto, mit dem Sie den Snapshot Agent ausführen, über die Berechtigungen für den Zugriff auf die Freigabe verfügt.

Suchen von Fehlern des Protokolllese-Agents

Der Protokolllese-Agent stellt eine Verbindung mit der Verlegerdatenbank her und überprüft das Transaktionsprotokoll auf Transaktionen, die „zur Replikation“ gekennzeichnet sind. Anschließend werden diese Transaktionen der Verteilungsdatenbank hinzugefügt.

  1. Stellen Sie in SQL Server Management Studio eine Verbindung mit dem Verleger her. Erweitern Sie den Serverknoten, klicken Sie mit der rechten Maustaste auf den Ordner Replikation, und klicken Sie anschließend auf Replikationsmonitor starten:

    Screenshot des Befehls ‚Replikationsmonitor starten‘ im Shortcut-Menü.

    Der Replikationsmonitor wird geöffnet:

    Screenshot des Replikationsmonitors.

  2. Das rote X gibt an, dass die Publikation nicht synchronisiert wird. Erweitern Sie auf der linken Seite Meine Verleger und anschließend die relevanten Verlegerserver.

  3. Wählen Sie auf der linken Seite die Veröffentlichung AdvWorksProductTrans aus, und suchen Sie anschließend auf einer der Registerkarten nach dem roten X, um festzustellen, wo das Problem besteht. In diesem Fall befindet sich das rote X auf der Registerkarte Agents. Dies bedeutet, dass bei einem der Agents ein Fehler aufgetreten ist:

    Screenshot von Red X auf der Registerkarte

  4. Wählen Sie die Registerkarte Agents aus, um zu ermitteln, bei welchem Agent der Fehler aufgetreten ist:

    Screenshot des roten X für den fehlerhaften Protokollleser-Agent im Replikationsmonitor.

  5. In dieser Ansicht werden Ihnen zwei Agents angezeigt: der Momentaufnahmen-Agent und der Protokolllese-Agent. Der Agent, bei dem ein Fehler aufgetreten ist, ist mit einem roten X gekennzeichnet. In diesem Fall ist der Protokolllese-Agent betroffen.

    Doppelklicken Sie auf die Zeile, in der der Fehler gemeldet wird, um den Verlauf des Protokolllese-Agent zu öffnen. Dieser Verlauf enthält weitere Informationen zu dem Fehler:

    Screenshot der Fehlerdetails für den Protokollleser-Agent.

    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. Der Fehler tritt in der Regel auf, wenn der Besitzer der Herausgeberdatenbank nicht ordnungsgemäß festgelegt ist. Dies kann beim Wiederherstellen einer Datenbank geschehen. So überprüfen Sie, ob dies der Fall ist:

    1. Erweitern Sie Datenbanken im Objekt-Explorer.

    2. Klicken Sie mit der rechten Maustaste auf AdventureWorks2025-Eigenschaften>.

    3. Überprüfen Sie, ob auf der Seite Dateien ein Besitzer vorhanden ist. Wenn dieses Feld leer ist, ist dies der wahrscheinliche Grund für Ihr Problem.

    Screenshot der Seite

  7. Wenn das Feld „Besitzer“ auf der Seite Dateien leer ist, öffnen Sie im Bereich der Datenbank das Fenster AdventureWorks2025. Führen Sie folgenden T-SQL-Code aus:

    -- 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. Möglicherweise müssen Sie den Protokolllese-Agent neu starten:

    1. Erweitern Sie den Knoten SQL Server-Agent im Objekt-Explorer, und öffnen Sie den Auftragsaktivitätsmonitor.

    2. Legen Sie eine Sortierung nach Kategorie fest, und identifizieren Sie den Protokolllese-Agent nach der Kategorie REPL-LogReader.

    3. Klicken Sie mit der rechten Maustaste auf den Auftrag des Protokolllese-Agents, und wählen Sie Auftrag starten bei Schritt... aus.

    Screenshot der Optionen zum Neustart des Log Reader-Agents.

  9. Überprüfen Sie, ob Ihre Veröffentlichung jetzt synchronisiert wird, indem Sie den Replikationsmonitor erneut öffnen. Wenn dieser nicht bereits geöffnet ist, können Sie ihn finden, indem Sie im Objekt-Explorer mit der rechten Maustaste auf Replikation klicken.

  10. Wählen Sie die Veröffentlichung AdvWorksProductTrans aus, und klicken Sie auf die Registerkarte Agents. Doppelklicken Sie auf den Protokolllese-Agent, um den Agent-Verlauf zu öffnen. Nun sollte Ihnen angezeigt werden, dass der Protokolllese-Agent ausgeführt wird und entweder Befehle repliziert oder über „Keine replizierten Transaktionen“ verfügt:

    Screenshot des Protokolllese-Agents, der ohne replizierte Transaktionen ausgeführt wird.

Suchen von Fehlern des Verteilungs-Agent

Der Verteilungs-Agent sucht Daten in der Verteilungsdatenbank und wendet diese anschließend auf den Abonnenten an.

  1. Stellen Sie in SQL Server Management Studio eine Verbindung mit dem Verleger her. Erweitern Sie den Serverknoten, klicken Sie mit der rechten Maustaste auf den Ordner Replikation, und klicken Sie anschließend auf Replikationsmonitor starten.

  2. Wählen Sie Wählen Sie im Replikations-Monitor die Veröffentlichung AdvWorksProductTrans und anschließend die Registerkarte Alle Abonnements aus. Klicken Sie mit der rechten Maustaste auf das Abonnement, und wählen Sie Details anzeigen aus:

    Screenshot des Befehls ‚Details anzeigen‘ im Shortcut-Menü.

  3. Das Dialogfeld Distributor to Subscriber History (Verlauf von Verteiler zu Abonnent) wird geöffnet und zeigt an, welches Problem bei dem Agent aufgetreten ist:

    Screenshot der Fehlerdetails für den Verteilungs-Agent.

    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. Die Fehlermeldung gibt an, dass der Verteilungs-Agent den Vorgang wiederholt. Überprüfen Sie den Auftragsverlauf des Verteilungs-Agents, um weitere Informationen zu erhalten:

    1. Erweitern Sie SQL Server-Agent im Objekt-Explorer, und öffnen Sie den >.

    2. Sortieren Sie die Aufträge nach Kategorie.

    3. Identifizieren Sie den Verteilungs-Agent nach der Kategorie REPL-Verteilung. Klicken Sie mit der rechten Maustaste auf den Agent und anschließend auf Verlauf anzeigen.

    Screenshot der Optionen zum Anzeigen des Verlaufs des Verteilungs-Agents.

  5. Wählen Sie einen der Fehlereinträge aus, und zeigen Sie die Fehlermeldung im unteren Bereich des Fensters an:

    Screenshot des Fehlertexts, der ein falsches Kennwort für den Verteiler-Agent angibt.

    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. Dieser Fehler gibt an, dass das vom Verteilungs-Agent verwendete Kennwort falsch ist. So beheben Sie dieses Problem:

    1. Erweitern Sie im Objekt-Explorer den Knoten Replikation.

    2. Klicken Sie mit der rechten Maustaste auf das Abonnement, und wählen Sie > aus.

    3. Klicken Sie auf die Auslassungspunkte (...) neben dem Agent-Prozesskonto, und ändern Sie das Kennwort.

    Screenshot der Auswahl zum Ändern des Kennworts für den Verteilungs-Agent.

  7. Überprüfen Sie den Replikationsmonitor erneut, indem Sie mit der rechten Maustaste auf Replikation im Objekt-Explorer klicken. Ein rotes X unter Alle Abonnements gibt an, dass bei dem Verteilungs-Agent weiterhin ein Fehler auftritt.

    Öffnen Sie den Distributor to Subscriber History (Verlauf von Verteiler zu Abonnent), indem Sie mit der rechten Maustaste auf das Abonnement unter Replikationsmonitor>Details anzeigen klicken. Hier lautet der Fehler nun anders:

    Screenshot des Fehlers, der angibt, dass der Verteilungs-Agent keine Verbindung herstellen kann.

    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. Dieser Fehler weist darauf hin, dass der Verteilungs-Agent keine Verbindung mit dem Abonnenten herstellen konnte, da die Anmeldung für benutzer NODE2\repl_distribution fehlgeschlagen ist. Sie können dies näher untersuchen, indem Sie eine Verbindung mit dem Abonnenten herstellen und das aktuelle SQL-Fehlerprotokoll unter dem Knoten Verwaltung im Objekt-Explorer öffnen:

    Screenshot des Fehlers, der angibt, dass die Anmeldung für den Abonnenten fehlgeschlagen ist.

    Wenn dieser Fehler angezeigt wird, fehlt die Anmeldung des Abonnenten. Informationen zum Beheben dieses Fehlers finden Sie unter Sicherheitsrollenanforderungen für die Replikation.

  9. Überprüfen Sie den Replikationsmonitor erneut, sobald der Anmeldefehler behoben wurde. Wenn alle Probleme behoben wurden, sollten Ihnen neben dem Veröffentlichungsnamen ein grüner Pfeil und unter Alle Abonnements der Status Wird ausgeführt angezeigt werden.

    Klicken Sie mit der rechten Maustaste auf Abonnement, um Distributor to Subscriber History (Verlauf von Verteiler zu Abonnent) zu öffnen und zu überprüfen, ob die Ausführung erfolgreich war. Wenn Sie den Distribution Agent zum ersten Mal ausführen, sehen Sie, dass der Snapshot bulk an den Abonnenten kopiert wurde:

    Screenshot des Distribution Agent mit dem Status ‚Ausgeführt‘ und einer Nachricht über die Bulk-Kopie.

Finden Sie Fehler mit dem Merge Agent

Der Zusammenführungs-Agent kann eine lange Zeit in Anspruch nehmen, um Änderungen zu replizieren. Verwenden Sie das Ablaufverfolgungs-Flag 101 zusammen mit der Protokollierung des Zusammenführungsagents, um zu bestimmen, welcher Schritt des Zusammenführungsreplikations-Synchronisierungsprozesses die meiste Zeit in Anspruch nimmt. Verwenden Sie dazu die folgenden Parameter als Merge-Agentparameter, und starten Sie den Agent neu:

-T 101
-output
-outputverboselevel

Hinweis

Wenn Sie Statistiken in die <distribution-server>..msmerge_history Tabelle schreiben müssen, verwenden Sie Trace-Flag 102.

Ein Beispiel für die Ausgabe des Merge Agents nach Abschluss der Synchronisierung der Replikation ist wie folgt:

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

Aktivieren der ausführlichen Protokollierung auf einem Agent

Sie können die ausführliche Protokollierung verwenden, um detailliertere Informationen zu Fehlern zu erhalten, die bei einem beliebigen Agent in der Replikationstopologie auftreten. Die Schritte sind für jeden Agent identisch. Achten Sie jedoch darauf, dass Sie den richtigen Agent im Auftragsaktivitätsmonitor auswählen.

Hinweis

Die Agents können sich je nachdem, ob es sich um ein Pull- oder um ein Pushabonnement handelt, auf dem Verleger oder auf dem Abonnenten befinden. Wenn der Agent auf dem untersuchten Server nicht verfügbar ist, überprüfen Sie den anderen Server.

  1. Entscheiden Sie, wo die ausführliche Protokollierung gespeichert werden soll, und stellen Sie sicher, dass dieser Ordner vorhanden ist. In diesem Beispiel wird C:\Temp verwendet.

  2. Erweitern Sie den Knoten SQL Server-Agent im Objekt-Explorer, und öffnen Sie den Auftragsaktivitätsmonitor.

    Screenshot des Befehls ‚Job-Aktivität anzeigen‘ aus dem Shortcut-Menü des Job Activity Monitor.

  3. Sortieren Sie nach Kategorie, und ermitteln Sie den entsprechenden Agent. In diesem Beispiel wird der Protokolllese-Agent verwendet. Klicken Sie mit der rechten Maustaste auf den entsprechenden Agent, und wählen Sie > aus.

    Screenshot der Optionen zum Öffnen von Agent-Eigenschaften.

  4. Wählen Sie die Seite Schritte aus, und markieren Sie den Schritt Agent ausführen. Wählen Sie Bearbeiten aus.

    Screenshot der Auswahlmöglichkeiten für die Bearbeitung des Schritts ‚Agent ausführen‘.

  5. Beginnen Sie im Feld Befehl eine neue Zeile, geben Sie folgenden Text ein, und klicken Sie auf OK:

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

    Sie können den Speicherort und den Ausführlichkeitsgrad beliebig ändern.

    Screenshot der ausführlichen Ausgabe in den Eigenschaften des Auftragsschritts.

    Wenn Sie den Parameter für die ausführliche Ausgabe hinzufügen, können die folgenden Probleme dazu führen, dass Ihr Agent fehlschlägt oder dass die Outfile-Datei fehlt:

    • Es besteht ein Formatierungsproblem, bei dem ein Halbgeviertstrich zu einem Bindestrich wurde.

    • Der Speicherort ist nicht auf dem Datenträger vorhanden, oder das Konto, das den Agent ausführt, verfügt nicht über die Berechtigungen, um am angegebenen Speicherort Schreibvorgänge durchzuführen.

    • Zwischen dem letzten Parameter und dem Parameter -Output fehlt ein Leerzeichen.

    • Verschiedene Agents unterstützen unterschiedliche Ausführlichkeitsgrade. Wenn Sie die ausführliche Protokollierung aktivieren und der Agent darauf hin nicht startet, verringern Sie den angegebenen Ausführlichkeitsgrad um 1.

  6. Starten Sie den Protokolllese-Agent neu, indem Sie mit der rechten Maustaste darauf klicken und > auswählen. Aktualisieren Sie die Ansicht, indem Sie auf der Symbolleiste auf das Aktualisierungssymbol klicken. Klicken Sie mit der rechten Maustaste auf den Agent, und wählen Sie > aus.

  7. Überprüfen Sie die Ausgabe auf dem Datenträger.

    Screenshot der Ausgabetextdatei.

  8. Führen Sie zum Deaktivieren der ausführlichen Protokollierung die vorherigen Schritte erneut durch, um die gesamte Zeile -Output zu entfernen, die Sie zuvor hinzugefügt haben.

Hilfe erhalten

Zur SQL-Dokumentation beitragen

Wussten Sie schon, dass Sie SQL-Inhalte selbst bearbeiten könnten? Hierdurch helfen Sie nicht nur mit, unsere Dokumentation zu verbessern, sondern Sie werden auch als Mitwirkender an der Seite aufgeführt.

Weitere Informationen finden Sie unter Bearbeiten der Microsoft Learn-Dokumentation.