Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Ten artykuł ułatwia rozwiązanie problemu występującego podczas konfigurowania replikacji transakcyjnej w programie SQL Server.
Oryginalna wersja produktu: SQL Server
Oryginalny numer KB: 2674882
Symptomy
Rozważmy następujący scenariusz:
- Replikacja transakcyjna jest konfigurowana w programie SQL Server.
- Topologia replikacji transakcyjnej składa się z kilku wydawców.
- Wydawcy replikują dane do tej samej bazy danych subskrybentów.
- Agenci dystrybucji działają w sposób ciągły lub działają zgodnie z częstym harmonogramem. Na przykład agenci dystrybucji są uruchamiani co minutę.
W tym scenariuszu agenci dystrybucji mogą być zaangażowani w scenariusz zakleszczenia i mogą zostać wybrani jako ofiara zakleszczenia. W przypadku wystąpienia tego problemu może zostać wyświetlony komunikat o błędzie podobny do następującego:
Błąd 1205
Transakcja (identyfikator procesu %d) została zakleszona w zasobach %.*ls z innym procesem i została wybrana jako ofiara zakleszczenia. Uruchom ponownie transakcję.
Jeśli włączysz flagę śledzenia 1222, aby przekierować informacje o impasie do dziennika błędów programu SQL Server, zostanie wyświetlony komunikat o błędzie podobny do następującego:
-
update MSreplication_subscriptions set transaction_timestamp = cast(@P1 as binary(15)) + cast(case datalength(transaction_timestamp), gdy 16 następnie isnull(substring(transaction_timestamp, 16, 1), 0) else 0 end as binary(1)), "time" = where UPPER(publisher) = @P2 UPPER(@P3) i publisher_db = @P4 i publikacja = i subscription_type = i subscription_type = @P5 0
-
update MSreplication_subscriptions set transaction_timestamp = cast(@P1 as binary(15)) + cast(substring(transaction_timestamp, 16, 1) jako binary(1)), "time" = where UPPER(publisher) = @P2 UPPER(@P3) i publisher_db = @P4 i publikacja = @P5 i subscription_type = 0 i (podciąg(transaction_timestamp, 16, 1) = 0 lub datalength(transaction_timestamp) < 16)
Przyczyna
Ten problem występuje, jeśli oszacowanie liczby wierszy dla tabeli systemu liczb MSreplication_subscriptions
jest niepoprawne. Jeśli oszacowanie liczby wierszy jest niepoprawne, aparat bazy danych programu SQL Server może użyć nieprawidłowej metody w celu zaktualizowania bazy danych.
Uwaga 16.
Zazwyczaj prawidłowe oszacowanie liczby wierszy jest równe liczbie subskrypcji w bazie danych. Jeśli używasz funkcji Strumieni subskrypcji, szacowanie liczby wierszy jest równe liczbie subskrypcji pomnożonych przez liczbę skonfigurowanych strumieni dla każdej subskrypcji.
Rozwiązanie
Aby rozwiązać ten problem, zastosuj jedną z następujących metod:
Metoda 1. Użyj
DBCC UPDATEUSAGE
polecenia .Aby rozwiązać ten problem, zaktualizuj niepoprawną wartość wiersza. Aby to zrobić, uruchom następujące polecenie:
DBCC UPDATEUSAGE (**subscriber_database_name** **,**'MSreplication_subscriptions') WITH COUNT_ROWS
Uwaga 16.
Polecenie
DBCC UPDATEUSAGE
określa prawidłowe wartości wierszy, używanych stron, stron zarezerwowanych, stron liścia i liczby stron danych dla każdej partycji w tabeli. Jeśli te wartości są poprawne,DBCC UPDATEUSAGE
polecenie nie zwraca żadnych danych. Jeśli znaleziono i poprawiono niedokładne wartości,DBCC UPDATEUSAGE
zwraca zaktualizowane wiersze i kolumny.Metoda 2. Użyj instrukcji
ALTER INDEX
.Aby rozwiązać ten problem, ponownie skompiluj indeksy skojarzone z tabelą
MSreplication_subscriptions
. W tym celu użyj następującej instrukcji:ALTER INDEX ALL ON [dbo].[MSreplication_subscriptions] REBUILD
Więcej informacji
Jeśli problem wymieniony w sekcji Objawy występuje, szacowanie liczby wierszy dla MSreplication_subscriptions
tabeli systemowej może być nawet 4294 967 296. Aby sprawdzić wartość rowcount, użyj jednej z następujących metod.
Metoda 1. Użyj programu SQL Server Management Studio.
Aby użyć programu SQL Server Management Studio do sprawdzenia wartości wiersza dla tabeli systemowej
MSreplication_subscriptions
, wykonaj następujące kroki:- Uruchom program SQL Server Management Studio, a następnie połącz się z wystąpieniem serwera subskrybenta.
- Rozwiń węzeł Bazy danych, a następnie rozwiń bazę danych subskrybentów.
- Rozwiń węzeł Tabele, a następnie rozwiń węzeł Tabele systemowe.
- Kliknij prawym przyciskiem myszy pozycję dbo. MSreplication_subscriptions, a następnie wybierz pozycję Właściwości.
- Wybierz pozycję Magazyn, a następnie sprawdź wartość rowcount w polu Liczba wierszy .
Metoda 2. Użyj instrukcji zapytania.
Aby sprawdzić wartość rowcount dla tabeli systemowej
MSreplication_subscriptions
, uruchom następujące zapytanie:SELECT rows, * FROM sys.partitions WHERE object_id = object_id('MSreplication_subscriptions')
Informacje
- Aby uzyskać więcej informacji na temat wykrywania i kończenia zakleszczeń, zobacz Wykrywanie i kończenie zakleszczeń
- Aby uzyskać więcej informacji na temat instrukcji
ALTER
, zobacz Instrukcje języka Transact-SQL - Aby uzyskać więcej informacji na temat
DBCC UPDATEUSAGE
polecenia, zobacz DBCC UPDATEUSAGE (Transact-SQL)