MSSQL Server Extended Events Nedir ve Nasıl Oluşturulur

Bu makalede Extented Events nasıl oluşturulduğunu ele almış olacağız. Extented Events sql server’da profiler yapısının yerine gelmiş olan bir yapı olarak karşımıza çıkmaktadır. Profiler system’i anlık takip ederken Extented Events system’i geriden takip etmektedir. Bu sebeple Profiler büyük system’ler de sıkıntıya sebebiyet verirken Extented Events yapısı ile bu sorunun önüne geçmiş oluruz. İlerleyen SQL Server sürümlerinde SQL Server Profiler kaldırılacağı için Microsoft profiler aracı yerine Extended Events kullanılmasını öneriyor. Profiler yapısında önden filtreleme olmadığı için çalıştırılmaması gerekmektedir.

Bu yapı SSMS’de Management sekmesi altında bulunmaktadır.

Şimdi yapacağımız örnekle veritabanı üzerine belirli bir login üzerinden  connection gelip gelmediğini bulmuş olacağız. Şimdi uygulamalı bir şekilde yapacağımız işlemleri görelim.

Extented Events altında bulunan Sessions kısmına sağ tıklayıp New Session Wizard diyiyoruz.

Gelen ekranda Do not Show this page again  kısmını işaretleyip Next diyiyoruz. Bunu seçmemizin sebebi tekrardan bir Session oluşturacağımız zaman karşımıza gelmesini istemeyişimiz.

Gelen ekranda Session name kısmında bir isim veriyoruz. Schedule kısmında Start the event session at server startup. bölümünü seçmiyoruz. Sebebi ise server başladığında bu session’ın başlamasını istemiyoruz. Bu açıklamadan sonra Next deyip bir sonraki ekrana geçiyoruz.

Gelen ekranda Do not use template deyip bir sonraki ekrana geçiyoruz. Use this event session template kısmını seçerek hazır olan bir Template’de seçilip ilerlenebilir.

Gelen ekranda Event library kısmında completed yapısını yazıyorum. Gelen kütüphanelere tıklayıp  çerçeve içerisine alınmış OK butonu ile Selected events kısmına dahil ediyoruz.

Gerekli olan kütüphaneleri seçip Next diyiyorum. Hangi kütüphanenin ne işe yaradığına değinelim.

  • sp_statement_completed: Stored Procedure içerisindeki bir SQL statement’ın tamamlanması
  • rpc_completed: Bir Remote Procedure Call’un tamamlanması
  • sql_statement_completed: Bir T-SQL statement’ının tamamlanması
  • sql_batch_completed: Bir T-SQL batch’in tamamlanması

Bir önceki sayfada yapacağımız etkinlikler için hangi bilgileri almak istediğimizi seçiyoruz. Burası tamamen sizin ifadeler hakkında ne bilgi görmek istiyorsanız onu seçiyorsunuz. Seçimlerimiz yaptıktan sonra Next deyip bir sonraki aşamaya geçiyoruz.

Buraya kadar yapmış olduğumuz yapıda ne işlem yapacağımızı ve bu işlem sonucunda hangi bilgileri istediğimizi belirledik. Şimdi gelecek ekranda bu işlemi hangi veritabanı üzerinde yapmak istediğimizi belirlemiş olacağız.  Aşağıdaki ekranda Field kısmında istediğimiz filtrelemeyi seçebiliriz.

Database bağlantısı olup olmadığının kontrol işlemini yapmak için sqlserver.database_name field’ını seçiyorum. Operator kısmına like_i_sql_unicode_string yazıyoruz. Operator kısmına eşittir(=) ifadeside eklenebilir. Value kısmına hangi veritabanı üzerinde bu işlemi yapmak istiyorsak ilgili veritabanı yazılmaktadır. Hangi kullanıcının veritabanı bağlantısını takip etmek için ilgili login filtrelemeye dahil edilir. Aşağıdaki adımları yaptıktan sonra Next denilir.

Not: like operatörü metinleri karşılaştırmak için kullanılır. Büyük I harfi case-insensitive büyük küçük harfe duyarsız olduğu anlamına gelmektedir. SQL_UNICODE_STRING SQL’de Unicode karakter setini temsil eder, yani çok çeşitli dil ve karakterleri içerebilen bir veri tipini ifade eder. Unicode, farklı dillerdeki metinlerin doğru şekilde depolanmasını sağlar.

Gelen ekranda herhangi bir değişiklik yapmayıp Next deyip işlemlerimizi sonlandırıyoruz. Aşağıdaki bölümde analizi nasıl saklayacağımızı belirliyoruz. Analiz sonucunu daha sonra izlemek için bir dosyaya kaydedilebilir. Save data to.. kısmından kaydedeceğimiz dosya yolu ve boyutu belirlenebilir.

Yapmış olduğumuz tüm seçenekleri özet olarak bize sunan bu ekranın sağ altında Script butonu yardımı ile grafiksel ekranda yapmış olduğumuz bu işlemlerin t-sql sorgusunu alabiliriz. Finish deyip işlemler sonlandırılır.

En son adımda event session’umuzun başarıyla oluştuğu bilgisini veren bir ekran bizi karşılıyor. Bu ekranda bulunan Start the event session immediately after session creation seçeneğini işaretleyip event session’unumuzu başlatabiliriz. Manuel bir şekilde başlatmak için aşağıdaki resimde ilgili bölümleri seçmiyorum.

Management sekmesi altında oluşturduğumuz Sessions yapısına sağ tıklayıp Start Session diyiyoruz.

Daha sonra izleme işlemi yapmak için Watch Live Data diyiyoruz.

Başlangıç olarak herhangi bir bağlantı olmadığını görmüş olduk.

Field kısmında belirlemiş olduğumuz Deneme isminde login ile sql server’a  giriş yapalım.

23:23’te login olduktan  sonra tanımlamış olduğum Extented Event yapısına, veritabanının bağlantı sağlandığına dair bilgiler düşmeye başladı. Dikkat ederseniz zaman dilimi yukarıdaki resimle aynı.

Yukarıda görmüş olduğumuz yapıda veritabanına bağlantı olup olmadığını Extented Events yardımıyla öğrenebiliriz. Yukarıdaki örneğimize ek olarak yukarıda ilgili kullanıcı ile veritabanına gelen bağlantılardan 5 saniye üzeri olan sorguları görmek istiyorsak oluşturmuş olduğumuz Session üzerine sağ tıklayıp properties ekranından alt filtreleme yapabiliriz. Bu yapıyı normal Session oluştururken yapamayız.

Gelen ekranda Events bölümüne girilir. Bu bölümde Configure kısmına tıklanır.

Gelen ekranda seçilen her Event için bir filtreleme yapılır. Sırasıyla sol tarafta bulunan 4 tane Event için aynı filtreleme işlemi yapılmaktadır.

Yukarıdaki yapmış olduğumuz filtreleme ile  uzun süren sorguları bulabilmekteyiz.

  • Bir başka örneğimizde online indexs rebuild işlemi event library kısmında aşağıdaki yapının seçilmesi gereklidir. 

Oluşturduktan sonra Watch Live Date dedikten sonra Details kısmında kaçıncı satırın insert edildiğini görebiliriz. Daha sonra sp_spaceused ‘tabloname’ bu yapı ile genel olarak Rows sayısı bulunup tahmin edilir.

Not: İlk örnek hariç yukarıdaki görmüş olduğumuz diğer örnekler veritabanı.gen.tr den alınmış. Yapıyı anlamam ve sonraki okumalarımda bana fayda sağlayacağı için alt kısmına ekleme gereği duyuyorum. Bu sayfayı kurma amacım kendime not çıkarmak ve notlarımı da sizlerle paylaşıyorum.

Bir  başka örnekte ise veritabanını kullanan login veritabanında sorun yaşadığını sürekli hata mesajı aldığını söyler. Veritabanımızda herhangi bir sorun yoksa ve kullanıcı  sorun almaya devam ettiklerini beyan ederler. Bunun için oluşturulan extented event kısmında aşağıdaki event seçilmektedir.

İlgili  error_reported Event’ı seçildikten sonra veritabanımız ve hata almış oldukları kullanıcı seçilmektedir.

İlgili session oluşturulduktan sonra izlenir. Details kısmında bulunan message bölümünde hata mesajını görmekteyiz.

  • Bir başka örneğimizde ise 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ı yakalayabiliriz.

xml_deadlock_report seçildikten sonra filtreleme ekranından ilgili veritabanımız seçilmesi gerekmektedir.

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.

  •  Başka bir örnek ise Timeout’a düşen sorgulara görmek için event library kısmında  attention yapısı seçilmektedir. Attention İptal edilen sorgu ya da timeout nedeniyle kopan database bağlantıları için kullanılmaktadır.
  • Bir başka örneğimizde Extended Events özelliğini kullanarak bir veri tabanındaki sorgularımızın Execution planlarının loglanmasını yapmış olalım. Event library kısmında query_post_exe ifadesini yazıp çerçeve içerisine alımış ifadesiyle selected events kısmına atıyoruz.

İlgili event’ın alt kısmında bu event ile ilgili açıklamayı görmekteyiz.

İşlemleri tamamladıktan sonra execution plan yapılarımızı görebiliriz. Ayrıca bu plan yapımızı oluştururken aynı zamanda duration-cpu-veritabanı adı-kullanıcı adı kısıtlamalar sağlayabiliriz.

SSMS üzerinde Watch Live Data seçeneğine tıkladığımızda SQL Server Management Studio içinde aşağıdaki gibi bir ekran açılacaktır. Bu ekranda ilgili Event için tüm detaylı bilgiye erişebiliriz.

Yukarıdaki resimde görüldüğü üzere seçtiğimiz Event ile ilgili detaylı bilgiye erişebiliriz. Ayrıca aynı penceredeki Query Plan sekmesine geçerek de sorgumuzun Execution Planını grafiksel olarak aşağıdaki gibi görebiliriz.

Son olarak herhangi bir veritabanına sadece yapılan insert update delete ifadeleri görmek için aşağıdaki kod bloğu kullanılmaktadır. Başlangıçta and ifadesi olmasa tüm veritabanları için insert update delete sonucu dönmektedir. Dikkat edilmesi gerekmektedir.


CREATE EVENT SESSION [extent_name8] ON SERVER 
ADD EVENT sqlserver.sql_statement_completed(
    SET collect_statement=(0)
    ACTION (
        sqlserver.client_hostname,
        sqlserver.database_id,
        sqlserver.database_name,
        sqlserver.sql_text,
        sqlserver.username
    )
    WHERE (
        [sqlserver].[like_i_sql_unicode_string]([sqlserver].[database_name], N'Veritabanı_Adi')
        AND (
            [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text], N'%INSERT%')
            OR [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text], N'%UPDATE%')
            OR [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text], N'%DELETE%')
        )
    )
)

Farklı bir event eklenecekse alt alta eklenmektedir. Ornek vermek gerekırse sql_batch_completed gibi

CREATE EVENT SESSION [extent_name8] ON SERVER 
ADD EVENT sqlserver.sql_statement_completed(
    SET collect_statement=(0)
    ACTION (
        sqlserver.client_hostname,
        sqlserver.database_id,
        sqlserver.database_name,
        sqlserver.sql_text,
        sqlserver.username
    )
    WHERE (
        [sqlserver].[like_i_sql_unicode_string]([sqlserver].[database_name], N'Veritabanı_Adi')
        AND (
            [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text], N'%INSERT%')
            OR [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text], N'%UPDATE%')
            OR [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text], N'%DELETE%')
        )
    )
),-- ADD EVENTler virgül ile birbirlerinden ayrılması gerekmektedir.
ADD EVENT sqlserver.sql_batch_completed(
    ACTION (
        sqlserver.client_hostname,
        sqlserver.database_id,
        sqlserver.database_name,
        sqlserver.sql_text,
        sqlserver.username
    )
    WHERE (
        [sqlserver].[like_i_sql_unicode_string]([sqlserver].[database_name], N'Veritabanı_Adi')
        AND (
            [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text], N'%INSERT%')
            OR [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text], N'%UPDATE%')
            OR [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text], N'%DELETE%')
        )
    )
)

Oluşturulan extended events üzerinde filtreleme işlemi yapılması isteniyorsa aşağıdaki resimdeki ilgili bölüme tıklanmaktadır.

Açılan extented event yapımızı bir dosya yoluna kaydetmek istiyorsak extended event yapısına sağ tıklayıp properties ekranından dosya uzantısı belirlenebilir. Ya da yapı oluşturulurken dosya yolunun belirtilmesi gerekmektedir.

Bu makalede Extented Events yapısını görmüş olduk. Başka bir makalede görüşmek dileğiyle.

Onlar “Boş Şeylerden Tümüyle Yüz Çeviriler. ” Mü’minun-3

Author: Yunus YÜCEL

Bir yanıt yazın

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