Objawy
Załóżmy, że masz zainstalowany program Microsoft SQL Server 2014, 2016 lub 2017. Może wystąpić co najmniej jeden z następujących problemów:
- Wystąpienie programu SQL Server nie odpowiada i występuje błąd "Non-yielding Scheduler". W celu odzyskania może być konieczne ponowne uruchomienie serwera.
- Wycofanie transakcji może zająć dużo czasu. W większości przypadków ponowne uruchomienie wystąpienia pozwoli na odzyskanie bazy danych znacznie szybciej niż wycofanie. Pamiętaj, że istnieje wiele powodów, dla których wycofanie może zająć dużo czasu. Zobacz sekcję "Więcej informacji" poniżej, aby uzyskać szczegółowe informacje na temat monitorowania wycofań przed próbą ponownego uruchomienia.
- Możesz zobaczyć długie oczekiwanie na spinlocki, takie jak SOS_OBJECT_STORE.
Rozwiązanie
Ten problem został rozwiązany w następujących aktualizacjach zbiorczych dla programu SQL Server:
Aktualizacja zbiorcza 9 dla programu SQL Server 2017
Aktualizacja zbiorcza 2 dla programu SQL Server 2016 z dodatkiem SP2
Informacje o aktualizacjach zbiorczych programu SQL Server:
Każda nowa aktualizacja zbiorcza programu SQL Server zawiera wszystkie poprawki zabezpieczeń uwzględnione w poprzedniej aktualizacji skumulowanej. Sprawdź najnowsze aktualizacje zbiorcze dla programu SQL Server:
Najnowsza aktualizacja zbiorcza dla programu SQL Server 2017
Najnowsza aktualizacja zbiorcza dla programu SQL Server 2016
Najnowsza aktualizacja zbiorcza dla programu SQL Server 2014
Informacje o dodatku Service Pack dla programu SQL Server
Ta aktualizacja jest poprawiona w następującym dodatku Service Pack dla programu SQL Server:
Service Pack 3 dla programu SQL Server 2014
Informacje o dodatkach Service Pack dla programu SQL Server:
Dodatki Service Pack są kumulatywne. Każdy nowy dodatek Service Pack zawiera wszystkie poprawki zawarte w poprzednich dodatkach Service Pack oraz nowe poprawki. Zalecamy stosowanie najnowszego dodatku Service Pack i najnowszej aktualizacji zbiorczej dla danego dodatku Service Pack. Instalowanie poprzedniego dodatku Service Pack przed zainstalowaniem najnowszego dodatku Service Pack nie jest konieczne. Więcej informacji na temat najnowszego dodatku Service Pack i najnowszej aktualizacji zbiorczej znajdziesz w tabeli 1 w następującym artykule.
Jak ustalić wersję, edycję i poziom aktualizacji programu SQL Server i jego składników
Istnieje wiele powodów, dla których wycofanie może zająć dużo czasu, takich jak długotrwała transakcja, duża liczba VLF w pliku dziennika transakcji, powolne operacje we/wy itp. W celu zweryfikowania, czy problem opisany w tym artykule jest główną przyczyną powolnego wycofywania, sugerujemy użycie następujących technik monitorowania postępu operacji wycofywania:
- Z sys.dm_exec_requests zidentyfikuj session_id, którego polecenie jest ustawione na wartość "KILLED/ROLLBACK" i upewnij się, że sesja gromadzi zarówno czas we/wy, jak i procesora, wskazując postęp. Jeśli liczba we/wy się nie zmienia, może to oznaczać, że występuje problem opisany w tym artykule.
- Zapytanie sys.dm_tran_database_transactions zidentyfikować bieżący stan wycofywania przy użyciu następującego zapytania:
Uwaga
- SELECT getdate() jako CurrentTime, database_transaction_next_undo_lsn,database_transaction_begin_lsn,t.transaction_id,database_transaction_begin_time,database_transaction_log_record_count,db_name(t.database_id)
- OD sys.dm_tran_database_transactions T
- JOIN sys.dm_exec_requests s
NA t.transaction_id=s.transaction_id - WHERE t.database_id=db_id('<Nazwa bazy danych') i s.session_id=<Session_id wykonywanie operacji> wycofywania
Uwaga:
W powyższym zapytaniu
database_transaction_next_undo_lsn jest LSN następnego rekordu do cofnięcia. database_transaction_begin_lsn jest numerem LSN rekordu rozpoczęcia transakcji w dzienniku transakcji.
database_transaction_next_undo_lsn powinna się zmniejszać z każdą migawką tego zapytania. Wycofywanie zostanie ukończone, gdy database_transaction_next_undo_lsn osiągnie database_transaction_begin_lsn.
Celem jest utworzenie kilku migawek poprzedniego zapytania w określonym interwale czasu, a następnie użycie delty LSN przetworzonych w database_transaction_next_undo_lsn w tym przedziale i ekstrapolacja czasu potrzebnego na oszacowanie czasu potrzebnego na dotarcie database_transaction_next_undo_lsn do database_transaction_begin_lsn.
Jeśli wycofywanie postępuje w przyzwoitym tempie między każdą migawką, sugerujemy, aby pozwolić na samoczynne wycofanie bez ponownego uruchamiania wystąpienia programu SQL Server.
Aby uzyskać więcej informacji na temat długotrwałego odzyskiwania, zobacz następujące artykuły:
- Opis wydajności odzyskiwania w programie SQL Server
- SQL Server (2000, 2005, 2008): odzyskiwanie/wycofanie trwa dłużej niż oczekiwano
- Jak struktura pliku dziennika może wpłynąć na czas odzyskiwania bazy danych
- Śledzenie postępu odzyskiwania bazy danych przy użyciu informacji z DMV
Stan
Firma Microsoft potwierdziła, że jest to problem dotyczący produktów firmy Microsoft wymienionych w sekcji „Dotyczy”.
Źródła informacji
Dowiedz się więcej o terminologii używanej przez firmę Microsoft do opisywania aktualizacji oprogramowania.