Sepetiniz

Extended Events Kullanarak DeadLock’a Düşen Sorguları Yakalamak

Uygulamacılar bazen deadlock hatası alırlar ve hangi sorgularda bu hatayı aldıklarını göremezler. Bu yüzden veritabanında deadlock hatası alıyoruz diyerek kapınızı çalabilirler. Böyle bir durumda Extended Events ya da SQL Server Profiler kullanarak deadlock’a düşen sorguları yakayalayabiliriz.

 

DeadLock Nedir sorusunun cevabını “SQL Server’da DeadLock Nedir?” isimli makalemde bulabilirsiniz.

 

Extended Event kullanarak DeadLock’a düşen sorguları yakalayalım:

 

SSMS üzerinde Managements’ın altında Extended Events altındaki Session’a sağ tıklayarak New Session Wizard Diyoruz.

Bir sonraki gelen ekranda Do not show this page again’i tıklayarak next diyoruz.

 

Bir sonraki gelen ekranda Session name kısmına DeadLock yazıyorum Start the event session at server startup’ı seçmiyorum. Çünkü server başladığında bu session’ın otomatik olarak başlamasını istemiyorum.

Bir sonraki ekranda Do not use template diyerek next diyorum.

 

Bir sonraki ekranda aşağıda görüldüğü gibi Event Library kısmına deadlock yazıyorum ve deadlock ile ilgili eventlar hemen altında listeleniyor.

Ben grafiksel bir şekilde görmek için sadece xml deadlock report’a 2 kere tıklıyorum ve next diyorum.

 

Bir sonraki ekranda aşağıdaki seçenekleri seçiyorum.

 

Client hostname

Client app name

Database name

Sql text

User name

 

Bir sonraki ekranda aşağıdaki gibi filter koyabilirsiniz. Ya da oluşturduktan sonra da session üzerinde sağ tıklayıp properties’den Events’a gelip Configure diyerek filtre koyabilirsiniz.

 

 

Daha sonraki ekranlarda next next finish diyerek işlemi tamamlıyoruz ve oluşan session’ın üzerine gelip aşağıdaki gibi start ediyoruz.

Session üzerinde watch live data dediğimizde karşımıza aşağıdaki gibi bir ekran gelecektir.

Details kısmından xml_report’ a çift tıklayınca hangi sorgunun hangi sorguyu deadlock’a düşürdüğünü görebiliriz. <victim-list> teki process kurban olarak seçilen process’tir.

 

DeadLock kısmında karşımıza aşağıdaki gibi bir ekran gelecektir. Üzerinde X işareti olan transaction kurban olarak seçilen transactiondır. Diğer ise yoluna devam eden transaction. Bu daire içine alınmış transaction’ların üzerine geldiğinizde ilgili sorgu görünecektir.

Yazılımda oluşan hataların Extended Events ile detaylarının izlenmesi

Veritabanında bir hata olduğu zaman genellikle ilk bakacağımız yer SQL Server Error Log’dur. Bazen veritabanı ile ilgili bir sıkıntı olmaz ama uygulama yine de hata verir. Uygulamacılar hatanın nedenini bulamazlar. Böyle bir durumda sizden yardım isteyebilirler. Örneğin veritabanına kayıt ekleyemiyorum gibi bir neden ile.. Böyle bir durumda uygulamacıya hangi login ile bu hatayı aldığını sormalısınız. Daha sonrada SQL Server Extended Events’i kullanarak bu login ile ilgili alınan hataları monitor edebilirsiniz.

 

Bir örnek yaparak bu işlemi gerçekleştirelim. TestLogin isimli bir loginimiz olsun. SSMS(SQL Server Management Studio) üzerinde Management->Extended Events sekmelerini kullanarak aşağıdaki gibi yeni bir Extended Event Session’ı oluşturuyoruz.

 

 

Bir sonraki ekranda Do not show this page again’i seçip next diyoruz.

 

 

Bir sonraki ekranda Session name kısmında oluşturacağımız Extended Event Session’ına bir isim veriyoruz.  Start the event session at server startup’a tıklayarak server açıldığında bu session’ın açılmasını sağlayabilirsiniz. Ben bu session’ı genelde özel olarak hata durumunda açtığım için bu seçeneği seçmiyorum.

Bir sonraki ekranda session’ı oluşturmak için hazır bir template kullanıp kullanmak istemediğimizi soruyor. Ben bu işlem için herhangi bir template kullanmayacağım. Bu yüzden Do not use a template’i seçerek next diyorum. Sitemizin arama kısmına Extended Events yazarak daha detaylı bilgi bulabilirsiniz.

Bir sonraki ekranda Event Library yazan yerin altına error_reported yazıyoruz ve aşağıdaki resimde sarı ile çıkan error_reported’a iki kere tıklayarak seçiyoruz ve next diyerek ilerliyoruz.

 

 

Bir sonraki ekranda hata ile ilgili hangi parametreleri yakalamak istediğimizi soruyor. Ben bu işlem için aşağıdaki seçimleri yapıyorum.

 

 

Bu seçimlerden benim için en önemli olanları sql_text,username.

 

Bir sonraki ekranda filtreleme yapacağız. Filtreleme yapmazsak bu Extended Events Session’ı tanımladığımız tüm instance üzerindeki hataları izliyor oluruz. Aşağıdaki gibi filtreleme yaparak sadece TestLogin’in gönderdiği sorguların aldığı hataları yakalayabiliriz.

 

 

Next Finish diyerek kurulumu tamamlıyoruz. Kurulum tamamlandıktan sonra aşağıdaki gibi session’ımızı başlatıyoruz.

 

 

Kullanmadığınız zamanlarda session’ı kapalı tutmanızı tavsiye ederim. Start işlemi gerçekleştikten sonra session üzerinde sağ tıklayıp aşağıdaki gibi Watch Live Data diyoruz ve aşağıdaki gibi bir ekran açılıyor.

 

 

Örneğin yukarıdaki ekranda görünen hatayı şöyle yorumlayabiliriz. Sql_text kısmında yazan sorgu TestLogin tarafından gönderilen ve hata alan sorgu. Message kısmında yazan şey ise sorgunun neden hata aldığı. Uygulamacıyı bu şekilde bilgilendirebilirsiniz.

 

Extended Events ile Timeout’a Düşen Sorguları Belirlemek

Timeout’a düşen sorguları SQL Server Extended Events Session’ı kullanarak belirleyebiliriz.

 

SSMS üzerinde Management->Extendend Event->Sessions’a sağ tıklayarak new session wizard’ı seçiyoruz. İlk sayfada next diyerek 2. sayfada Session’ımıza bir isim veriyoruz. Don use template diyerek next diyoruz. Açılan sayfada Event Library kısmına attention yazıyoruz ve aşağıda çıkan attention’a tıklayarak sağ taraftaki ok yardımıyla izleyeceklerimiz arasına alıyoruz.

Next diyerek ilerliyoruz.

 

Açılan sayfayada timeout’a düşen sorguların hangi değerlerini yakalayacağımızı seçiyoruz. Örneğin login name, text vb..

 

Description kısmında alanların açıklamaları olduğu için kolayca istediğiniz alanları belirleyebilirsiniz.

 

Benim timeout için seçtiğim alanlar şu şekilde:

 

client_hostname,

Database_name,

İs_system,

Sql_text,

Username

 

Yine next diyerek geçiyoruz.

 

Aşağıdaki ekrandaki gibi filtreleme yapıyoruz. Biz denemeUser sql login’i ile gelen ve timeout’a düşen sorguları tespit etmek istedik.

 

 

Next, Next ve Finish diyerek Extended Events Session’ımızı oluşturmuş oluyoruz.

 

SSMS üzerinde Management->Extended Events->Sessions ‘ın altında oluşan Timeout Session’ına sağ tıklayarak Start diyoruz ve hemen ardından yine sağ tıklayarak Watch live data diyoruz. Artık denemeUser ile gelen ve time out alan tüm sorgular buraya düşecektir.