Udostępnij za pośrednictwem


Błąd 1205 podczas konfigurowania replikacji transakcyjnej

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:

    1. Uruchom program SQL Server Management Studio, a następnie połącz się z wystąpieniem serwera subskrybenta.
    2. Rozwiń węzeł Bazy danych, a następnie rozwiń bazę danych subskrybentów.
    3. Rozwiń węzeł Tabele, a następnie rozwiń węzeł Tabele systemowe.
    4. Kliknij prawym przyciskiem myszy pozycję dbo. MSreplication_subscriptions, a następnie wybierz pozycję Właściwości.
    5. 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