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
W tym artykule wyjaśniono, kiedy i jak używać obiektów docelowych zdarzeń rozszerzonych. W przypadku każdego elementu docelowego w artykule opisano:
- Jego możliwości zbierania i raportowania danych zdarzeń
- Przykłady sesji zdarzeń korzystających z obiektu docelowego
W poniższej tabeli opisano dostępność każdego typu docelowego na różnych platformach SQL.
| Typ docelowy | SQL Server | Usługa Azure SQL Database i baza danych SQL w Fabric | Azure SQL Managed Instance |
|---|---|---|---|
| plik_wydarzenia | Tak | Tak | Tak |
| pierścieniowy bufor | Tak | Tak | Tak |
| event_stream | Tak | Tak | Tak |
| histogram | Tak | Tak | Tak |
| licznik_zdarzeń | Tak | Tak | Tak |
| dopasowywanie_par | Tak | Nie. | Nie. |
| etw_classic_sync_target | Tak | Nie. | Nie. |
O ile nie określono inaczej, obiekty docelowe przetwarzają dane odbierane asynchronicznie.
Aby jak najlepiej wykorzystać ten artykuł, należy wykonać następujące elementy:
- Zapoznaj się z podstawami zdarzeń rozszerzonych, zgodnie z opisem w przewodniku Szybki start: zdarzenia rozszerzone.
- Użyj najnowszej wersji programu SQL Server Management Studio (SSMS).
cel pliku zdarzeń
Obiekt event_file docelowy zapisuje wyjściowe dane z sesji zdarzenia z buforów pamięci do pliku na dysku lub do obiektu blob w usłudze Azure Storage.
Określasz parametr
filenamew klauzuliADD TARGET. Rozszerzenie pliku musi mieć wartośćxel.Wybrana nazwa pliku jest używana przez system jako prefiks, do którego jest dołączana wartość liczbowa oparta na dacie i godzinie, a następnie
xelrozszerzenie.Opcjonalnie można określić
MAX_FILE_SIZEparametr . Definiuje maksymalny rozmiar w megabajtach (MB), do którego plik może rosnąć przed utworzeniem nowego pliku.Opcjonalnie można określić
MAX_ROLLOVER_FILESopcję, aby wybrać maksymalną liczbę plików do zachowania w systemie plików oprócz bieżącego pliku. Domyślna wartość toUNLIMITED. Po ocenieMAX_ROLLOVER_FILES, jeśli liczba plików przekracza ustawioną wartośćMAX_ROLLOVER_FILES, starsze pliki zostaną usunięte.
Ważne
W zależności od zdarzeń dodanych do sesji pliki generowane przez event_file obiekt docelowy mogą zawierać poufne dane. Uważnie przejrzyj system plików oraz uprawnienia do udostępniania w katalogu i dla poszczególnych plików .xel, w tym dostęp dziedziczony, aby uniknąć niepotrzebnego nadawania dostępu do odczytu. Przestrzegaj zasady najniższych uprawnień. Aby zmniejszyć ryzyko nieumyślnego gromadzenia poufnych danych, należy unikać długotrwałych sesji zdarzeń, które mogą takie dane zbierać.
Uwaga / Notatka
Usługi Azure SQL Database i Azure SQL Managed Instance obsługują jako wartość parametru wyłącznie obiekty blob w platformie filename. Aby zapoznać się z event_file przykładem kodu dla usługi Azure SQL Database, bazy danych SQL w sieci szkieletowej lub usługi Azure SQL Managed Instance, zobacz Tworzenie sesji zdarzeń z obiektem docelowym event_file w usłudze Azure Storage.
Utwórz sesję zdarzeń z docelowym event_file w systemie plików lokalnych
Aby zapoznać się z przewodnikiem tworzenia sesji zdarzeń przy użyciu event_file magazynu plików lokalnych z programem SSMS lub T-SQL, zobacz Szybki start: zdarzenia rozszerzone.
Tworzenie sesji zdarzeń z obiektem docelowym event_file w usłudze Azure Storage
Aby uzyskać szczegółowy opis sposobu tworzenia konta magazynu w usłudze Azure Storage, zobacz Tworzenie konta magazynu. Konto magazynu można utworzyć za pomocą portalu Azure, programu PowerShell, usługi Azure SQL, szablonu ARM lub szablonu Bicep. Użyj konta, które:
- Jest kontem
Standard general-purpose v2. - Używa warstwy
Hotdostępu do obiektu blob. - W przypadku korzystania z SQL Server na maszynie wirtualnej Azure, konto magazynowe powinno znajdować się w tym samym regionie Azure, co maszyna wirtualna.
- Nie ma włączonej hierarchicznej przestrzeni nazw .
Następnie utwórz kontener na tym koncie magazynowym przy użyciu Azure Portal. Kontener można również utworzyć przy użyciu programu PowerShell lub interfejsu wiersza polecenia platformy Azure.
Zanotuj nazwy utworzonego konta magazynu i kontenera . Są one używane w poniższych krokach.
Aby odczytywać i zapisywać dane zdarzeń, aparat bazy danych wymaga określonego dostępu. Dostęp ten jest udzielany inaczej w zależności od wybranego typu uwierzytelniania: tożsamości zarządzanej lub uwierzytelniania opartego na wpisach tajnych przy użyciu tokenu sygnatury dostępu współdzielonego (SAS).
Aby uwierzytelnić się w usłudze Azure Storage, silnik bazy danych wymaga poświadczeń o zakresie serwera lub poświadczeń o zakresie bazy danych, które określają rodzaj używanego uwierzytelniania i udostępniają tajemnicę do uwierzytelniania opartego na tajemnicach. Utworzenie tego poświadczenia wymaga uprawnienia do bazy danych.
W przypadku programu SQL Server i usługi Azure SQL Managed Instance to uprawnienie jest wymagane w master bazie danych. Domyślnie uprawnienia są posiadane przez członków db_owner roli bazy danych w master programie i przez członków sysadmin roli serwera na instancji. W przypadku usług Azure SQL Database i SQL Database w Fabric to uprawnienie przysługuje właścicielowi bazy danych (dbo), członkom roli bazy danych db_owner oraz administratorowi serwera logicznego.
Po utworzeniu poświadczenia, pozostałe kroki, aby utworzyć sesję zdarzeń, nie wymagają CONTROL uprawnień. Zobacz Uprawnienia , aby uzyskać określone wymagane uprawnienia.
Udzielanie dostępu przy użyciu tożsamości zarządzanej
Jeśli używasz tożsamości zarządzanej z uwierzytelnianiem Microsoft Entra, przypisz rolę RBAC Storage Blob Data Contributor dla kontenera do tożsamości zarządzanej, która jest używana przez silnik bazy danych. Aby uzyskać więcej informacji, zobacz następujące informacje na podstawie platformy SQL:
- Tożsamość zarządzana serwera logicznego usługi Azure SQL Database.
- Zarządzana tożsamość zarządzanego wystąpienia Azure SQL.
- Tożsamość zarządzana maszyny wirtualnej platformy Azure hostująca wystąpienie programu SQL Server. Aby uzyskać więcej informacji, zobacz Jak tożsamości zarządzane dla zasobów platformy Azure działają z maszynami wirtualnymi platformy Azure.
- Tożsamość zarządzana wystąpienia SQL Server z obsługą Arc.
Po przypisaniu roli RBAC wykonaj następujące kroki:
Utwórz poświadczenia przy użyciu języka T-SQL.
Przed wykonaniem następującej partii języka T-SQL wprowadź następującą zmianę:
- We wszystkich trzech wystąpieniach elementu
https://<storage-account-name>.blob.core.windows.net/<container-name>zastąp<storage-account-name>nazwą konta magazynu i zastąp<container-name>nazwą kontenera. Upewnij się, że na końcu adresu URL nie ma ukośnika końcowego.
Utwórz poświadczenie o zakresie serwera: (dotyczy programu SQL Server; usługi Azure SQL Managed Instance)
Za pomocą narzędzia klienckiego, takiego jak SSMS, otwórz nowe okno zapytania, połącz się z bazą danych
masterna wystąpieniu, gdzie chcesz utworzyć sesję zdarzeń, i wklej następujący skrypt T-SQL./* The name of the credential must match the URL of the blob container. */ IF EXISTS (SELECT 1 FROM sys.credentials WHERE name = 'https://<storage-account-name>.blob.core.windows.net/<container-name>') DROP CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>]; /* When using managed identity, the credential does not contain a secret */ CREATE CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>] WITH IDENTITY = 'MANAGED IDENTITY';Utwórz poświadczenie o zakresie bazy danych: (dotyczy usługi Azure SQL Database, Azure SQL Managed Instance, bazy danych SQL w Fabric)
Za pomocą narzędzia klienckiego, takiego jak program SSMS, otwórz nowe okno zapytania, połącz się z bazą danych użytkownika, w której tworzysz sesję zdarzeń, i wklej następującą partię języka T-SQL. Upewnij się, że masz połączenie z bazą danych użytkownika, a nie z bazą
masterdanych./* The name of the credential must match the URL of the blob container. */ IF EXISTS (SELECT 1 FROM sys.database_credentials WHERE name = 'https://<storage-account-name>.blob.core.windows.net/<container-name>') DROP DATABASE SCOPED CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>]; /* When using managed identity, the credential does not contain a secret */ CREATE DATABASE SCOPED CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>] WITH IDENTITY = 'MANAGED IDENTITY';- We wszystkich trzech wystąpieniach elementu
Następnie wykonaj kroki, aby utworzyć sesję zdarzeń w programie SSMS z celem event_file w usłudze Azure Storage.
Udzielanie dostępu przy użyciu tokenu sygnatury dostępu współdzielonego (SAS)
W przypadku korzystania z uwierzytelniania opartego na wpisach tajnych należy utworzyć token podpisu wspólnego dostępu (SAS) dla kontenera. Aby użyć tego typu uwierzytelniania, dla konta magazynu musi być włączona opcja Zezwalaj na dostęp do klucza magazynu . Aby uzyskać więcej informacji, zobacz Zapobieganie autoryzacji klucza współdzielonego dla konta usługi Azure Storage.
W witrynie Azure Portal przejdź do utworzonego konta magazynu i kontenera. Wybierz kontener i przejdź do pozycji Ustawienia > Tokeny dostępu współdzielonego.
Token SAS musi spełniać następujące wymagania:
-
Uprawnienia ustawione na
Read, ,WriteDelete,List. - Czas rozpoczęcia i czas wygaśnięcia muszą obejmować okres istnienia sesji wydarzenia. Utworzony token SAS działa tylko w tym przedziale czasu.
- W przypadku usług Azure SQL Database, Azure SQL Managed Instance i Azure Fabric SQL Database, token SAS nie powinien mieć żadnych ograniczeń dotyczących adresów IP.
Wybierz przycisk Generuj token SAS i adres URL . Token SAS znajduje się w polu Token SAS obiektu blob . Możesz skopiować go do użycia w następnym kroku.
Ważne
Token SAS zapewnia dostęp do odczytu i zapisu w tym kontenerze. Traktuj to tak, jak traktujesz hasło lub inną tajemnicę.
-
Uprawnienia ustawione na
Utwórz poświadczenia do przechowywania tokenu SAS przy użyciu języka T-SQL.
Przed wykonaniem następującej partii języka T-SQL wprowadź następujące zmiany:
W przypadku tworzenia poświadczeń o zakresie serwera i używania instrukcji
CREATE MASTER KEYzastąp<password>silnym hasłem, które chroni klucz główny. Aby uzyskać więcej informacji, zobacz CREATE MASTER KEY.We wszystkich trzech wystąpieniach elementu
https://<storage-account-name>.blob.core.windows.net/<container-name>zastąp<storage-account-name>nazwą konta magazynu i zastąp<container-name>nazwą kontenera.W klauzuli
SECRETzastąp element<sas-token>tokenem SAS skopiowany w poprzednim kroku.
Utwórz poświadczenie o zakresie serwera: (dotyczy programu SQL Server; usługi Azure SQL Managed Instance)
Korzystając z narzędzia klienckiego, na przykład SSMS, otwórz nowe okno zapytania, połącz je z bazą danych
masterna instancji, na której tworzysz sesję zdarzeń, i wklej następujący skrypt T-SQL./* Create a master key to protect the secret of the credential */ IF NOT EXISTS (SELECT 1 FROM sys.symmetric_keys WHERE name = '##MS_DatabaseMasterKey##') CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>' /* The name of the credential must match the URL of the blob container. */; IF EXISTS (SELECT 1 FROM sys.credentials WHERE name = 'https://<storage-account-name>.blob.core.windows.net/<container-name>') DROP CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>]; /* The secret is the SAS token for the container. */ CREATE CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>] WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = '<sas-token>';Utwórz poświadczenie o zakresie bazy danych: (dotyczy usługi Azure SQL Database, Azure SQL Managed Instance, bazy danych SQL w Fabric)
Za pomocą narzędzia klienckiego, takiego jak program SSMS, otwórz nowe okno zapytania, połącz się z bazą danych, w której tworzysz sesję zdarzeń, i wklej następującą partię języka T-SQL. Upewnij się, że masz połączenie z bazą danych użytkownika, a nie z bazą
masterdanych./* The name of the credential must match the URL of the blob container. */ IF EXISTS (SELECT 1 FROM sys.database_credentials WHERE name = 'https://<storage-account-name>.blob.core.windows.net/<container-name>') DROP DATABASE SCOPED CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>]; /* The secret is the SAS token for the container. */ CREATE DATABASE SCOPED CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>] WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = '<sas-token>';Następnie wykonaj kroki opisane w następnej sekcji, aby utworzyć sesję zdarzeń w programie SSMS z obiektem docelowym event_file w usłudze Azure Storage.
Tworzenie sesji zdarzeń w programie SSMS z obiektem docelowym event_file w usłudze Azure Storage
Po utworzeniu poświadczenia zapewniającego dostęp do kontenera pamięci masowej można utworzyć sesję wydarzeń. W przeciwieństwie do tworzenia poświadczeń tworzenie sesji zdarzeń nie wymaga CONTROL uprawnień. Po utworzeniu poświadczenia można tworzyć sesje zdarzeń, nawet jeśli masz bardziej ograniczone uprawnienia. Zobacz Uprawnienia , aby uzyskać określone wymagane uprawnienia.
Aby utworzyć nową sesję zdarzeń w programie SSMS:
W przypadku programu SQL Server i usługi Azure SQL Managed Instance rozwiń węzeł Zdarzenia rozszerzone w folderze Zarządzanie . W przypadku usług Azure SQL Database i SQL Database w Fabric rozwiń węzeł Zdarzenia rozszerzone pod bazą danych.
Kliknij prawym przyciskiem myszy folder Sesje , a następnie wybierz pozycję Nowa sesja....
Na stronie Ogólne wprowadź nazwę sesji, która jest
example-sessiondla następującego przykładu kodu.Na stronie Zdarzenia wybierz co najmniej jedno zdarzenie, które chcesz dodać do sesji. Możesz wybrać na przykład
sql_batch_startingzdarzenie.Na stronie Magazyn danych wybierz
event_filejako typ docelowy. Wklej adres URL kontenera magazynu w polu Adres URL magazynu . Wpisz ukośnik (/) na końcu tego adresu URL, a następnie nazwę pliku (obiektu blob). Na przykładhttps://<storage-account-name>.blob.core.windows.net/<container-name>/example-session.xel.Po skonfigurowaniu sesji możesz opcjonalnie wybrać przycisk Skrypt , aby utworzyć skrypt języka T-SQL sesji, aby zapisać go później.
Wybierz przycisk OK , aby utworzyć sesję.
W Eksplorator obiektów rozwiń folder Sesje, aby wyświetlić utworzoną sesję zdarzeń. Domyślnie sesja nie jest uruchamiana po jej utworzeniu. Aby rozpocząć sesję, kliknij prawym przyciskiem myszy nazwę sesji, a następnie wybierz pozycję Rozpocznij sesję. Później możesz go zatrzymać, wybierając pozycję Zatrzymaj sesję po uruchomieniu sesji.
Podczas wykonywania partii T-SQL sesja zapisuje zdarzenia sql_batch_starting w obiekcie blob example-session.xel w kontenerze przechowywania.
Uwaga / Notatka
W przypadku usługi SQL Managed Instance zamiast wklejania adresu URL kontenera magazynu na stronie Magazyn danych użyj przycisku Skrypt , aby utworzyć skrypt języka T-SQL sesji. Określ adres URL kontenera jako wartość argumentu filename i wykonaj skrypt, aby utworzyć sesję.
Tworzenie sesji zdarzeń z obiektem docelowym event_file w usłudze Azure Storage w języku T-SQL
Oto przykład klauzuli CREATE EVENT SESSION z klauzulą ADD TARGET, która dodaje cel oparty na usłudze Azure Storage event_file.
CREATE EVENT SESSION [example-session]
ON SERVER
ADD EVENT sqlserver.sql_batch_starting
ADD TARGET package0.event_file
(
SET filename = N'https://<storage-account-name>.blob.core.windows.net/<container-name>/example-session.xel'
)
GO
Aby użyć tego przykładu w usłudze Azure SQL Database lub bazie danych SQL w usłudze Fabric, zastąp ON SERVERON DATABASE.
Rozwiązywanie problemów z sesjami zdarzeń za pomocą obiektu docelowego event_file w usłudze Azure Storage
Poniższa lista zawiera błędy, które mogą wystąpić podczas uruchamiania rozszerzonej sesji zdarzeń korzystającej z usługi Azure Storage z możliwymi wyjaśnieniami błędu.
-
System operacyjny zwrócił błąd 5: "Odmowa dostępu".
- W przypadku korzystania z uwierzytelniania tożsamości zarządzanej:
- Tożsamość zarządzana używana przez silnik bazy danych nie ma wymaganego przypisania roli RBAC. Aby uzyskać więcej informacji, zobacz Udzielanie dostępu przy użyciu tożsamości zarządzanej.
- Zapora konta przechowywania jest włączona, a wyjątek zezwalający zaufanym usługom platformy Azure na dostęp do konta przechowywania jest również włączony, ale instancja zasobu dla serwera logicznego nie została dodana do listy instancji zasobów, którym udzielono dostępu. Aby uzyskać więcej informacji, zobacz Udzielanie dostępu z wystąpień zasobów platformy Azure.
- Jeśli używasz obwodu zabezpieczeń sieci z trybem wymuszonym, baza danych i konto magazynu nie są w tym samym obwodzie.
- W przypadku korzystania z uwierzytelniania tokenu SAS:
- Zapora konta magazynowego jest włączona. Nie jest to obsługiwane w przypadku sesji zdarzeń korzystających z uwierzytelniania tokenu SAS.
- Token SAS nie ma wystarczających uprawnień lub wygasł. Aby uzyskać więcej informacji, zobacz Udzielanie dostępu przy użyciu tokenu SAS.
- Jeśli używasz obwodu zabezpieczeń sieci w trybie wymuszonym, nie ma wprowadzonych reguł dostępu umożliwiających nieograniczoną komunikację wychodzącą z baz danych oraz nieograniczoną komunikację przychodzącą do konta magazynu.
- W przypadku korzystania z uwierzytelniania tożsamości zarządzanej:
-
System operacyjny zwrócił błąd 86: "Określone hasło sieciowe nie jest poprawne".
- Brak poświadczeń o zakresie bazy danych (dla usługi Azure SQL Database) ani poświadczeń o zakresie serwera (dla usługi Azure SQL Managed Instance lub SQL Server) o nazwie pasującej do adresu URL Kontenera obiektów Blob. Aby uzyskać więcej informacji, zobacz przykłady udzielania dostępu przy użyciu tożsamości zarządzanej lub Udzielanie dostępu przy użyciu tokenu SAS.
- Nazwa poświadczeń kończy się ukośnikiem (
/). Nazwa poświadczeń powinna kończyć się nazwą kontenera, która nie zawiera ukośnika końcowego.
-
System operacyjny zwrócił błąd 3: "System nie może odnaleźć określonej ścieżki".
- Kontener określony w adresie URL kontenera obiektów blob nie istnieje.
-
System operacyjny zwrócił błąd 13: "Dane są nieprawidłowe".
- W kontenerze obiektów blob istnieją zasady niezmienności . Niezmienny magazyn nie jest obsługiwany w przypadku sesji zdarzeń.
- Konto przechowywania ma włączoną hierarchiczną przestrzeń nazw . Konta pamięci masowej z włączoną hierarchiczną nazwą przestrzeni nie są obsługiwane w przypadku sesji zdarzeń.
funkcja sys.fn_xe_file_target_read_file()
Obiekt event_file docelowy przechowuje dane odbierane w formacie binarnym, który nie jest czytelny dla człowieka. Funkcja sys.fn_xe_file_target_read_file umożliwia reprezentowanie zawartości xel pliku jako relacyjnego zestawu wierszy. Aby uzyskać więcej informacji, w tym przykłady użycia, zobacz sys.fn_xe_file_target_read_file.
cel bufor_pierścieniowy
Element docelowy ring_buffer jest przydatny do szybkiego rozpoczęcia sesji zdarzeń i zbierania danych zdarzeń wyłącznie w pamięci. Gdy dostępna pamięć w buforze pierścieniowym jest używana przez zdarzenia, starsze zdarzenia są odrzucane. Po zatrzymaniu sesji zdarzeń wszystkie dane wyjściowe sesji do ring_buffer obiektu docelowego również zostaną odrzucone.
Przetwarzaj dane z ring_buffer obiektu docelowego, konwertując je na format XML, jak pokazano w poniższym przykładzie. Podczas tej konwersji wszystkie dane, które nie mieszczą się w dokumencie XML o rozmiarze 4 MB, są pomijane. W związku z tym nawet w przypadku przechwycenia większej liczby zdarzeń w buforze pierścienia przy użyciu większych MAX_MEMORY wartości (lub pozostawienia tego parametru w wartości domyślnej) może nie być możliwe użycie wszystkich z nich z powodu limitu 4 MB rozmiaru dokumentu XML, biorąc pod uwagę obciążenie znaczników XML i ciągów Unicode.
Wiesz, że zawartość pierścieniowego bufora zostanie pominięta podczas konwersji na XML, jeśli atrybut w dokumencie XML ma wartość truncated, na przykład:
<RingBufferTarget truncated="1" processingTime="0" totalEventsProcessed="284" eventCount="284" droppedCount="0" memoryUsed="64139">
Wskazówka
Podczas dodawania ring_buffer obiektu docelowego ustaw jego MAX_MEMORY parametr na 1024 KB lub mniej. Użycie większych wartości może niepotrzebnie zwiększyć zużycie pamięci.
Domyślnie MAX_MEMORY dla celu ring_buffer nie jest ograniczony w programie SQL Server i jest ograniczony do 32 MB w usługach Azure SQL Database, Azure SQL Managed Instance i SQL Database w Fabric.
Tworzenie sesji zdarzeń z obiektem docelowym ring_buffer
Oto przykład tworzenia sesji zdarzeń z celem ring_buffer, aby zbierać zdarzenia lock_acquired, ograniczając ich całkowitą liczbę w buforze pierścieniowym do 100. W tym przykładzie MAX_MEMORY parametr pojawia się dwa razy: raz, aby ustawić ring_buffer pamięć docelową na 1024 KB, a raz ustawić pamięć buforu sesji zdarzeń na 2 MB.
Aby użyć tego przykładu w usłudze Azure SQL Database lub bazie danych SQL w usłudze Fabric, zastąp ON SERVERON DATABASE.
CREATE EVENT SESSION ring_buffer_lock_acquired
ON SERVER
ADD EVENT sqlserver.lock_acquired
ADD TARGET package0.ring_buffer
(
SET MAX_EVENTS_LIMIT = 100,
MAX_MEMORY = 1024
)
WITH
(
MAX_MEMORY = 2 MB,
MAX_DISPATCH_LATENCY = 3 SECONDS
);
Aby rozpocząć sesję zdarzeń, wykonaj następującą instrukcję:
ALTER EVENT SESSION ring_buffer_lock_acquired
ON SERVER
STATE = START;
Aby wyświetlić zebrane dane zdarzenia w buforze pierścieniowym w programie SSMS, rozwiń węzeł sesji i wybierz cel package0.ping_buffer. Dane są wyświetlane w formacie XML.
Aby wyświetlić dane zdarzenia z ring_buffer obiektu docelowego w relacyjnym zestawie wierszy, gdy sesja jest aktywna, użyj wyrażeń XQuery , aby przekonwertować kod XML na dane relacyjne. Przykład:
;WITH
/* An XML document representing memory buffer contents */
RingBuffer AS
(
SELECT CAST (xst.target_data AS XML) AS TargetData
FROM sys.dm_xe_session_targets AS xst
INNER JOIN sys.dm_xe_sessions AS xs
ON xst.event_session_address = xs.address
WHERE xs.name = N'ring_buffer_lock_acquired'
),
/* A row for each event in the buffer, represented as an XML fragment */
EventNode AS
(
SELECT CAST (NodeData.query('.') AS XML) AS EventInfo
FROM RingBuffer AS rb
CROSS APPLY rb.TargetData.nodes('/RingBufferTarget/event') AS n(NodeData)
)
/* A relational rowset formed by using the XQuery value method */
SELECT EventInfo.value('(event/@timestamp)[1]','datetimeoffset') AS timestamp,
EventInfo.value('(event/@name)[1]','sysname') AS event_name,
EventInfo.value('(event/data/value)[1]','nvarchar(max)') AS sql_batch_text
FROM EventNode
ORDER BY timestamp DESC;
cel strumień zdarzeń
Obiekt docelowy event_stream można używać tylko w programach .NET napisanych w językach, takich jak C#. Deweloperzy mogą uzyskiwać dostęp do strumienia zdarzeń za pośrednictwem klas programu .NET Framework w Microsoft.SqlServer.XEvents.Linq przestrzeni nazw. Ten element docelowy jest niejawnie obecny w dowolnej sesji zdarzeń. Nie można go dodać przy użyciu języka T-SQL.
Aby uzyskać więcej informacji, zobacz sys.fn_MSxe_read_event_stream.
Jeśli wystąpi błąd 25726, The event data stream was disconnected because there were too many outstanding events. To avoid this error either remove events or actions from your session or add a more restrictive predicate filter to your session. podczas odczytu z event_stream celu, oznacza to, że strumień zdarzeń wypełnił się danymi szybciej, niż klient mógł je przetworzyć. Powoduje to, że silnik bazy danych odłącza się od strumienia zdarzeń, aby uniknąć wpływu na swoją wydajność.
cel docelowy histogramu
Cel histogram zlicza liczbę wystąpień zdarzeń dla różnych wartości w polu lub akcji. Dla każdej unikalnej wartości jest używany oddzielny licznik. Obiekt histogram docelowy przetwarza dane odbierane synchronicznie.
Parametr SOURCE_TYPE steruje zachowaniem histogram obiektu docelowego:
-
SOURCE_TYPE = 0: zbiera dane dla pola zdarzenia. -
SOURCE_TYPE = 1: zbiera dane dla akcji. Jest to wartość domyślna.
Wartość domyślna parametru SLOTS to 256. Jeśli przypiszesz inną wartość, wartość zostanie zaokrąglona do następnej potęgi 2. Na przykład SLOTS = 59 zostanie zaokrąglona do 64. Maksymalna liczba slotów histogramu dla histogram obiektu docelowego to 16 384.
W przypadku użycia histogram jako elementu docelowego czasami mogą wystąpić nieoczekiwane wyniki. Niektóre zdarzenia mogą nie pojawiać się w oczekiwanych miejscach, podczas gdy inne miejsca mogą pokazywać wyższą niż oczekiwaną liczbę zdarzeń. Może się tak zdarzyć, jeśli wystąpi kolizja skrótu podczas przypisywania zdarzeń do slotów. Chociaż jest to rzadkie, jeśli wystąpi kolizja skrótu, zdarzenie, które powinno być zliczane w jednym miejscu, jest liczone w innym. Z tego powodu należy zachować ostrożność przy założeniu, że zdarzenie nie wystąpiło tylko dlatego, że liczba w określonym miejscu jest wyświetlana jako zero.
Rozważmy na przykład następujący scenariusz:
- Aby skonfigurować sesję Zdarzeń Rozszerzonych, używając
histogramjako celu i segmentując zdarzenia wedługobject_id, należy zebrać statystyki wykonywania procedury składowanej. - Wykonujesz procedurę składowaną
A. Następnie należy wykonać procedurę składowanąB.
Jeśli funkcja skrótu zwraca tę samą wartość dla object_id obu procedur składowanych, histogram pokazuje, że A jest wykonywany dwukrotnie, podczas gdy B nie pojawia się.
Aby rozwiązać ten problem, gdy liczba unikatowych wartości jest stosunkowo mała, ustaw liczbę miejsc histogramu wyższą niż kwadrat oczekiwanych unikatowych wartości. Na przykład, jeśli histogram obiekt docelowy ma ustawioną wartość pola zdarzenia SOURCE, a w bazie danych znajduje się 20 tabel, to 20*20 = 400. Kolejna moc 2 większa niż 400 to 512, co jest zalecaną liczbą miejsc w tym przykładzie.
Każdy histogram element docelowy akceptuje dane z jednego źródła (pola zdarzenia lub akcji) i zawiera tylko jeden histogram. Nie można dodać więcej niż jednego celu tego samego typu na sesję. Nie można również mieć więcej niż jednego typu źródła na histogram obiekt docelowy. Dlatego do śledzenia różnych działań lub pól zdarzeń w oddzielnym histogram obiekcie docelowym potrzebna jest nowa sesja zdarzeń.
Tworzenie sesji zdarzeń z obiektem docelowym histogramu
Oto przykład tworzenia sesji zdarzeń z histogram jako celem.
Aby użyć tego przykładu w usłudze Azure SQL Database lub bazie danych SQL w usłudze Fabric, zastąp ON SERVERON DATABASE.
CREATE EVENT SESSION histogram_lock_acquired
ON SERVER
ADD EVENT sqlserver.lock_acquired
(
ACTION (sqlos.system_thread_id)
)
ADD TARGET package0.histogram
(
SET FILTERING_EVENT_NAME = N'sqlserver.lock_acquired',
SLOTS = 16,
SOURCE = N'sqlos.system_thread_id',
SOURCE_TYPE = 1
);
W klauzuli ADD TARGET ... (SET ...) docelowy parametr SOURCE_TYPE jest ustawiony na 1, co oznacza, że cel histogram śledzi akcję.
Klauzula ADD EVENT ... (ACTION ...) dodaje akcję sqlos.system_thread_id do zdarzenia. Parametr SOURCE jest ustawiony na sqlos.system_thread_id, aby użyć identyfikatora wątku systemowego zebranego przez tę akcję jako źródła danych dla celu histogram. Obiekt histogram docelowy w tym przykładzie zlicza liczbę zdarzeń lock_acquired dla każdego wątku systemowego, który uzyskuje blokady, gdy sesja jest aktywna.
Aby rozpocząć sesję zdarzeń, wykonaj następującą instrukcję:
ALTER EVENT SESSION histogram_lock_acquired
ON SERVER
STATE = START;
Aby wyświetlić zebrane dane histogramu w programie SSMS, rozwiń węzeł sesji i wybierz element docelowy package0.histogram . Dane są wyświetlane w układzie dwukolumnowym. Każdy wiersz reprezentuje zasobnik unikatowych wartości i liczbę wystąpień.
Poniżej przedstawiono sposób, w jaki dane przechwycone przez histogram obiekt docelowy w tym przykładzie mogą wyglądać. Wartości w kolumnie value są wartościami system_thread_id. Na przykład wątek systemowy 6540 uzyskał łącznie 236 blokad.
value count
----- -----
6540 236
9308 91
9668 74
10144 49
5244 44
2396 28
Oto przykład odczytywania danych z histogram obiektu docelowego za pomocą języka T-SQL:
WITH histogram_target
AS (SELECT TRY_CAST (st.target_data AS XML) AS target_data
FROM sys.dm_xe_sessions AS s
INNER JOIN sys.dm_xe_session_targets AS st
ON s.address = st.event_session_address
WHERE s.name = 'event-session-name-placeholder'),
histogram
AS (SELECT hb.slot.value('(@count)[1]', 'bigint') AS slot_count,
hb.slot.value('(value/text())[1]', 'nvarchar(max)') AS slot_value
FROM histogram_target AS ht
CROSS APPLY ht.target_data.nodes('/HistogramTarget/Slot') AS hb(slot))
SELECT slot_value,
slot_count
FROM histogram;
docelowy event_counter
Cel event_counter zlicza liczbę wystąpień każdego określonego zdarzenia.
Obiekt event_counter docelowy nie ma parametrów i przetwarza dane odbierane synchronicznie.
Tworzenie sesji zdarzeń z obiektem docelowym event_counter
Oto przykład tworzenia sesji zdarzeń z event_counter jako celem. Sesja zlicza pierwsze cztery checkpoint_begin zdarzenia, a następnie zatrzymuje zliczanie, ponieważ jego predykat ogranicza liczbę zdarzeń wysyłanych do obiektów docelowych do czterech. Można wygenerować zdarzenie checkpoint_begin dla tego przykładu, wykonując polecenie CHECKPOINT.
Aby użyć tego przykładu w usłudze Azure SQL Database lub bazie danych SQL w usłudze Fabric, zastąp ON SERVERON DATABASE.
CREATE EVENT SESSION event_counter_checkpoint_begin
ON SERVER
ADD EVENT sqlserver.checkpoint_begin
(
WHERE package0.counter <= 4
)
ADD TARGET package0.event_counter
WITH
(
MAX_MEMORY = 4096 KB,
MAX_DISPATCH_LATENCY = 3 SECONDS
);
Aby rozpocząć sesję zdarzeń, wykonaj następującą instrukcję:
ALTER EVENT SESSION event_counter_checkpoint_begin
ON SERVER
STATE = START;
Aby wyświetlić zebrane dane w programie SSMS, rozwiń węzeł sesji i wybierz cel package0.event_counter. Dane są wyświetlane w siatce z trzema kolumnami. Każdy wiersz przedstawia zdarzenie wraz z liczbą jego wystąpień.
Poniżej przedstawiono, jak mogą wyglądać dane przechwycone przez obiekt docelowy w tym przykładzie po czterech event_counter punktach kontrolnych.
package_name event_name count
------------ ---------------- -----
sqlserver checkpoint_begin 4
docelowe dopasowanie par
Element pair_matching docelowy umożliwia wykrywanie zdarzeń uruchamiania, które występują bez odpowiedniego zdarzenia końcowego. Na przykład można znaleźć lock_acquired zdarzenie bez zgodnego lock_released zdarzenia, co może wskazywać, że długobieżna transakcja utrzymuje blokady.
Zdarzenia rozszerzone nie są automatycznie zgodne ze zdarzeniami początkowymi i końcowymi. Zamiast tego należy zdefiniować zgodną logikę w pair_matching specyfikacji docelowej w instrukcji CREATE EVENT SESSION . Po dopasowaniu zdarzenia początkowego i końcowego element docelowy odrzuca parę, ale zachowuje niedopasowane zdarzenia początkowe.
Tworzenie sesji zdarzeń z obiektem docelowym pair_matching
W tym przykładzie utworzymy przykładową tabelę o nazwie T1, wstawimy trzy wiersze i uzyskamy object_id wartość dla tej tabeli. Dla uproszczenia utworzymy tabelę w bazie danych w tym przykładzie tempdb . Jeśli używasz innej bazy danych, dostosuj nazwę bazy danych w poniższym przykładowym kodzie języka T-SQL.
CREATE TABLE T1 (id INT PRIMARY KEY);
INSERT INTO T1 (id)
VALUES (1), (2), (3);
SELECT OBJECT_ID('T1') AS object_id;
-- object_id = 1029578706
Poniższa sesja zdarzeń zawiera dwa wydarzenia, lock_acquired oraz lock_released. Ma również dwa cele. Jednym z nich jest event_counter cel, który zapewnia liczbę wystąpień dla każdego zdarzenia. Drugi to pair_matching element docelowy, który definiuje logikę w celu dopasowania zdarzenia początkowego lock_acquired i zdarzenia końcowego lock_released do par.
Sekwencja pól rozdzielonych przecinkami przypisanych do BEGIN_MATCHING_COLUMNS i END_MATCHING_COLUMNS musi być taka sama. Między polami wymienionymi w wartości rozdzielanej przecinkami, nie są dozwolone tabulatory ani nowe linie, jednak spacje są dozwolone.
W definicji sesji zdarzeń używamy predykatu zdarzenia, aby zbierać tylko te zdarzenia w bazie danych tempdb, gdzie w zdarzeniu object_id pasuje do identyfikatora obiektu tabeli T1. Dostosuj predykat w klauzuli WHERE , aby użyć identyfikatora obiektu tabeli.
Aby użyć tego przykładu w usłudze Azure SQL Database lub bazie danych SQL w usłudze Fabric, zastąp ON SERVERON DATABASE.
CREATE EVENT SESSION pair_matching_lock_acquired_released
ON SERVER
ADD EVENT sqlserver.lock_acquired
(
SET COLLECT_DATABASE_NAME = 1,
COLLECT_RESOURCE_DESCRIPTION = 1
ACTION (sqlserver.transaction_id)
WHERE (database_name = 'tempdb'
AND object_id = 1029578706)
),
ADD EVENT sqlserver.lock_released
(
SET COLLECT_DATABASE_NAME = 1,
COLLECT_RESOURCE_DESCRIPTION = 1
ACTION (sqlserver.transaction_id)
WHERE (database_name = 'tempdb'
AND object_id = 1029578706)
)
ADD TARGET package0.event_counter,
ADD TARGET package0.pair_matching
(
SET BEGIN_EVENT = N'sqlserver.lock_acquired',
BEGIN_MATCHING_COLUMNS = N'resource_0, resource_1, resource_2, transaction_id, database_id',
END_EVENT = N'sqlserver.lock_released',
END_MATCHING_COLUMNS = N'resource_0, resource_1, resource_2, transaction_id, database_id',
RESPOND_TO_MEMORY_PRESSURE = 1
)
WITH
(
MAX_MEMORY = 8192 KB,
MAX_DISPATCH_LATENCY = 15 SECONDS
);
Aby rozpocząć sesję zdarzeń, wykonaj następującą instrukcję:
ALTER EVENT SESSION pair_matching_lock_acquired_released
ON SERVER
STATE = START;
Uruchom transakcję aktualizującą T1 tabelę, ale nie zatwierdzaj jej ani wycofaj. Gwarantuje to, że istnieją nabyte, ale nie zwalniane blokady.
BEGIN TRANSACTION;
UPDATE T1
SET id = id + 1;
Sprawdź dane wyjściowe z każdego miejsca docelowego pair_matching_lock_acquired_released sesji zdarzeń w programie SSMS.
Obiekt event_counter docelowy ma następujące dane wyjściowe, pokazujące, że jedna blokada nie zostanie zwolniona. Jednak ten cel nie wyświetla żadnych szczegółów tej blokady.
package_name event_name count
------------ ---------- -----
sqlserver lock_acquired 4
sqlserver lock_released 3
Obiekt pair_matching docelowy ma następujące dane wyjściowe, obcięte w celu zwięzłości. Jak sugerują dane wyjściowe event_counter, rzeczywiście widzimy jeden wiersz dla niesparowanego zdarzenia lock_acquired, z dodatkowymi szczegółami dotyczącymi tego zdarzenia.
package_name event_name timestamp associated_object_id database_id database_name
------------ ------------ --------- ------------- ----------- -------------
sqlserver lock_acquired 2025-10-01 20:06:07.1890000 1029578706 2 tempdb
Wycofaj transakcję.
ROLLBACK;
Jeśli dodasz akcję do zdarzenia zebranego przez cel pair_matching, dane akcji również zostaną zebrane. Na przykład możesz dołączyć tekst języka T-SQL dostarczony przez akcję sqlserver.sql_text ze zdarzeniem. W tym przykładzie zostanie zebrane zapytanie, które nabyło blokadę.
cel etw_classic_sync_target
W programie SQL Server zdarzenia rozszerzone mogą współdziałać ze śledzeniem zdarzeń dla systemu Windows (ETW) w celu monitorowania aktywności systemu. Aby uzyskać więcej informacji, zobacz:
Ten cel ETW przetwarza dane, które otrzymuje, w sposób synchroniczny.
Treści powiązane
- Omówienie zdarzeń rozszerzonych
- Szybki start: zdarzenia rozszerzone
- Zdarzenia rozszerzone w usłudze Azure SQL