Symptomy
W przypadku korzystania z funkcji dublowania bazy danych w programie Microsoft SQL Server 2012 lub Microsoft SQL Server 2014 może zostać wyświetlony warunek potwierdzenia, a dublowanie bazy danych zostanie wprowadzone do stanu wstrzymania.
Przyczyna
Ten problem występuje, ponieważ podczas przydzielania nowej strony program SQL Server uzyskuje blokadę X na nowej stronie. Program SQL Server umieści hobt_id (identyfikator sterty lub B-Tree), do którego należy Nowa strona w żądaniu blokady. Program SQL Server nie może jednak umieścić hobt_id w dzienniku dublowanym, a wyniki są różne w różnych działaniach blokowania między podstawowym i dublowanym. Można to szczegółowo wyjaśnić następująco:
-
T1 na stronie P1 należy zablokować IX.
-
T2 do podziału strony na P1, Przydziel nową stronę P2, a w systemie jest tu używana transakcja systemowa wysyłanie w postaci X na P2. W tym miejscu program SQL Server nie wprowadził hobt_id w dzienniku dublowania.
-
Wysyłanie powoduje, że blokada T1 umożliwia przeniesienie blokady IX z P1 na P2.
-
WYSŁANE, teraz T2 może używać strony P2, a T2 uzyskuje kolejną pozycję IX Lock na stronie P2.
-
T1 Committed, teraz T2 to jedyna osoba posiadająca IX zamek na P2.
-
Po przeprowadzeniu wielu wystąpień funkcji eskalacja blokady jest to spowodowane tym, że po zakończeniu eskalacji blokady T2 na woluminie P2 jest zwalniana wartość IX.
-
Po usunięciu partii Strona P2 stała się pusta i zostanie wycofana z alokacji.
-
Łącze T3 wymaga nowej strony i nastąpi przydzielenie P2, wymaga to zablokowania X, ale na zdublowanym kroku nie powiodło się z powodu kroku 6.
Na zdublowanym kroku 6 nie jest zwalniana blokada z IX, ponieważ hobt_id w bloku blokady są niepoprawne. Ta niepoprawna hobt_id jest dostępna w kroku 2, ponieważ program SQL Server nie umieszcza hobt_id w dzienniku dublowania. zazwyczaj nie widzisz żadnego problemu, ponieważ wysyłanie w kroku 2 jest bardzo krótkie, a blok blokowania z nieprawidłowym hobt_id zostanie zwolniony po jego zatwierdzeniu. Ponieważ jednak migracja blokady w programie step3 i wykonanie poniższych czynności (4 i 5), ten blok blokowania z nieprawidłowym hobt_id jest zachowywany i wreszcie powoduje problem. Ten problem nie występuje w podstawowym obszarze, ponieważ w kroku 2 jest używany prawidłowy hobt_id. Rekord dziennika nie ma poprawiejących hobt_id.
Rozwiązanie
Ten problem został po raz pierwszy rozwiązany w poniższej zbiorczej aktualizacji programu SQL Server.
Zbiorcza aktualizacja 1 dla programu SQL Server 2014 /en-us/help/2931693
Zbiorcza aktualizacja 9 dla programu SQL Server 2012 z dodatkiem SP1 /en-us/help/2931078
Każda nowa Zbiorcza aktualizacja programu SQL Server zawiera wszystkie poprawki i wszystkie poprawki zabezpieczeń uwzględnione w poprzedniej aktualizacji zbiorczej. Zapoznaj się z najnowszymi aktualizacjami zbiorczymi dla programu SQL Server:
Obejście
Aby obejść ten problem, ponownie zainicjuj dublowanie, aby zakończyć stan wstrzymania.
Stan
Firma Microsoft potwierdziła, że jest to problem występujący w produktach firmy Microsoft wymienionych w sekcji "dotyczy".