Stronger_Cracker
- 25 Tem 2022
- 6,403 Mesaj
Aktiflik
Seviye
Deneyim
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:
Bu sorgu ile:
Burada özellikle şu alanlar faydalı oluyor:
Gerekirse problemli oturumu sonlandırma:
Burada 300 örnek bir SPID değeridir. Kendi tespit ettiğiniz problemli oturum numarasını yazmanız gerekir.
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.
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.
SQL:
EXEC sp_who2;
- SPID: Oturum kimliği
- Status: Oturumun mevcut durumu
- BlkBy: Bu oturum başka bir oturum tarafından engelleniyorsa, engelleyen SPID bilgisi
Gerekirse problemli oturumu sonlandırma:
Kod:
KILL 300;
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.
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.
