Überspringen von Fehlern in der Transaktionsreplikation

Bei der Transaktionsreplikation können Fehler, die im Rahmen des Verteilungsvorgangs aufgetreten sind, auf zweierlei Art ausgelassen werden:

  • Mithilfe des -SkipErrors-Parameters des Verteilungs-Agents, der das Auslassen bestimmter Fehlertypen ermöglicht. Die Transaktion mit dem Fehler wird nicht ausgeführt, die nachfolgenden Transaktionen hingegen schon.

  • Mithilfe der gespeicherten Prozedur sp_setsubscriptionxactseqno, die das Auslassen einer oder mehrerer Transaktionen ermöglicht, die zu Fehlern führen. Diese Option steht für Nicht-SQL Server-Abonnenten nicht zur Verfügung.

Wichtiger HinweisWichtig

In einem normalen Replikationsprozess sollten keine Fehler auftreten, die ausgelassen werden müssen. Das Auslassen von Fehlern sollte mit Bedacht vorgenommen werden und setzt das Verständnis darüber voraus, um was es sich bei der Fehlerbedingung handelt und warum der Fehler bzw. die Transaktion ausgelassen und nicht behoben bzw. berichtigt werden sollte. Wenn auf dem Verleger ausgeführte Transaktionen auf dem Abonnenten ausgelassen werden, werden die beiden Knoten nicht vollständig synchronisiert, was zu weiteren Fehlern führen kann.

-SkipErrors-Parameter

Wenn der Verteilungs-Agent auf einen Fehler stößt, wird er standardmäßig beendet. Wenn Sie den -SkipErrors-Parameter verwenden und erwartete Fehler bzw. Fehler angeben, die die Replikation nicht beeinträchtigen sollen, protokolliert der Agent die Fehlerinformationen und wird anschließend weiter ausgeführt. Wenn Sie beispielsweise möchten, dass der Verteilungs-Agent Verletzungen doppelter Schlüssel protokolliert, jedoch mit der Verarbeitung nachfolgender Transaktionen fortfährt, geben Sie an, dass der Agent die Fehler 2601 (Eine Zeile mit doppeltem Schlüssel kann in das %1!-Objekt mit dem eindeutigen %3!-Index nicht eingefügt werden.) und 2627 (Verletzung der %1!-Einschränkung '%2!'. Ein doppelter Schlüssel kann in das %4!-Objekt nicht eingefügt werden.) auslassen soll:

-SkipErrors 2601;2627

Die gängigste Art, den -SkipErrors-Parameter zu verwenden, besteht darin, das Profil des Verteilungs-Agents namens Fortsetzen bei Datenkonsistenzfehlern zu verwenden. Vom Verteilungs-Agent werden daraufhin die Fehler 2601, 2627 und 20598 ausgelassen (Die Zeile wurde bei der Anwendung des replizierten Befehls auf dem Abonnenten nicht gefunden.). Weitere Informationen finden Sie unter Replikations-Agent-Profile. Zusätzlich zu diesem vordefinierten Profil kann der Parameter in einem von Ihnen erstellten oder modifizierten Agentprofile oder in der Befehlszeile angegeben werden. Weitere Informationen finden Sie hier:

Wichtiger HinweisWichtig

Standardmäßig ist bei der Ausführung von Triggern die XACT_ABORT-Einstellung auf ON festgelegt. Wenn durch eine Anweisung in einem Trigger ein Fehler verursacht wird, während der Verteilungs-Agent Änderungen auf dem Abonnenten anwendet, schlägt der gesamte Batch für die Änderungen fehl, nicht die jeweilige Anweisung. Bei der Transaktionsreplikation können mithilfe des -SkipErrors-Parameters des Verteilungs-Agents Anweisungen ausgelassen werden, die zu Fehlern führen. Wenn -SkipErrors bei aktivierter XACT_ABORT-Einstellung (ON) verwendet wird, wird der gesamte Batch für die Änderungen ausgelassen, wenn eine Anweisung zu einem Fehler führt. Wenn XACT_ABORT in Triggern nicht auf ON festgelegt sein muss, empfiehlt sich bei der Verwendung des -SkipErrors-Parameters die Einstellung OFF. Geben Sie zur Deaktivierung der Option SET XACT_ABORT OFF in der Triggerdefinition an. Weitere Informationen zu XACT_ABORT finden Sie unter SET XACT_ABORT (Transact-SQL).

Gespeicherte Prozedur sp_setsubscriptionxactseqno

Mithilfe der gespeicherten Prozedur sp_setsubscriptionxactseqno können eine oder mehrere Transaktionen ausgelassen werden, bei deren Anwendung auf dem Abonnenten Fehler auftreten. Gehen Sie wie folgt vor, wenn ein Fehler aufgetreten ist und Sie eine oder mehrere Transaktionen auslassen möchten:

  1. Führen Sie nach Beendigung des Verteilungs-Agents sp_helpsubscriptionerrors auf dem Verteiler aus. Von dieser gespeicherten Prozedur wird die xact_seqno-Spalte zurückgegeben, die die Protokollfolgenummer (LSN, Log Sequence Number) der einzelnen fehlgeschlagenen Transaktionen enthält.

  2. Führen Sie sp_setsubscriptionxactseqno aus, und geben Sie einen Wert für den @xact_seqno-Parameter an Wenn alle fehlgeschlagenen Transaktionen ausgelassen werden sollen, geben Sie die höchste von sp_helpsubscriptionerrors zurückgegebene LSN an.

Weitere Informationen finden Sie unter sp_setsubscriptionxactseqno (Transact-SQL) und sp_helpsubscriptionerrors (Transact-SQL).