Hoşgeldin Misafir

SQL Server’da Bloklanan İşlemleri Tespit Etme ve Gerekirse Sonlandırma

Stronger_Cracker

25 Tem 2022
6,403 Mesaj

Aktiflik

Seviye

Deneyim

TIM / GÖREV:
SQL Server (MSSQL) tarafında zaman zaman bir işlemin uzun süre kilit tuttuğu ve diğer sorguların beklemede kaldığı durumlarla karşılaşabiliyoruz. Bu gibi anlarda sistem yavaşlayabiliyor, bazı ekranlar cevap vermeyebiliyor. Bu durum çoğu zaman blocking kaynaklıdır. Yani bir oturum, işlem yaptığı veri üzerinde lock tuttuğu için başka oturumlar o kaynağa erişemeyip beklemeye geçer. Sorunun kaynağını bulmak için önce hangi oturumun blokladığını tespit etmek, ardından gerçekten gerekliyse ilgili SPID’i sonlandırmak pratik bir çözüm olabilir.

Ben bu tarz durumlarda önce bloklayan ve bloklanan oturumları kontrol ediyorum, ardından sp_who2 ile detay bakıp gerçekten problemli oturum olduğundan emin olduktan sonra gerekirse KILL komutu ile müdahale ediyorum.

Bloklayan ve bloklanan oturumları listeleme:
SQL:
SELECT blocking_session_id AS BlockerSPID,
    session_id AS BlockedSPID,
    text AS QueryText
FROM sys.dm_exec_requests
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
WHERE blocking_session_id > 0;

Bu sorgu ile:
  • hangi SPID’in bloklama yaptığını,
  • hangi SPID’in beklediğini,
  • çalışan sorgunun ne olduğunu görebiliyoruz.
Oturumları genel olarak inceleme:
SQL:
EXEC sp_who2;
Burada özellikle şu alanlar faydalı oluyor:
  • SPID: Oturum kimliği
  • Status: Oturumun mevcut durumu
  • BlkBy: Bu oturum başka bir oturum tarafından engelleniyorsa, engelleyen SPID bilgisi
Örneğin BlkBy alanında bir SPID görünüyorsa, ilgili oturum başka bir işlem yüzünden bekliyor demektir.

Gerekirse problemli oturumu sonlandırma:
Kod:
KILL 300;
Burada 300 örnek bir SPID değeridir. Kendi tespit ettiğiniz problemli oturum numarasını yazmanız gerekir.

Dikkat Edilmesi Gerekenler:​

  • KILL komutu son çare olarak kullanılmalıdır.
  • Yanlış SPID sonlandırılırsa aktif çalışan farklı bir işlem etkilenebilir.
  • Sonlandırılan işlem büyük bir transaction içindeyse rollback süresi uzun olabilir.
  • Bu yöntem sorunu anlık olarak açabilir, ancak asıl sebep genelde uzun transaction, eksik index, kötü sorgu yapısı veya uygulama tarafında açık bırakılan işlemlerdir.
SQL Server'da yaşanan kitlenme ve tamamlanmayan işlem durumlarında, önce bloklama yapan oturumu doğru şekilde tespit etmek gerekir. sys.dm_exec_requests ve sp_who2 ile engelleyen SPID belirlendikten sonra, gerçekten gerekli görülürse KILL komutu ile müdahale edilerek bekleyen işlemlerin önü açılabilir.

Ancak bu yaklaşım kalıcı çözüm değil, daha çok hızlı müdahale yöntemidir. Sorun sık tekrar ediyorsa transaction yapıları, sorgu performansı ve index kullanımı ayrıca incelenmelidir.