Training
Module
Transacties implementeren met Transact-SQL - Training
Transacties implementeren met Transact-SQL
Deze browser wordt niet meer ondersteund.
Upgrade naar Microsoft Edge om te profiteren van de nieuwste functies, beveiligingsupdates en technische ondersteuning.
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
Bekijk het volgende scenario:
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)
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.
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:
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:
ALTER INDEX ALL ON [dbo].[MSreplication_subscriptions] REBUILD
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:
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:
SELECT rows, * FROM sys.partitions WHERE object_id = object_id('MSreplication_subscriptions')
ALTER
instructie DBCC UPDATEUSAGE
opdracht Training
Module
Transacties implementeren met Transact-SQL - Training
Transacties implementeren met Transact-SQL
Documentatie
MSSQLSERVER_1205