KB4338890 – POPRAVKA: Greška "Non-yielding Scheduler" i SQL Server se ne odaziva u SQL Server 2014, 2016 i 2017

Primenjuje 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žete naići na neke od sledećih problema:

  • Instanca SQL Server se ne odaziva i pojavljuje se greška "Non-yielding Scheduler". Možda ćete morati ponovo da pokrenete server da biste oporavili sistem.
  • Vraćanje transakcije može dugo potrajati. U većini slučajeva, ponovno pokretanje instance omogućiće bazi podataka da se oporavi mnogo brže od vraćanja. Imajte na umu da postoji mnogo razloga zbog kojih vraćanje može dugo potrajati, pogledajte odeljak "Više informacija" u nastavku da biste pronašli detalje o nadgledanju vraćanja pre pokušaja ponovnog pokretanja.
  • Možda ćete videti velika čekanja na spinlocks, kao što su SOS_OBJECT_STORE.

Rešenje

Ovaj problem je rešen u sledećim kumulativnim ispravkama za SQL Server:

Kumulativna ispravka 9 za SQL Server 2017

Kumulativna ispravka 2 za SQL Server 2016 SP2

Osnovni podaci o kumulativnim ispravkama za SQL Server:

Svaka nova kumulativna ispravka za SQL Server sadrži sve hitne ispravke i sve bezbednosne ispravke koje su uključene u prethodnu kumulativnu ispravku. Pogledajte najnovije kumulativne ispravke za SQL Server:

Najnovija kumulativna ispravka za SQL Server 2017

Najnovija kumulativna ispravka za SQL Server 2016

Najnovija kumulativna ispravka za SQL Server 2014

Informacije o servisnom paketu za SQL Server

Ova ispravka je popravljena u sledećem servisnom paketu za SQL Server:

Servisni paket 3 za SQL Server 2014

Osnovni podaci o servisnim paketima za SQL Server:

Servisni paketi su kumulativni. Svaki novi servisni paket sadrži sve ispravke koje su u prethodnim servisnim paketima, zajedno sa svim novim ispravkama. Preporučujemo da primenite najnoviji servisni paket i najnoviju kumulativnu ispravku za taj servisni paket. Ne morate da instalirate prethodni servisni paket pre nego što instalirate najnoviji servisni paket. Koristite Tabelu 1 u sledećem članku da biste pronašli više informacija o najnovijem servisnom paketu i najnovijoj kumulativnoj ispravci.

Kako utvrditi verziju, izdanje i nivo ažuriranja sistema SQL Server i njegovih komponenti

Više informacija

Postoji mnogo razloga zbog kojih vraćanje može dugo potrajati, kao što su dugotrajna transakcija, veliki broj VLF-ova u datoteci evidencije transakcija, spor I / I itd. Da biste potvrdili da je problem opisan u ovom članku osnovni uzrok sporog vraćanja, predlažemo da se koriste sledeće tehnike za nadgledanje toka operacije vraćanja:

  • Iz sys.dm_exec_requests identifikujte session_id čija je komanda postavljena na "KILLED/ROLLBACK" i uverite se da sesija akumulira i IO i CPU vreme koje ukazuje na napredak. Ako se IO ne menja, to može da ukazuje na to da nailazite na problem opisan u ovom članku.
  • Izvršite upit sys.dm_tran_database_transactions da biste identifikovali trenutno stanje vraćanja pomoću upita poput sledećeg:

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)
  • FROM sys.dm_tran_database_transactions t
  • PRIDRUŽITE sys.dm_exec_requests S
       UKLJUČENO t.transaction_id=s.transaction_id
  • WHERE t.database_id=db_id('<Ime baze podataka') i s.session_id=Session_id<izvršavanje operacije> vraćanja

Napomena:

U upitu iznad,

database_transaction_next_undo_lsn je LSN sledećeg zapisa koji treba opozvati. database_transaction_begin_lsn je LSN početnog zapisa za transakciju u evidenciji transakcije.

database_transaction_next_undo_lsn bi trebalo da se smanjuje sa svakim snimkom ovog upita. Vraćanje će se uspešno dovršiti kada database_transaction_next_undo_lsn dostigne database_transaction_begin_lsn.

Cilj ovoga jeste da napravite nekoliko snimaka prethodnog upita u okviru unapred određenog intervala, a zatim da upotrebite deltu LSN-ova koji su obrađeni u database_transaction_next_undo_lsn u okviru tog intervala i ekstrapolirate vreme potrebno da bi se procenilo vreme koje će biti potrebno da database_transaction_next_undo_lsn stigne do database_transaction_begin_lsn.

Ako vraćanje napreduje pristojnom brzinom između svakog snimka, predlažemo da se dozvoli da se vraćanje dovrši samostalno bez ponovnog pokretanja instance SQL Server.

Pogledajte sledeće članke za više informacija o dugotrajnom oporavku:

Status

Microsoft je potvrdio da je ovo problem u Microsoft proizvodima koji su navedeni u odeljku „Odnosi se na“.

Reference

Saznajte više o terminologiji koju Microsoft koristi za opisivanje softverskih ispravki.