MSSQL Server Session Kill Edilirken ‘ Only user processescan be killed’ Hatası

Bu makalede mssql server üzerinde bir session kill edilmek istendiğinde ilgili session kill edilemeyeceğine dair Only user processes can be killed hatası alınmış oldu.

Yukarıdaki resimlerden bu işlemin hangi veritabanının ve hangi tablo yapısının engellediğini görmüş olacağız.

USE DBNAME;
GO
SELECT 
    OBJECT_NAME(279724099) AS TableName;

Aşağıdaki komut ile hangi veritabanı üzerinde bu işlemin gerçekleştiğini görebiliriz.

Başlangıçta tabloyla almış olduğumuz object_id değeriyle tablo üzerinde hangi index yapısının olduğunu görmekteyiz.

SELECT
i.name AS IndexName,
i.type_desc
FROM sys.indexes i
WHERE i.object_id = 279724099
AND i.index_id = 31;

İlgili session yapısının bekleme türü görülmektedir.

Bu hata mesajını veya ilgili session yapısını kill ettiğimde 103 SPID’li session bir SYSTEM session olduğunu bu neden kill edilirken Only user processes can be killed hata mesajını döndüğü görülmektedir.

SELECT session_id, is_user_process
FROM sys.dm_exec_sessions
WHERE session_id = 103;

is_user_process = 0 → kill yok, konu kapanır.

LCK_M_SCH_M = Schema Modification Lock (ALTER, index rebuild, internal metadata işlemi vb.) TAB lock → tablo seviyesinde kilit oluşturur. Bu kilit herkesi bloklamaktadır.

wait_resource = TAB:14:279724099:31

Burada:
• 14 → database_id
• 279724099 → object_id
• 31 → index_id

Yani bu session:
• Ya DDL
• Ya index maintenance
• Ya da backup / checkpoint / recovery ile ilişkili bir internal işlem

Bu session kill edilemez. SYSTEM session, internal schema lock almış ve cleanup/rollback yapıyor.

SYSTEM session kill edilemez ama blokladığı user’ları görebiliriz:

SELECT
r.session_id,
r.blocking_session_id,
s.login_name,
s.host_name,
r.status,
r.wait_type
FROM sys.dm_exec_requests r
JOIN sys.dm_exec_sessions s
ON r.session_id = s.session_id
WHERE r.blocking_session_id = 103;

Burada çıkan user session’ları gerekirse kill edilebilir.

SYSTEM session’a direkt SQL text bakamayız ama wait hareketi var mı görebiliriz:

SELECT
wait_type,
wait_duration_ms
FROM sys.dm_os_waiting_tasks
WHERE session_id = 103;

wait_duration_ms artıyorsa → çalışıyor
Sabit duruyorsa → I/O kilitlenmiş olabilir

Kendi sistemimizde 103 numaralı session değerinin kill edilememesinin sebebi dbcc checkdb komutunun çalışmasından dolayıdır. LCK_M_SCH_M ifadesini gördükten sonra sisteminizi yorumlayarak hangi işlemin tabloyu locklayacağını yorumlayabilirsiniz.

Başka makalede görüşmek dileğiyle..

Aldatma, İslam ahlâkıyla bağdaşmaz; dürüstlük esastır.(Hadis)

Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir