Lezen in het Engels

Delen via


Fout 1205 bij het configureren van transactionele replicatie

Dit artikel helpt u bij het oplossen van een probleem dat optreedt wanneer u transactionele replicatie configureert in SQL Server.

Oorspronkelijke productversie: SQL Server
Oorspronkelijk KB-nummer: 2674882

Symptomen

Bekijk het volgende scenario:

  • U configureert transactionele replicatie in SQL Server.
  • De transactionele replicatietopologie bestaat uit verschillende uitgevers.
  • De uitgevers repliceren gegevens naar dezelfde abonneedatabase.
  • De distributieagents worden continu uitgevoerd of worden uitgevoerd volgens een frequent schema. De distributieagents worden bijvoorbeeld elke minuut uitgevoerd.

In dit scenario kunnen de distributieagenten betrokken zijn bij een impassescenario en kunnen ze worden geselecteerd als een impasseslachtoffer. Wanneer dit probleem optreedt, wordt er mogelijk een foutbericht weergegeven dat er ongeveer als volgt uitziet:

Fout 1205
Transactie (proces-id %d) is vastgelopen op %.*ls-resources met een ander proces en is gekozen als het impasseslachtoffer. Voer de transactie opnieuw uit.

Als u traceringsvlag 1222 inschakelt om de impassegegevens om te leiden naar het SQL Server-foutenlogboek, ontvangt u een foutbericht dat lijkt op een van de volgende:

  • update MSreplication_subscriptions set transaction_timestamp = cast(@P1 as binary(15)) + cast(case datalength(transaction_timestamp) wanneer 16 isnull(subtekenreeks(transaction_timestamp; 16, 1), 0) anders 0 eindigt als binair(1)), "time" = @P2 where UPPER(publisher) = UPPER(@P3) en publisher_db = @P4 en publicatie = @P5 en subscription_type = 0

  • update MSreplication_subscriptions set transaction_timestamp = cast(@P1 as binary(15)) + cast(subtekenreeks(transaction_timestamp; 16, 1) als binair(1)), "time" = @P2 where UPPER(publisher) = UPPER(@P3) and publisher_db = @P4 and publication = @P5 and subscription_type = 0 and (subtekenreeks(transaction_timestamp, 16, 1) = 0 of datalength(transaction_timestamp) < 16)

Oorzaak

Dit probleem treedt op als de schatting van het aantal rijen voor de systeemtabel voor getallen MSreplication_subscriptions onjuist is. Als de schatting van het aantal rijen onjuist is, kan de SQL Server-database-engine een onjuiste methode gebruiken om de database bij te werken.

Notitie

Normaal gesproken is de juiste schatting van het aantal rijen gelijk aan het aantal abonnementen in de database. Als u de functie Abonnementsstromen gebruikt, is de schatting van het aantal rijen gelijk aan het aantal abonnementen vermenigvuldigd met het aantal geconfigureerde streams voor elk abonnement.

Oplossing

U kunt dit probleem op een van de volgende manieren oplossen:

  • Methode 1: Gebruik de DBCC UPDATEUSAGE opdracht.

    Werk de onjuiste waarde voor het aantal rijen bij om dit probleem op te lossen. Voer hiervoor de volgende opdracht uit:

    SQL
    DBCC UPDATEUSAGE (**subscriber_database_name** **,**'MSreplication_subscriptions') WITH COUNT_ROWS
    

    Notitie

    De DBCC UPDATEUSAGE opdracht bepaalt de juiste waarden voor rijen, gebruikte pagina's, gereserveerde pagina's, bladpagina's en het aantal gegevenspagina's voor elke partitie in een tabel. Als deze waarden juist zijn, retourneert de DBCC UPDATEUSAGE opdracht geen gegevens. Als onjuiste waarden worden gevonden en gecorrigeerd, DBCC UPDATEUSAGE worden de rijen en kolommen geretourneerd die worden bijgewerkt.

  • Methode 2: Gebruik de ALTER INDEX instructie.

    U kunt dit probleem oplossen door de indexen te herbouwen die aan de MSreplication_subscriptions tabel zijn gekoppeld. Gebruik hiervoor de volgende instructie:

    SQL
    ALTER INDEX ALL ON [dbo].[MSreplication_subscriptions] REBUILD
    

Meer informatie

Wanneer het probleem dat wordt vermeld in de sectie Symptomen optreedt, kan de schatting van het aantal rijen voor de MSreplication_subscriptions systeemtabel zo hoog zijn als 4.294.967.296. Gebruik een van de volgende methoden om de waarde voor het aantal rijen te controleren.

  • Methode 1: SQL Server Management Studio gebruiken.

    Als u SQL Server Management Studio wilt gebruiken om de waarde voor het aantal rijen voor de MSreplication_subscriptions systeemtabel te controleren, voert u de volgende stappen uit:

    1. Start SQL Server Management Studio en maak vervolgens verbinding met het exemplaar van de abonneeserver.
    2. Vouw Databases uit en vouw vervolgens de abonneedatabase uit.
    3. Vouw Tabellen uit en vouw vervolgens Systeemtabellen uit.
    4. Klik met de rechtermuisknop op dbo. MSreplication_subscriptions en selecteer Vervolgens Eigenschappen.
    5. Selecteer Opslag en controleer vervolgens de waarde voor het aantal rijen in het veld Aantal rijen .
  • Methode 2: Gebruik een query-instructie.

    Voer de volgende query uit om de waarde voor het aantal rijen voor de MSreplication_subscriptions systeemtabel te controleren:

    SQL
    SELECT rows, * FROM sys.partitions WHERE object_id = object_id('MSreplication_subscriptions')
    

Verwijzingen

  • Zie Detecting and Ending Deadlocks (Impasses detecteren en beëindigen) voor meer informatie over het detecteren en beëindigen van impasses
  • Zie Transact-SQL-instructies voor meer informatie over de ALTER instructie
  • Zie DBCC UPDATEUSAGE (Transact-SQL) voor meer informatie over de DBCC UPDATEUSAGE opdracht