KB4338890 – POPRAVAK: pogreška "Non-yielding Scheduler" SQL Server ne reagira u SQL Server 2014, 2016 i 2017

Primjenjuje se na
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)

Simptomi

Pretpostavimo da imate instaliran Microsoft SQL Server 2014, 2016 ili 2017.  Možda ćete naići na jedan ili više sljedećih problema:

  • Instanca SQL Server ne reagira i pojavljuje se pogreška "Non-yielding Scheduler". Možda ćete morati ponovno pokrenuti poslužitelj za oporavak.
  • Vraćanje transakcije može potrajati. U većini slučajeva ponovno pokretanje instance omogućit će bazi podataka oporavak mnogo brže od vraćanja na stariju verziju. Imajte na umu da postoji mnogo razloga zašto vraćanje može potrajati dugo, pogledajte odjeljak "Dodatne informacije" u nastavku za pojedinosti o praćenju povrataka prije pokušaja ponovnog pokretanja.
  • Možda ćete primijetiti velika čekanja na spinlockovima kao što je SOS_OBJECT_STORE.

Rješenje

Taj je problem riješen u sljedećim kumulativnim ažuriranjima za SQL Server:

Kumulativno ažuriranje 9 za SQL Server 2017

Kumulativno ažuriranje 2 za SQL Server 2016 SP2

O kumulativnim ažuriranjima za SQL Server:

Svako novo kumulativno ažuriranje za SQL Server sadrži sve hitne popravke i sigurnosne popravke koji su obuhvaćeni prethodnim kumulativnim ažuriranjem. Pogledajte najnovija kumulativna ažuriranja za SQL Server:

Najnovije kumulativno ažuriranje za SQL Server 2017

Najnovije kumulativno ažuriranje za SQL Server 2016

Najnovije kumulativno ažuriranje za SQL Server 2014

Informacije o servisnom paketu za SQL Server

Ovo je ažuriranje riješeno u sljedećem servisnom paketu za SQL Server:

Service Pack 3 za SQL Server 2014

O servisnim paketima za SQL Server:

Servisni paketi kumulativni su. Svaki novi servisni paket sadrži sve popravke iz prethodnih servisnih paketa, zajedno sa svim novim popravcima. Preporučujemo da za taj servisni paket primijenite najnoviji servisni paket i najnovije kumulativno ažuriranje. Ne morate instalirati prethodni servisni paket da biste instalirali najnoviji. U tablici 1 sljedećeg članka potražite dodatne informacije o najnovijem servisnom paketu i najnovijem kumulativnom ažuriranju.

Kako odrediti verziju, izdanje i razinu ažuriranja za SQL Server i njegove komponente

Dodatne informacije

Mnogo je razloga zašto vraćanje može potrajati dugo, kao što su dugotrajna transakcija, velik broj VLF-ova u datoteci zapisnika transakcija, spori ulaz/izlaz itd. Da bismo potvrdili je li problem opisan u ovom članku glavni uzrok sporog vraćanja, predlažemo da se za praćenje tijeka postupka vraćanja koriste sljedeće tehnike:

  • U sys.dm_exec_requests odredite session_id čija je naredba postavljena na "KILLED/ROLLBACK" i provjerite akumulira li sesija vrijeme za ulaz/izlaz i CPU-a koje označava napredak. Ako se IO ne mijenja, to može upućivati na to da nailazite na problem opisan u ovom članku.
  • Unesite upit sys.dm_tran_database_transactions da biste utvrdili trenutačno stanje povratka pomoću upita kao što je ovaj:

Napomena

  • SELECT getdate() as 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
  • PRIDRUŽITE sys.dm_exec_requests
       UKLJUČENO t.transaction_id=s.transaction_id
  • WHERE t.database_id=db_id('<Naziv baze podataka') i s.session_id=Session_id<izvođenja operacije> povratka

Napomena:

U gornjem upitu:

database_transaction_next_undo_lsn je LSN sljedećeg zapisa koji treba poništiti. database_transaction_begin_lsn je LSN početnog zapisa za transakciju u zapisniku transakcija.

database_transaction_next_undo_lsn bi se trebale smanjivati sa svakom snimkom upita. Vraćanje će se uspješno dovršiti kada database_transaction_next_undo_lsn dosegne database_transaction_begin_lsn.

Cilj je napraviti nekoliko snimaka prethodnog upita unutar unaprijed određenog intervala, a zatim koristiti deltu LSN-ova obrađenih u database_transaction_next_undo_lsn unutar tog intervala i ekstrapolirati vrijeme potrebno za procjenu vremena potrebnog database_transaction_next_undo_lsn za dosezanje database_transaction_begin_lsn.

Ako vraćanje napreduje pristojnom brzinom između svake snimke stanja, predlažemo da se povratak dovrši sam od sebe bez ponovnog pokretanja instance sustava SQL Server.

U sljedećim člancima potražite dodatne informacije o dugotrajnom oporavku:

Status

Microsoft je potvrdio da je to problem u Microsoftovim proizvodima koji su navedeni u odjeljku „Odnosi se na“.

Reference

Saznajte više o terminologiji koju Microsoft upotrebljava za opisivanje softverskih ažuriranja.