Aracılığıyla paylaş


Mevcut SQL İzleme Betiğini Genişletilmiş Olaylar Oturumuna Dönüştürme

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL veritabanı

Genişletilmiş Olaylar oturumuna dönüştürmek istediğiniz bir SQL İzleme betiğiniz varsa, eşdeğer bir Genişletilmiş Olaylar oturumu oluşturmak için bu konudaki yordamları kullanabilirsiniz. trace_xe_action_map ve trace_xe_event_map sistem tablolarındaki bilgileri kullanarak, dönüştürmeyi yapmak için gereken bilgileri toplayabilirsiniz.

Adımlar şunlardır:

  1. SQL İzleme oturumu oluşturmak için mevcut betiği çalıştırın ve ardından izlemenin kimliğini alın.

  2. Her SQL İzleme olay sınıfı ve ilişkili sütunları için eşdeğer Genişletilmiş Olaylar olaylarını ve eylemlerini bulmak için fn_trace_geteventinfo işlevini kullanan bir sorgu çalıştırın.

  3. Kullanılacak filtreleri ve eşdeğer Genişletilmiş Olaylar eylemlerini listelemek için fn_trace_getfilterinfo işlevini kullanın.

  4. Eşdeğer Genişletilmiş Olaylar olaylarını, eylemlerini ve koşullarını (filtreler) kullanarak el ile Genişletilmiş Olaylar oturumu oluşturun.

Trace ID'i elde etmek için

  1. SQL İzleme betiğini Sorgu Düzenleyicisi'nde açın ve izleme oturumunu oluşturmak için betiği çalıştırın. Bu yordamı tamamlamak için izleme oturumunun çalışıyor olması gerekmediğini unutmayın.

  2. İzlemenin kimliğini alın. Bunu yapmak için aşağıdaki sorguyu kullanın:

    SELECT * FROM sys.traces;  
    GO  
    

    Uyarı

    İzleme Kimliği 1 genellikle varsayılan izlemeyi gösterir.

Genişletilmiş Etkinlikler eşdeğerlerini belirlemek için

  1. Eşdeğer Genişletilmiş Olaylar olaylarını ve eylemlerini belirlemek için aşağıdaki sorguyu çalıştırın; burada trace_id önceki yordamda aldığınız izleme kimliğinin değerine ayarlanır.

    Uyarı

    Bu örnekte, varsayılan izleme (1) için izleme kimliği kullanılır.

    USE MASTER;  
    GO  
    DECLARE @trace_id int;  
    SET @trace_id = 1;  
    SELECT DISTINCT el.eventid, em.package_name, em.xe_event_name AS 'event'  
       , el.columnid, ec.xe_action_name AS 'action'  
    FROM (sys.fn_trace_geteventinfo(@trace_id) AS el  
       LEFT OUTER JOIN sys.trace_xe_event_map AS em  
          ON el.eventid = em.trace_event_id)  
    LEFT OUTER JOIN sys.trace_xe_action_map AS ec  
       ON el.columnid = ec.trace_column_id  
    WHERE em.xe_event_name IS NOT NULL AND ec.xe_action_name IS NOT NULL;  
    

    Eşdeğer Genişletilmiş Olaylar olay kimliği, paket adı, olay adı, sütun kimliği ve eylem adı döndürülür. Bu çıkışı, bu konunun ilerleyen bölümlerinde yer alan "Genişletilmiş Olaylar oturumunu oluşturmak için" yordamında kullanacaksınız.

    Bazı durumlarda, filtrelenen sütun, varsayılan olarak Genişletilmiş Olaylar'a dahil edilen bir olay veri alanıyla eşleştirilir. Bu nedenle, "Extended_Events_action_name" sütunu NULL olur. Bu durumda, hangi veri alanının filtrelenmiş sütuna eşdeğer olduğunu belirlemek için aşağıdakileri yapmanız gerekir:

    1. NULL döndüren eylemler için betikteki hangi SQL İzleme olay sınıflarının filtrelenen sütunu içerdiğini belirleyin.

      Örneğin, SP:StmtCompleted olay sınıfını kullanmış ve Süre izleme sütun adında bir filtre belirtmiş olabilirsiniz (SQL İzleme olay sınıfı kimliği 45 ve SQL İzleme sütun kimliği 13). Bu durumda, eylem adı sorgu sonuçlarında NULL olarak görünür.

    2. Önceki adımda tanımladığınız her SQL İzleme olay sınıfı için eşdeğer Genişletilmiş Olaylar olay adını bulun. (Eşdeğer olay adından emin değilseniz, SQL İzleme Olay Sınıflarına Eşdeğer Genişletilmiş Olayları Görüntüleme başlığındaki sorguyu kullanın.)

    3. Önceki adımda tanımladığınız olaylar için kullanılacak doğru veri alanlarını belirlemek için aşağıdaki sorguyu kullanın. Sorgu, "event_field" sütunundaki Genişletilmiş Olaylar veri alanlarını gösterir. Sorguda, event_name< değerini önceki adımda belirttiğiniz olayın adıyla değiştirin>.

      SELECT xp.name package_name, xe.name event_name  
         ,xc.name event_field, xc.description  
      FROM sys.trace_xe_event_map AS em  
      INNER JOIN sys.dm_xe_objects AS xe  
         ON em.xe_event_name = xe.name  
      INNER JOIN sys.dm_xe_packages AS xp  
         ON xe.package_guid = xp.guid AND em.package_name = xp.name  
      INNER JOIN sys.dm_xe_object_columns AS xc  
         ON xe.name = xc.object_name  
      WHERE xe.object_type = 'event' AND xc.column_type <> 'readonly'  
         AND em.xe_event_name = '<event_name>';  
      

      Örneğin, SP:StmtCompleted olay sınıfı, sp_statement_completed Genişletilmiş Etkinlikler olayıyla eşleşir. Sorguda olay adı olarak sp_statement_completed belirtirseniz, "event_field" sütunu varsayılan olarak olaya dahil edilen alanları gösterir. Alanlara baktığınızda bir "süre" alanı olduğunu görebilirsiniz. Filtreyi eşdeğer Genişletilmiş Olaylar oturumunda oluşturmak için "WHERE duration > 0" gibi bir koşul ekleyebilirsiniz. Örneğin, bu konudaki "Extended Events oturumunu oluşturma" yordamına bakın.

Genişletilmiş Olaylar oturumu oluşturmak için

Genişletilmiş Olaylar oturumu oluşturmak ve çıkışı bir dosya hedefine yazmak için Sorgu Düzenleyicisi'ni kullanın. Aşağıdaki adımlar, sorgunun nasıl oluşturulacağını gösteren açıklamalar içeren tek bir sorguyu açıklar. Tam sorgu örneği için bu konunun "Örnek" bölümüne bakın.

  1. Olay oturumunu oluşturmak için deyimler ekleyin ve session_name yerine Genişletilmiş Olaylar oturumu için kullanmak istediğiniz adı yazın.

    IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='session_name')  
       DROP EVENT SESSION [Session_Name] ON SERVER;  
    CREATE EVENT SESSION [Session_Name]  
    ON SERVER;  
    
  2. "Genişletilmiş Olaylar eşdeğerlerini belirleme" yordamında çıkış olarak döndürülen Genişletilmiş Olaylar olaylarını ve eylemlerini ekleyin ve "Betikte kullanılan filtreleri belirlemek için" yordamında tanımladığınız önkoşulları (filtreleri) ekleyin.

    Aşağıdaki örnekte, oturum kimliği ve süresi için filtreler içeren SQL:StmtStarting ve SP:StmtCompleted olay sınıflarını içeren bir SQL İzleme betiği kullanılır. "Genişletilmiş Olaylar eşdeğerlerini belirleme" yordamındaki sorgu için örnek çıktı aşağıdaki sonuç kümesini döndürdü:

    Eventid  package_name  event                   columnid  action  
    44       sqlserver     sp_statement_starting   6         nt_username  
    44       sqlserver     sp_statement_starting   9         client_pid  
    44       sqlserver     sp_statement_starting   10        client_app_name  
    44       sqlserver     sp_statement_starting   11        server_principal_name  
    44       sqlserver     sp_statement_starting   12        session_id  
    45       sqlserver     sp_statement_completed  6         nt_username  
    45       sqlserver     sp_statement_completed  9         client_pid  
    45       sqlserver     sp_statement_completed  10        client_app_name  
    45       sqlserver     sp_statement_completed  11        server_principal_name  
    45       sqlserver     sp_statement_completed  12        session_id  
    

    Bunu Genişletilmiş Olaylar eşdeğerine dönüştürmek için, sqlserver.sp_statement_starting ve sqlserver.sp_statement_completed olayları bir eylem listesiyle eklenir. Koşul deyimleri WHERE yan tümceleri olarak eklenir.

    ADD EVENT sqlserver.sp_statement_starting  
       (ACTION  
          (  
          sqlserver.nt_username,  
          sqlserver.client_pid,  
          sqlserver.client_app_name,  
          sqlserver.server_principal_name,  
          sqlserver.session_id  
          )  
       WHERE sqlserver.session_id = 59   
       ),  
    
    ADD EVENT sqlserver.sp_statement_completed  
       (ACTION  
          (  
          sqlserver.nt_username,  
          sqlserver.client_pid,  
          sqlserver.client_app_name,  
          sqlserver.server_principal_name,  
          sqlserver.session_id  
          )  
       WHERE sqlserver.session_id = 59 AND duration > 0  
       )  
    
  3. Zaman uyumsuz dosya hedefini ekleyin ve dosya yollarını çıkışı kaydetmek istediğiniz konumla değiştirin. Dosya hedefini belirtirken, bir günlük dosyası ve meta veri dosyası yolu eklemeniz gerekir.

    ADD TARGET package0.asynchronous_file_target(  
       SET filename='c:\temp\ExtendedEventsStoredProcs.xel', metadatafile='c:\temp\ExtendedEventsStoredProcs.xem');  
    

Sonuçları görüntülemek için

  1. Çıkışı görüntülemek için sys.fn_xe_file_target_read_file işlevini kullanabilirsiniz. Bunu yapmak için, dosya yollarını belirttiğiniz yollarla değiştirerek aşağıdaki sorguyu çalıştırın:

    SELECT *, CAST(event_data as XML) AS 'event_data_XML'  
    FROM sys.fn_xe_file_target_read_file('c:\temp\ExtendedEventsStoredProcs*.xel', 'c:\temp\ExtendedEventsStoredProcs*.xem', NULL, NULL);  
    
    

    Uyarı

    Olay verilerini XML olarak dönüştürmek isteğe bağlıdır.

    sys.fn_xe_file_target_read_file işlevi hakkında daha fazla bilgi için bkz. sys.fn_xe_file_target_read_file (Transact-SQL).

    IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='session_name')  
       DROP EVENT SESSION [session_name] ON SERVER;  
    CREATE EVENT SESSION [session_name]  
    ON SERVER  
    
    ADD EVENT sqlserver.sp_statement_starting  
       (ACTION  
       (  
          sqlserver.nt_username,  
          sqlserver.client_pid,  
          sqlserver.client_app_name,  
          sqlserver.server_principal_name,  
          sqlserver.session_id  
       )  
       WHERE sqlserver.session_id = 59   
       ),  
    
    ADD EVENT sqlserver.sp_statement_completed  
       (ACTION  
       (  
          sqlserver.nt_username,  
          sqlserver.client_pid,  
          sqlserver.client_app_name,  
          sqlserver.server_principal_name,  
          sqlserver.session_id  
       )  
       WHERE sqlserver.session_id = 59 AND duration > 0  
       );  
    
    ADD TARGET package0.asynchronous_file_target  
       (SET filename='c:\temp\ExtendedEventsStoredProcs.xel', metadatafile='c:\temp\ExtendedEventsStoredProcs.xem');  
    

Example

IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='session_name')  
   DROP EVENT SESSION [session_name] ON SERVER;  
CREATE EVENT SESSION [session_name]  
ON SERVER  
  
ADD EVENT sqlserver.sp_statement_starting  
   (ACTION  
   (  
      sqlserver.nt_username,  
      sqlserver.client_pid,  
      sqlserver.client_app_name,  
      sqlserver.server_principal_name,  
      sqlserver.session_id  
   )  
   WHERE sqlserver.session_id = 59   
   ),  
  
ADD EVENT sqlserver.sp_statement_completed  
   (ACTION  
   (  
      sqlserver.nt_username,  
      sqlserver.client_pid,  
      sqlserver.client_app_name,  
      sqlserver.server_principal_name,  
      sqlserver.session_id  
   )  
   WHERE sqlserver.session_id = 59 AND duration > 0  
   )  
  
ADD TARGET package0.asynchronous_file_target  
   (SET filename='c:\temp\ExtendedEventsStoredProcs.xel', metadatafile='c:\temp\ExtendedEventsStoredProcs.xem');  

Ayrıca Bkz.

SQL İzleme Olay Sınıflarına Eşdeğer Genişletilmiş Olayları Görüntüleme