KB4338890 — POPRAWKA: w SQL Server 2014, 2016 i 2017 SQL Server błąd "Nieyielding Scheduler" i nie odpowiada

Dotyczy
SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use) SQL Server 2017 Developer on Windows SQL Server 2017 Enterprise Core on Windows SQL Server 2017 Enterprise on Windows SQL Server 2017 Standard on Windows SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Enterprise Core - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use)

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

Więcej informacji

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:

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.