Uzun bir SQL sorgusu nasıl anında kapatılır / durdurulur?


98

SQL server 2008 ve onun yönetim stüdyosunu kullanıyorum. Çok sayıda satır veren bir sorgu çalıştırdım. Kırmızı iptal düğmesiyle iptal etmeye çalıştım, ancak son 10 dakikadır durmadı. Genellikle 3 dakika içinde durur.

Sebep ne olabilir ve bunu hemen nasıl durdurabilirim?


herhangi bir uygulamanın bu sorguyu tutup tutmadığını kontrol ettiniz mi?
user1102001

1
sql hizmetlerinizi durdurun ve yeniden başlatın ..
user1102001

her şeyi sql'de çalıştırdığım için bu senaryonla karşılaştım ve profilimi düzenlemek ya da düzenlememek benim isteğim ...
user1102001

@ user1102001 - sizi hiçbir şey yapmaya zorlamıyor. Yapabilirim dedim ve yapmamalıyım :)
netice.learner

Yanıtlar:


65

Sebep ne olabilir

Dikkatinizin sunucuya ulaşabilmesi ve işlenebilmesi koşuluyla, bir sorgu iptali anında gerçekleşir . SQLCLR'den bir web servisini çağırmak gibi belirli işlemleri yapmanız dışında, sorgu iptal edilebilir durumda olmalıdır. Dikkatiniz sunucuya ulaşamazsa, bunun nedeni genellikle zamanlayıcının aşırı yüklemesidir.

Ancak sorgunuz geri alınması gereken bir işlemin parçasıysa, geri alma kesintiye uğratılamaz. 10 dakika sürerse, 10 dakikaya ihtiyacı vardır ve bu konuda yapabileceğiniz hiçbir şey yoktur. Sunucuyu yeniden başlatmak bile yardımcı olmaz, yalnızca başlatma işlemini uzatır, çünkü kurtarma işlemi geri alma işlemini bitirmelidir.

Vakanız için hangi özel nedenin geçerli olduğunu cevaplamak için, kendinizi araştırmanız gerekir.


SSMS'nin sorguyu yalnızca dikkat yanıtı alındıktan sonra 'iptal edildi' ('iptal etmeye çalışmak' yerine) olarak gösterdiğini unutmayın; bu, önce iletişim kanalındaki tüm ara sonuçların boşaltılması anlamına gelir (örn. TCP / IP'deki tüm sonuçlar) gönderme / alma arabellekleri ve tüm bellek içi arabellekler).
Remus Rusanu

1
Keşke 'geri dönüyor'
deseydi

@RemusRusanu - Ya tahmini geri alma süresi 20.000+ saatse? Bir yedeklemeden geri yüklemekten mutluluk duyarız. dba.stackexchange.com/questions/222145/…
youcantryreachingme

112
sp_who2 'active'

CPUTime ve DiskIO altındaki değerleri kontrol edin . Karşılaştırmalı olarak büyük değere sahip olan işlemin SPID'sine dikkat edin.

kill {SPID value}

Microsoft SQL Server 2008 R2 kullanıyorum, yürütülen ve askıya alınan sorgunun SPID'sinin ne olduğunu bulmaya çalıştım ve aynı SELECT SQL'in aynı SPID'ye sahip birçok örneği olduğunu buldum. KILL 114 komutunu yürütmeye çalıştığımda - burada 114, askıya alınan sorgumun SPID değeridir. Aşağıdaki hatayı alıyorum: Lütfen yönlendirin. Msg 102, Düzey 15, Durum 1, Satır 2 '114' yakınında yanlış sözdizimi.
Kod Buster

42

Önce aşağıdaki komutu yürütün:

sp_who2

Bundan sonra, yukarıdaki komuttan aldığınız SPID ile aşağıdaki komutu yürütün:

KILL {SPID value}

23

Bu biraz saçma bir cevap, ama en azından benim durumumda güvenilir bir şekilde çalışıyor: Yönetim stüdyosunda, "Sorguyu Yürütmeyi İptal Et" sorguyu durdurmadığında, sadece mevcut sql belgesini kapatmak için tıklıyorum. Sorguyu iptal etmek isteyip istemediğimi soruyor, evet diyorum ve birkaç saniye içinde çalışmayı durduruyor. Bundan sonra, kapatmadan önce belgeyi kaydetmek isteyip istemediğimi soruyor. Bu noktada, belgeyi açık tutmak ve çalışmaya devam etmek için İptal'i tıklayabilirim. Perde arkasında neler olduğu hakkında hiçbir fikrim yok ama işe yarıyor gibi görünüyor.


5
Bu durumda sorgu gerçekte hala arka planda çalışıyor / asılı olabilir, artık onu görmezsiniz.
Aries51

1
Bundan sonra yeniden bağlanmanız gerektiğinden, bence bağlantıyı kesiyor.
anakic

2
SSMS ile olan bağlantıyı keser ancak (zorunlu olarak) db ile bağlantı kurmaz.
Aries51

1
Bunu denedim sql'm kapattı. T_T
bot

1
Göremiyorsan, yok.
ChrisD

15

Eğer iptal edersen ve koştuğunu görürsen

 sp_who2 'active'

(Etkinlik Monitörü eski sql server 2000 FYI'da kullanılamayacak)

Öldürmek istediğiniz SPID'yi bulun, örn. 81

Kill 81

sp_who2 'active' Tekrar çalıştırın ve muhtemelen uyuduğunu fark edeceksiniz ... geri dönüyor

DURUMU tekrar çalıştırmak için KILL

Kill 81 

O zaman böyle bir mesaj alacaksın

 SPID 81: transaction rollback in progress. Estimated rollback completion: 63%. Estimated time remaining: 992 seconds.

Ben çalıştırmak zorunda KILL {spid} WITH STATUSONLYdurum mesajını görmek için.
Rudey

11

Sorgu yürütmeyi durdurmak için bir klavye kısayolu ALT+ Breakkullanabilirsiniz. Ancak bu her durumda başarılı olmayabilir.


1
Bu benim için Management stüdyosunda çalıştı. Teşekkürler
Vishvanathsinh Solanki

5
--Find Session Id for respective all running queries
SELECT text, getdate(),*
 FROM sys.dm_exec_requests
CROSS APPLY sys.dm_exec_sql_text(sql_handle)

---Kill specific session
kill 125

1
Lütfen cevabınızı başkalarının öğrenebileceği şekilde düzenleyerek bir açıklama ekleyin
Nico Haase

2

Görünüşe göre 2008 r2 64bit sql sunucusunda, IIS'den uzun süre çalışan sorgu ile kill spid çalışmıyor gibi görünüyor, sorgu tekrar ve tekrar yeniden başlatılıyor. ve örümcekleri yeniden kullanıyor gibi görünüyor. sorgu sql sunucusunun sürekli olarak% 35 cpu almasına ve web sitesini asmasına neden oluyor. Sanırım bc / oturum açmak için diğer sorgulara yanıt veremiyor


2
Bunun için bir kaynak görmek isterim.
Ant Swift

2

Uzun zamandır aynı şeyden acı çekiyorum. Özellikle uzak sunucuya bağlandığınızda (bu yavaş olabilir) veya ağ bağlantınız zayıf olduğunda gerçekleşir. Microsoft'un doğru cevabın ne olduğunu bildiğinden şüpheliyim.

Ama çözümü bulmaya çalıştığımdan beri. Sadece 1 meslekten olmayan yaklaşım işe yaradı

  • Acı çektiğiniz sorgu sekmesinin üzerindeki kapat düğmesine tıklayın. Bir süre sonra (Microsoft size sert davranmıyorsa !!!) şunu soran bir pencere görebilirsiniz.

"Sorgu şu anda yürütülüyor. Sorguyu iptal etmek istiyor musunuz?"

  • "Evet" e tıklayın

  • Bir süre sonra bu sorguyu kaydetmek isteyip istemediğiniz sorulacak.

  • "İptal" e tıklayın

Ve bunu yayınlayın, belki de stüdyosunuz sorgunuzu yürütmek için tekrar kararlı.

Arka planda yaptığı şey, sorgu pencerenizin bağlantıyla olan bağlantısını kesmektir. Dolayısıyla sorguyu tekrar çalıştırmak için uzak sunucuyu yeniden bağlamak zaman alacaktır. Ama güven bana, bu değiş tokuş, sonsuza kadar çalışan zamanlayıcıyı görmenin acısından çok daha iyidir.

Not: Bu benim için çalışıyor, Tebrikler sizin için de uygunsa. !!!


1
Hala benim için çalıştı ve sorunumu çözdü ->
ErocM

1

Benim açımdan sql'im, durmadan koşarken kapatmaya çalıştığımda kapattı. Yaptığım şey, görev yöneticimi açıp sql sorgumu görevi sonlandırmaktı. Bu benim sql'imi durdurdu ve yeniden başlattı.


1

Kırmızı "durdur" kutusu çalışmıyorsa basit bir cevap, klavyedeki "Ctrl + Break" düğmelerine basmayı denemektir.

Linux'ta SQL Server çalıştırıyorsanız, "killall" adlı sisteminize ekleyebileceğiniz bir uygulama var. Sadece "killall" düğmesine tıklayın ve ardından bir döngüye yakalanan programa tıklayın ve program sonlandırılacaktır. Umarım yardımcı olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.