Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Baza danych SQL w usłudze Microsoft Fabric
Jeśli masz istniejący skrypt śledzenia SQL, który chcesz przekonwertować na sesję zdarzeń rozszerzonych, możesz użyć procedur w tym temacie, aby utworzyć równoważną sesję zdarzeń rozszerzonych. Korzystając z informacji w tabelach systemowych trace_xe_action_map i trace_xe_event_map, można zebrać niezbędne dane do przeprowadzenia konwersji.
Kroki obejmują następujące czynności:
Wykonaj istniejący skrypt, aby utworzyć sesję śledzenia SQL, a następnie uzyskaj identyfikator śledzenia.
Uruchom zapytanie, które używa funkcji fn_trace_geteventinfo w celu znalezienia równoważnych zdarzeń rozszerzonych i akcji dla każdej klasy zdarzeń śledzenia SQL i skojarzonych kolumn.
Użyj funkcji fn_trace_getfilterinfo, aby wyświetlić listę filtrów oraz odpowiednich akcji dla Zdarzeń rozszerzonych do zastosowania.
Ręcznie utwórz sesję zdarzeń rozszerzonych przy użyciu równoważnych zdarzeń rozszerzonych, akcji i predykatów (filtrów).
Aby uzyskać identyfikator śledzenia
Otwórz skrypt śledzenia SQL w Edytorze zapytań, a następnie wykonaj skrypt, aby utworzyć sesję śledzenia. Pamiętaj, że sesja śledzenia nie musi być uruchomiona, aby wykonać tę procedurę.
Uzyskaj identyfikator śledzenia. W tym celu użyj następującego zapytania:
SELECT * FROM sys.traces; GOUwaga / Notatka
Identyfikator śledzenia 1 zwykle wskazuje domyślny ślad.
Aby określić odpowiedniki Rozszerzonych Zdarzeń
Aby określić równoważne zdarzenia rozszerzone i akcje, uruchom następujące zapytanie, w którym trace_id jest ustawiona na wartość identyfikatora śledzenia uzyskanego w poprzedniej procedurze.
Uwaga / Notatka
W tym przykładzie używany jest identyfikator śledzenia dla domyślnego śladu (1).
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;Zwracany jest równoważny identyfikator zdarzenia rozszerzonego, nazwa pakietu, nazwa zdarzenia, identyfikator kolumny i nazwa akcji. Tego wyniku użyjesz w procedurze "Tworzenie sesji zdarzeń rozszerzonych" w dalszej części tematu.
W niektórych przypadkach filtrowana kolumna jest mapowana na pole danych zdarzenia, które jest domyślnie uwzględniane w zdarzeniu Zdarzenia rozszerzone. W związku z tym kolumna "Extended_Events_action_name" będzie mieć wartość NULL. W takim przypadku należy wykonać następujące czynności, aby określić, które pole danych jest równoważne z filtrowaną kolumną:
W przypadku akcji, które zwracają wartość NULL, zidentyfikuj klasy zdarzeń śledzenia SQL w skrycie zawierającej filtrowaną kolumnę.
Na przykład, można było użyć klasy zdarzeń SP:StmtCompleted oraz określić filtr dla kolumny śladu Czas trwania (identyfikator klasy zdarzeń SQL Trace 45 oraz identyfikator kolumny śladu SQL Trace 13). W takim przypadku nazwa akcji będzie wyświetlana jako NULL w wynikach zapytania.
Dla każdej klasy zdarzeń śledzenia SQL zidentyfikowanych w poprzednim kroku znajdź równoważną nazwę zdarzenia rozszerzonego. (Jeśli nie masz pewności co do równoważnej nazwy zdarzenia, użyj zapytania w temacie Wyświetl rozszerzone zdarzenia równoważne klasom zdarzeń śledzenia SQL).
Użyj następującego zapytania, aby zidentyfikować poprawne pola danych do użycia dla zdarzeń zidentyfikowanych w poprzednim kroku. Zapytanie wyświetla pola danych Extended Events w kolumnie zatytułowanej "event_field". W zapytaniu zastąp <event_name> nazwą zdarzenia określonego w poprzednim kroku.
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>';Na przykład klasa zdarzeń SP:StmtCompleted odpowiada zdarzeniu Extended Events sp_statement_completed. Jeśli określisz sp_statement_completed jako nazwę zdarzenia w zapytaniu, w kolumnie "event_field" zostaną wyświetlone pola, które są domyślnie dołączone do zdarzenia. Patrząc na pola, widać, że istnieje pole "czas trwania". Aby utworzyć filtr w równoważnej sesji zdarzeń rozszerzonych, należy dodać predykat, taki jak "WHERE duration > 0". Aby zapoznać się z przykładem, zobacz procedurę "Aby utworzyć sesję Extended Events" w tym temacie.
Aby utworzyć sesję zdarzeń rozszerzonych
Użyj edytora zapytań, aby utworzyć sesję zdarzeń rozszerzonych i zapisać dane wyjściowe w obiekcie docelowym pliku. W poniższych krokach opisano pojedyncze zapytanie z wyjaśnieniami, aby pokazać, jak utworzyć zapytanie. Pełny przykład zapytania można znaleźć w sekcji "Przykład" tego tematu.
Dodaj instrukcje, aby utworzyć sesję zdarzeń, zastępując session_name nazwą, której chcesz użyć dla sesji zdarzeń rozszerzonych.
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;Dodaj zdarzenia i akcje Extended Events, które zostały zwrócone jako dane wyjściowe w procedurze "Określanie odpowiedników zdarzeń rozszerzonych", oraz dodaj predykaty (filtry), które zidentyfikowałeś w procedurze "Określanie filtrów użytych w skrypcie".
W poniższym przykładzie użyto skryptu śledzenia SQL, który zawiera klasy zdarzeń SQL:StmtStarting i SP:StmtCompleted z filtrami dla identyfikatora sesji i czasu trwania. Przykładowe dane wyjściowe zapytania w procedurze "Określanie odpowiedników zdarzeń rozszerzonych" zwróciły następujący zestaw wyników:
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_idAby przekonwertować je na odpowiednik zdarzeń rozszerzonych, dodawane są zdarzenia sqlserver.sp_statement_starting i sqlserver.sp_statement_completed z listą akcji. Wyrażenia predykatu są uwzględniane jako klauzule WHERE.
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 )Dodaj obiekt docelowy pliku asynchronicznego, zastępując ścieżki plików lokalizacją, w której chcesz zapisać dane wyjściowe. Podczas określania miejsca docelowego pliku należy dołączyć plik dziennika i plik ścieżki pliku metadanych.
ADD TARGET package0.asynchronous_file_target( SET filename='c:\temp\ExtendedEventsStoredProcs.xel', metadatafile='c:\temp\ExtendedEventsStoredProcs.xem');
Aby wyświetlić wyniki
Aby wyświetlić dane wyjściowe, możesz użyć funkcji sys.fn_xe_file_target_read_file. W tym celu uruchom następujące zapytanie, zastępując ścieżki plików określonymi ścieżkami:
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);Uwaga / Notatka
Rzutowanie danych zdarzenia jako XML jest opcjonalne.
Aby uzyskać więcej informacji na temat funkcji sys.fn_xe_file_target_read_file, zobacz 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');
Zobacz też
Wyświetlanie zdarzeń rozszerzonych równoważnych z klasami zdarzeń śledzenia SQL