Fehler 1205 beim Konfigurieren der Transaktionsreplikation
In diesem Artikel erfahren Sie, wie Sie ein Problem beheben, das beim Konfigurieren der Transaktionsreplikation in SQL Server auftritt.
Ursprüngliche Produktversion: SQL Server
Ursprüngliche KB-Nummer: 2674882
Problembeschreibung
Stellen Sie sich folgendes Szenario vor:
- Sie konfigurieren die Transaktionsreplikation in SQL Server.
- Die Transaktionsreplikationstopologie besteht aus mehreren Herausgebern.
- Die Herausgeber replizieren Daten in dieselbe Abonnentendatenbank.
- Die Verteilungs-Agents werden kontinuierlich oder nach einem häufigen Zeitplan ausgeführt. Beispielsweise werden die Verteilungs-Agents minütlich ausgeführt.
In diesem Szenario sind die Verteilungs-Agents möglicherweise an einem Deadlockszenario beteiligt und können als Deadlockopfer ausgewählt werden. Wenn dieses Problem auftritt, erhalten Sie möglicherweise eine Fehlermeldung, die der folgenden ähnelt:
Fehler 1205
Die Transaktion (Prozess-ID %d) wurde für %.*ls-Ressourcen mit einem anderen Prozess deadlocked und als Deadlockopfer ausgewählt. Führen Sie die Transaktion erneut aus.
Wenn Sie das Ablaufverfolgungsflag 1222 aktivieren, um die Deadlockinformationen in das SQL Server Fehlerprotokoll umzuleiten, erhalten Sie eine Fehlermeldung, die einer der folgenden ähnelt:
-
Update MSreplication_subscriptions festlegen transaction_timestamp = cast(@P1 as binary(15)) + cast(case datalength(transaction_timestamp), wenn 16 dann isnull(substring(transaction_timestamp, 16, 1), 0) andernfalls endet 0 als binary(1)), "time" = @P2 where UPPER(publisher) = UPPER(@P3) and publisher_db = @P4 and publication = @P5 and subscription_type = 0
-
update MSreplication_subscriptions set transaction_timestamp = cast(@P1 as binary(15)) + cast(substring(transaction_timestamp, 16, 1) as binary(1)), "time" = @P2 where UPPER(publisher) = UPPER(@P3) and publisher_db = and publication = @P4@P5 and subscription_type = 0 and (substring(transaction_timestamp, 16, 1) = 0 or datalength(transaction_timestamp) < 16)
Ursache
Dieses Problem tritt auf, wenn die Schätzung der Zeilenanzahl für die Zahlensystemtabelle MSreplication_subscriptions
falsch ist. Wenn die Schätzung der Zeilenanzahl falsch ist, verwendet die SQL Server Datenbank-Engine möglicherweise eine falsche Methode, um die Datenbank zu aktualisieren.
Hinweis
In der Regel entspricht die richtige Schätzung der Zeilenanzahl der Anzahl der Abonnements in der Datenbank. Wenn Sie das Feature Abonnementstreams verwenden, entspricht die Schätzung der Zeilenanzahl der Anzahl von Abonnements multipliziert mit der Anzahl der konfigurierten Streams für jedes Abonnement.
Lösung
Verwenden Sie eine der folgenden Methoden, um dieses Problem zu beheben.
Methode 1: Verwenden Sie den
DBCC UPDATEUSAGE
Befehl.Um dieses Problem zu beheben, aktualisieren Sie den falschen Zeilenanzahlwert. Führen Sie dazu den folgenden Befehl aus:
DBCC UPDATEUSAGE (**subscriber_database_name** **,**'MSreplication_subscriptions') WITH COUNT_ROWS
Hinweis
Der
DBCC UPDATEUSAGE
Befehl bestimmt die richtigen Werte für Zeilen, verwendete Seiten, reservierte Seiten, Blattseiten und Datenseitenanzahl für jede Partition in einer Tabelle. Wenn diese Werte korrekt sind, gibt derDBCC UPDATEUSAGE
Befehl keine Daten zurück. Wenn ungenaue Werte gefunden und korrigiert werden,DBCC UPDATEUSAGE
gibt die aktualisierten Zeilen und Spalten zurück.Methode 2: Verwenden Sie die
ALTER INDEX
-Anweisung.Um dieses Problem zu beheben, erstellen Sie die der
MSreplication_subscriptions
Tabelle zugeordneten Indizes neu. Verwenden Sie dazu die folgende Anweisung:ALTER INDEX ALL ON [dbo].[MSreplication_subscriptions] REBUILD
Weitere Informationen
Wenn das im Abschnitt Symptome erwähnte Problem auftritt, kann die Schätzung der Zeilenanzahl für die MSreplication_subscriptions
Systemtabelle so hoch wie 4.294.967.296 sein. Verwenden Sie eine der folgenden Methoden, um den Rowcount-Wert zu überprüfen.
Methode 1: Verwenden Sie SQL Server Management Studio.
Führen Sie die folgenden Schritte aus, um SQL Server Management Studio zum Überprüfen des Zeilenanzahlwerts für die
MSreplication_subscriptions
Systemtabelle zu verwenden:- Starten Sie SQL Server Management Studio, und stellen Sie dann instance eine Verbindung mit dem Abonnentenserver her.
- Erweitern Sie Datenbanken, und erweitern Sie dann die Abonnentendatenbank.
- Erweitern Sie Tabellen und dann Systemtabellen.
- Klicken Sie mit der rechten Maustaste auf dbo. MSreplication_subscriptions, und wählen Sie dann Eigenschaften aus.
- Wählen Sie Speicher aus, und überprüfen Sie dann den Wert der Zeilenanzahl im Feld Zeilenanzahl .
Methode 2: Verwenden Sie eine Abfrageanweisung.
Führen Sie die folgende Abfrage aus, um den Zeilenanzahlwert für die
MSreplication_subscriptions
Systemtabelle zu überprüfen:SELECT rows, * FROM sys.partitions WHERE object_id = object_id('MSreplication_subscriptions')
References
- Weitere Informationen zum Erkennen und Beenden von Deadlocks finden Sie unter Erkennen und Beenden von Deadlocks.
- Weitere Informationen zur
ALTER
-Anweisung finden Sie unter Transact-SQL-Anweisungen. - Weitere Informationen zum
DBCC UPDATEUSAGE
Befehl finden Sie unter DBCC UPDATEUSAGE (Transact-SQL).
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für