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 der DBCC 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:

    1. Starten Sie SQL Server Management Studio, und stellen Sie dann instance eine Verbindung mit dem Abonnentenserver her.
    2. Erweitern Sie Datenbanken, und erweitern Sie dann die Abonnentendatenbank.
    3. Erweitern Sie Tabellen und dann Systemtabellen.
    4. Klicken Sie mit der rechten Maustaste auf dbo. MSreplication_subscriptions, und wählen Sie dann Eigenschaften aus.
    5. 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