Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-database in Microsoft Fabric Preview
In dit artikel wordt uitgelegd wanneer en hoe u Extended Events-doelen gebruikt. Voor elk doel wordt in het artikel het volgende beschreven:
- De mogelijkheden voor het verzamelen en rapporteren van gebeurtenisgegevens
- Voorbeelden van gebeurtenissessies met behulp van het doel
In de volgende tabel wordt de beschikbaarheid van elk doeltype in verschillende SQL-platforms beschreven.
| Doeltype | SQL Server | Azure SQL Database en SQL Database in Fabric | Azure SQL Managed Instance (een beheerde database-instantie van Azure) |
|---|---|---|---|
| event_file | Ja | Ja | Ja |
| ringbuffer | Ja | Ja | Ja |
| event_stream | Ja | Ja | Ja |
| histogram | Ja | Ja | Ja |
| event_counter | Ja | Ja | Ja |
| pair_matching | Ja | Nee. | Nee. |
| etw_classic_sync_target | Ja | Nee. | Nee. |
Tenzij anders vermeld, verwerken doelen de gegevens die ze asynchroon ontvangen.
Als u optimaal gebruik wilt maken van dit artikel, moet u het volgende doen:
- Wees vertrouwd met de basisprincipes van uitgebreide gebeurtenissen, zoals beschreven in quickstart: Uitgebreide gebeurtenissen.
- Gebruik een recente versie van SQL Server Management Studio (SSMS).
event_file doelbestand
Het event_file doel schrijft gebeurtenissessieuitvoer van geheugenbuffers naar een schijfbestand of naar een blob in Azure Storage.
U geeft de
filenameparameter op in deADD TARGETcomponent. De bestandsextensie moet zijnxel.De bestandsnaam die u kiest, wordt door het systeem gebruikt als voorvoegsel waaraan een numerieke waarde op basis van datum en tijd wordt toegevoegd, gevolgd door de
xelextensie.U kunt desgewenst de
MAX_FILE_SIZEparameter opgeven. Hiermee definieert u de maximale grootte in megabytes (MB) waarnaar het bestand kan groeien voordat een nieuw bestand wordt gemaakt.U kunt desgewenst de
MAX_ROLLOVER_FILESoptie opgeven om het maximum aantal bestanden te kiezen dat u in het bestandssysteem wilt bewaren, naast het huidige bestand. De standaardwaarde isUNLIMITED. WanneerMAX_ROLLOVER_FILESwordt geëvalueerd, worden de oudere bestanden verwijderd als het aantal bestanden groter is dan deMAX_ROLLOVER_FILESinstelling.
Belangrijk
Afhankelijk van de gebeurtenissen die zijn toegevoegd aan een sessie, kunnen de bestanden die door het event_file doel worden geproduceerd, gevoelige gegevens bevatten. Controleer zorgvuldig het bestandssysteem en de sharemachtigingen voor de map en afzonderlijke .xel bestanden, inclusief overgenomen toegang, om te voorkomen dat onnodige leestoegang wordt verleend. Volg het principe van minimale bevoegdheden. Om het risico op het verzamelen van gevoelige gegevens per ongeluk te verminderen, vermijdt u langdurige gebeurtenissessies als ze gevoelige gegevens kunnen verzamelen.
Opmerking
Azure SQL Database en Azure SQL Managed Instance ondersteunen alleen blobs in Azure Storage als de waarde van de filename parameter. Zie event_file codevoorbeeld voor Azure SQL Database, SQL Database in Fabric of Azure SQL Managed Instance.
Een gebeurtenissessie maken met event_file doel in het lokale bestandssysteem
Voor een overzicht van het maken van een gebeurtenissessie met behulp van een event_file met lokale bestandsopslag, met SSMS of T-SQL, raadpleegt u quickstart: Uitgebreide gebeurtenissen.
Een gebeurtenissessie maken met event_file doel in Azure Storage
Zie Een opslagaccount maken voor een gedetailleerde beschrijving van het maken van een opslagaccount in Azure Storage. U kunt een opslagaccount maken met behulp van Azure Portal, PowerShell, Azure SQL, een ARM-sjabloon of een Bicep-sjabloon. Gebruik een account dat:
- Is een
Standard general-purpose v2account. - Maakt gebruik van de
Hotblob-toegangslaag. - Als u SQL Server in Azure Virtual Machine (Azure VM) gebruikt, moet het opslagaccount zich in dezelfde Azure-regio bevinden als uw Azure-VM.
- De hiërarchische naamruimte is niet ingeschakeld.
Maak vervolgens een container in dit opslagaccount met behulp van Azure Portal. U kunt ook een container maken met Behulp van PowerShell of Azure CLI.
Noteer de namen van het opslagaccount en de container die u hebt gemaakt. U gebruikt deze in de volgende stappen.
Voor het lezen en schrijven van gebeurtenisgegevens heeft de database-engine specifieke toegang nodig. U verleent deze toegang anders, afhankelijk van uw keuze van het verificatietype: beheerde identiteit of op geheim gebaseerde verificatie met een SAS-token (Shared Access Signature).
Voor verificatie bij Azure Storage is voor de database-engine een referentie met serverbereik of databasereferentie vereist, die aangeeft welk type verificatie moet worden gebruikt en een geheim biedt voor verificatie op basis van geheimen. Voor het maken van deze referentie is de CONTROL databasemachtiging vereist.
Voor SQL Server en Azure SQL Managed Instance is deze machtiging vereist in de master database. Standaard wordt de machtiging bewaard door de leden van de db_owner databaserol in master en door de leden van de sysadmin serverrol op de instantie. Voor Azure SQL Database en SQL Database in Fabric wordt deze machtiging bewaard door de eigenaar van de database (dbo), door de leden van de db_owner databaserol en door de beheerder van de logische server.
Zodra een referentie is aangemaakt, zijn voor de resterende stappen om een gebeurtenissessie te maken de machtigingen CONTROL niet vereist. Zie Machtigingen voor de specifieke machtigingen die nodig zijn.
Toegang verlenen met beheerde identiteit
Als u een beheerde identiteit gebruikt met Microsoft Entra-verificatie, wijst u de rol Inzender voor opslagblobgegevens voor de container toe aan de beheerde identiteit die door de database-engine wordt gebruikt. Zie het volgende op basis van het SQL-platform voor meer informatie:
- De beheerde identiteit van de logische Azure SQL Database-server.
- De beheerde identiteit van het beheerde Azure SQL-exemplaar.
- De beheerde identiteit van de Azure-VM die als host fungeert voor uw SQL Server-exemplaar. Zie Hoe beheerde identiteiten voor Azure-resources werken met virtuele Azure-machines voor meer informatie.
- De beheerde identiteit van het SQL Server-exemplaar met Arc.
Zodra de RBAC-roltoewijzing is toegewezen, voert u de volgende stappen uit:
Maak een referentie met behulp van T-SQL.
Voordat u de volgende T-SQL-batch uitvoert, moet u de volgende wijziging aanbrengen:
- Vervang bij alle drie de gevallen
https://<storage-account-name>.blob.core.windows.net/<container-name>door de naam van uw opslagaccount en<storage-account-name>door de naam van uw container. Zorg ervoor dat er geen afsluitende slash aan het einde van de URL staat.
Een referentie met serverbereik maken: (Van toepassing op SQL Server, Azure SQL Managed Instance)
Open met behulp van een clienthulpprogramma, zoals SSMS, een nieuw queryvenster, maak verbinding met
masterde database op het exemplaar waar u de gebeurtenissessie wilt maken en plak de volgende T-SQL-batch./* 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';Een database-specifieke referentie maken: (Toepasselijk op Azure SQL Database, Azure SQL Managed Instance, SQL-database in Fabric)
Open met behulp van een clienthulpprogramma, zoals SSMS, een nieuw queryvenster, maak verbinding met de gebruikersdatabase waar u de gebeurtenissessie maakt en plak de volgende T-SQL-batch. Zorg ervoor dat u bent verbonden met uw gebruikersdatabase en niet met de
masterdatabase./* 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';- Vervang bij alle drie de gevallen
Volg vervolgens de stappen voor het maken van een gebeurtenissessie in SSMS met event_file doel in Azure Storage.
Toegang verlenen met een SAS-token (Shared Access Signature)
Als u verificatie op basis van geheim gebruikt, maakt u een SAS-token (Shared Access Signature) voor de container. Als u dit verificatietype wilt gebruiken, moet de optie Toegang tot de sleutel van het opslagaccount toestaan zijn ingeschakeld voor het opslagaccount. Zie Autorisatie van gedeelde sleutels voorkomen voor een Azure Storage-account voor meer informatie.
Navigeer in Azure Portal naar het opslagaccount en de container die u hebt gemaakt. Selecteer de container en navigeer naar Instellingen > Gedeelde toegangstokens.
Het SAS-token moet voldoen aan de volgende vereisten:
-
Machtigingen ingesteld op
Read,Write,Delete, .List - De begin - en verlooptijd moeten de levensduur van de gebeurtenissessie omvatten. Het SAS-token dat u maakt, werkt alleen binnen dit tijdsinterval.
- Voor Azure SQL Database, Azure SQL Managed Instance en SQL Database in Fabric mag het SAS-token geen IP-adresbeperkingen hebben.
Selecteer de knop Genereer SAS-token en URL. Het SAS-token bevindt zich in het vak Blob SAS-token . U kunt deze kopiëren voor gebruik in de volgende stap.
Belangrijk
Het SAS-token biedt lees- en schrijftoegang tot deze container. Behandel het zoals u een wachtwoord of een ander geheim zou behandelen.
-
Machtigingen ingesteld op
Maak een referentie voor het opslaan van het SAS-token met behulp van T-SQL.
Voordat u de volgende T-SQL-batch uitvoert, moet u deze wijzigingen aanbrengen:
Als u een referentie met serverbereik maakt en de
CREATE MASTER KEYinstructie gebruikt, vervangt u<password>door een sterk wachtwoord dat de hoofdsleutel beveiligt. Zie CREATE MASTER KEYvoor meer informatie.Vervang bij alle drie de gevallen
https://<storage-account-name>.blob.core.windows.net/<container-name>door de naam van uw opslagaccount en<storage-account-name>door de naam van uw container.In de
SECRETclausule, vervang<sas-token>door het SAS-token dat u in de vorige stap hebt gekopieerd.
Een referentie met serverbereik maken: (Van toepassing op SQL Server, Azure SQL Managed Instance)
Open met behulp van een clienthulpprogramma, zoals SSMS, een nieuw queryvenster, verbind deze met de
masterdatabase op het exemplaar waar u de gebeurtenissessie maakt en plak de volgende T-SQL-batch./* 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>';Een database-specifieke referentie maken: (Van toepassing op Azure SQL Database, Azure SQL Managed Instance, SQL-database in Fabric)
Open met behulp van een clienthulpprogramma, zoals SSMS, een nieuw queryvenster, maak verbinding met de database waar u de gebeurtenissessie maakt en plak de volgende T-SQL-batch. Zorg ervoor dat u bent verbonden met uw gebruikersdatabase en niet met de
masterdatabase./* 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>';Volg vervolgens de stappen in de volgende sectie om een gebeurtenissessie in SSMS te maken met event_file doel in Azure Storage.
Een gebeurtenissessie maken in SSMS met event_file doel in Azure Storage
Zodra de referentie die toegang biedt tot de opslagcontainer is gemaakt, kunt u de gebeurtenissessie maken. In tegenstelling tot het aanmaken van een referentie, is voor het aanmaken van een eventsessie geen CONTROL machtiging vereist. Zodra de referentiegegevens zijn aangemaakt, kunt u gebeurtenissessies maken, zelfs als u beperkte rechten hebt. Zie Machtigingen voor de specifieke machtigingen die nodig zijn.
Een nieuwe gebeurtenissessie maken in SSMS:
Vouw voor SQL Server en Azure SQL Managed Instance het knooppunt Uitgebreide gebeurtenissen uit onder de map Beheer . Vouw voor Azure SQL Database en SQL Database in Fabric het knooppunt Uitgebreide gebeurtenissen onder de database uit.
Klik met de rechtermuisknop op de map Sessies en selecteer Nieuwe sessie....
Voer op de pagina Algemeen een naam in voor de sessie. Dit is
example-sessionvoor het volgende codevoorbeeld.Selecteer op de pagina Gebeurtenissen een of meer gebeurtenissen die u aan de sessie wilt toevoegen. U kunt bijvoorbeeld de
sql_batch_startinggebeurtenis selecteren.Selecteer op de pagina Gegevensopslag de optie
event_fileals het doeltype. Plak de URL van de opslagcontainer in het vak Opslag-URL . Typ een schuine streep (/) aan het einde van deze URL, gevolgd door de bestandsnaam (blob). Bijvoorbeeld:https://<storage-account-name>.blob.core.windows.net/<container-name>/example-session.xel.Nu de sessie is geconfigureerd, kunt u desgewenst de knop Script selecteren om een T-SQL-script van de sessie te maken, om deze later op te slaan.
Selecteer OK om de sessie te maken.
Vouw in Objectverkenner de map Sessies uit om de gebeurtenissessie te zien die u hebt gemaakt. De sessie wordt standaard niet gestart wanneer deze wordt gemaakt. Als u de sessie wilt starten, klikt u met de rechtermuisknop op de sessienaam en selecteert u Sessie starten. U kunt deze later stoppen door stopsessie te selecteren zodra de sessie wordt uitgevoerd.
Wanneer T-SQL-batches worden uitgevoerd, schrijft de sessie de sql_batch_starting gebeurtenissen naar de example-session.xel blob in de opslagcontainer.
Opmerking
Gebruik voor een SQL Managed Instance in plaats van de URL van de opslagcontainer te plakken op de Gegevensopslag-pagina, de Script-knop om een T-SQL-script van de sessie te maken. Geef de container-URL op als de waarde voor het filename argument en voer het script uit om de sessie te maken.
Een gebeurtenissessie maken met event_file doel in Azure Storage in T-SQL
Hier is een voorbeeld van de CREATE EVENT SESSION met een ADD TARGET clausule waarmee een event_file-doel wordt toegevoegd dat gebaseerd is op Azure Storage.
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
Als u dit voorbeeld wilt gebruiken in Azure SQL Database of SQL Database in Fabric, vervangt u ON SERVER door ON DATABASE.
Problemen met gebeurtenissessies oplossen met event_file doel in Azure Storage
De volgende lijst bevat fouten die kunnen optreden bij het starten van een uitgebreide gebeurtenissessie die gebruikmaakt van Azure Storage, met de mogelijke verklaringen voor de fout.
-
Het besturingssysteem heeft fout 5 geretourneerd: 'Toegang is geweigerd.'
- Als u beheerde identiteitverificatie gebruikt:
- De beheerde identiteit die door de database-engine wordt gebruikt, beschikt niet over de vereiste RBAC-roltoewijzing. Zie Toegang verlenen met behulp van een beheerde identiteit voor meer informatie.
- De firewall van het opslagaccount is ingeschakeld en er is een uitzondering opgetreden om vertrouwde Azure-services toegang te geven tot het opslagaccount, maar er
Microsoft.Sql/serversis geen resource-exemplaar voor de logische server toegevoegd aan de lijst met resource-exemplaren die toegang krijgen. Voor meer informatie, zie Toegang verlenen vanuit Azure-resource-exemplaren. - Als u een netwerkbeveiligingsperimeter gebruikt met de afgedwongen modus, bevinden de database en het opslagaccount zich niet in dezelfde perimeter.
- Als u SAS-tokenverificatie gebruikt:
- De firewall van het opslagaccount is ingeschakeld. Dit wordt niet ondersteund voor gebeurtenissessies die gebruikmaken van SAS-tokenverificatie.
- Het SAS-token beschikt niet over voldoende machtigingen of is verlopen. Zie Toegang verlenen met behulp van een SAS-token voor meer informatie.
- Als u een netwerkbeveiligingsperimeter gebruikt met de afgedwongen modus, zijn er geen toegangsregels voor onbeperkte uitgaande communicatie vanuit de database en onbeperkte binnenkomende communicatie naar het opslagaccount.
- Als u beheerde identiteitverificatie gebruikt:
-
Het besturingssysteem heeft fout 86 geretourneerd: 'Het opgegeven netwerkwachtwoord is niet juist.'
- Er is geen referentie binnen het databasebereik (voor Azure SQL Database) of een referentie met serverbereik (voor Azure SQL Managed Instance of SQL Server) die overeenkomt met de URL van de blobcontainer. Zie de voorbeelden voor het verlenen van toegang met behulp van een beheerde identiteit of het verlenen van toegang met behulp van een SAS-token voor meer informatie.
- De referentienaam eindigt met een slash (
/). De referentienaam moet eindigen met de containernaam, zonder het eindstreepje mee te nemen.
-
Het besturingssysteem heeft fout 3 geretourneerd: 'Het systeem kan het opgegeven pad niet vinden.'
- De container die is opgegeven in de URL van de blobcontainer bestaat niet.
-
Het besturingssysteem heeft fout 13 geretourneerd: 'De gegevens zijn ongeldig.'
- Er is een onveranderbaarheidsbeleid voor de blobcontainer. Onveranderbare opslag wordt niet ondersteund voor gebeurtenissessies.
- Voor het opslagaccount is de hiërarchische naamruimte ingeschakeld. Opslagaccounts waarvoor hiërarchische naamruimte is ingeschakeld, worden niet ondersteund voor gebeurtenissessies.
sys.fn_xe_file_target_read_file() functie
Het event_file doel slaat de gegevens op die het ontvangt in een binaire indeling die niet door mensen kan worden gelezen. Met sys.fn_xe_file_target_read_file de functie kunt u de inhoud van een xel bestand weergeven als een relationele rijenset. Zie sys.fn_xe_file_target_read_file voor meer informatie, waaronder gebruiksvoorbeelden.
ring_buffer doelwit
Het ring_buffer doel is handig om snel een gebeurtenissessie te starten en alleen gebeurtenisgegevens in het geheugen te verzamelen. Wanneer het beschikbare geheugen in de ringbuffer wordt gebruikt door gebeurtenissen, worden de oudere gebeurtenissen verwijderd. Wanneer u de gebeurtenissessie stopt, wordt alle sessie-uitvoer naar het ring_buffer doel ook verwijderd.
U gebruikt gegevens van een ring_buffer doel door deze te converteren naar XML, zoals wordt weergegeven in het volgende voorbeeld. Tijdens deze conversie worden alle gegevens die niet in een XML-document van 4 MB passen weggelaten. Zelfs als u meer gebeurtenissen in de ringbuffer vastlegt met behulp van grotere MAX_MEMORY waarden (of door deze parameter op de standaardwaarde te laten), kunt u deze mogelijk niet allemaal gebruiken vanwege de limiet van 4 MB voor de XML-documentgrootte, rekening houdend met de overhead van XML-markeringen en Unicode-tekenreeksen.
U weet dat de inhoud van de ringbuffer wordt weggelaten tijdens de conversie naar XML als het truncated kenmerk in het XML-document is ingesteld 1op, bijvoorbeeld:
<RingBufferTarget truncated="1" processingTime="0" totalEventsProcessed="284" eventCount="284" droppedCount="0" memoryUsed="64139">
Aanbeveling
Wanneer u een ring_buffer doel toevoegt, stelt u MAX_MEMORY de parameter in op 1024 kB of minder. Het gebruik van grotere waarden kan het geheugenverbruik onnodig verhogen.
Standaard is MAX_MEMORY voor een ring_buffer-target niet beperkt in SQL Server, en is het beperkt tot 32 MB in Azure SQL Database, Azure SQL Managed Instance en SQL-database in Fabric.
Een gebeurtenissessie maken met een ring_buffer-target
Hier volgt een voorbeeld van het maken van een gebeurtenissessie met een ring_buffer doel om de lock_acquired gebeurtenissen te verzamelen, waardoor het totale aantal gebeurtenissen in de ringbuffer wordt beperkt tot 100. In dit voorbeeld wordt de MAX_MEMORY parameter twee keer weergegeven: eenmaal om het ring_buffer doelgeheugen in te stellen op 1024 kB en eenmaal om het geheugen van de gebeurtenissessiebuffer in te stellen op 2 MB.
Als u dit voorbeeld wilt gebruiken in Azure SQL Database of SQL Database in Fabric, vervangt u ON SERVER door ON 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
);
Voer de volgende instructie uit om de gebeurtenissessie te starten:
ALTER EVENT SESSION ring_buffer_lock_acquired
ON SERVER
STATE = START;
Als u de verzamelde gebeurtenisgegevens in de ringbuffer in SSMS wilt weergeven, vouwt u het sessieknooppunt uit en selecteert u het package0.ping_buffer doel. De gegevens worden weergegeven in XML.
Als u gebeurtenisgegevens uit een doel in een ring_buffer relationele rijenset wilt zien terwijl de sessie actief is, gebruikt u XQuery-expressies om XML te converteren naar relationele gegevens. Voorbeeld:
;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;
event_stream doel
Het event_stream doel kan alleen worden gebruikt in .NET-programma's die zijn geschreven in talen zoals C#. Ontwikkelaars hebben toegang tot een gebeurtenisstroom via .NET Framework-klassen in de Microsoft.SqlServer.XEvents.Linq naamruimte. Dit doel is impliciet aanwezig in elke eventsessie. Het kan niet worden toegevoegd met behulp van T-SQL.
Zie sys.fn_MSxe_read_event_stream voor meer informatie.
Als u fout 25726 tegenkomt bij 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. het lezen van het event_stream doel, betekent dit dat de gebeurtenisstroom sneller werd gevuld met gegevens dan de client de gegevens kan verwerken. Dit veroorzaakt dat de database-engine de verbinding met de gebeurtenisstroom verbreekt om impact op de prestaties van de database-engine te vermijden.
histogram streefwaarde
Het histogram doel telt het aantal gebeurtenissen voor afzonderlijke waarden in een veld of actie. Voor elke afzonderlijke waarde wordt een afzonderlijke bucket voor het aantal gebruikt. Het histogram-doel verwerkt de gegevens die het synchroon ontvangt.
De SOURCE_TYPE parameter bepaalt het gedrag van het histogram doel:
-
SOURCE_TYPE = 0: gegevens verzamelen voor een gebeurtenisveld. -
SOURCE_TYPE = 1: gegevens verzamelen voor een actie. Dit is de standaardwaarde.
De standaardwaarde van de SLOTS parameter is 256. Als u een andere waarde toewijst, wordt de waarde naar boven afgerond op de volgende macht van 2. Wordt bijvoorbeeld SLOTS = 59 afgerond op 64. Het maximum aantal histogramvakken voor een histogram doel is 16.384.
Wanneer u als doel gebruikt histogram , ziet u soms onverwachte resultaten. Sommige gebeurtenissen worden mogelijk niet weergegeven in de verwachte sites, terwijl andere sites mogelijk een hoger aantal gebeurtenissen weergeven dan verwacht. Dit kan gebeuren als er een hash-botsing optreedt bij het toewijzen van gebeurtenissen aan slots. Hoewel dit zeldzaam is, wordt, als er een hash-botsing plaatsvindt, een gebeurtenis die in de ene slot moet worden geteld, in een andere slot geteld. Daarom moet u voorzichtig zijn met de aanname dat een gebeurtenis niet heeft plaatsgevonden alleen omdat het aantal in een bepaalde sleuf als nul wordt weergegeven.
Denk bijvoorbeeld aan het volgende scenario:
- U stelt een Extended Events-sessie in, waarbij u
histogramals doel en gebeurtenissen categoriseert doorobject_id, om uitvoeringsstatistieken van opgeslagen procedures te verzamelen. - U voert de opgeslagen procedure
Auit. Vervolgens voert u de opgeslagen procedureBuit.
Als de hash-functie dezelfde waarde retourneert voor zowel object_id van beide opgeslagen procedures, toont het histogram dat A twee keer wordt uitgevoerd, terwijl B niet verschijnt.
Als u dit probleem wilt verhelpen wanneer het aantal afzonderlijke waarden relatief klein is, stelt u het aantal histogramsites in dat hoger is dan het kwadraat van de verwachte afzonderlijke waarden. Als het histogram doel bijvoorbeeld is ingesteld op het SOURCE gebeurtenisveld, en er zijn 20 tabellen in de database, dan is 20*20 = 400. De volgende macht van 2 groter dan 400 is 512, wat het aanbevolen aantal sleuven in dit voorbeeld is.
Elk histogram doel accepteert gegevens uit één bron (een gebeurtenisveld of een actie) en bevat slechts één histogram. Het is niet mogelijk om meer dan één doel van hetzelfde type per gebeurtenissessie toe te voegen. Het is ook niet mogelijk om meer dan één brontype per histogram doel te hebben. Daarom is een nieuwe gebeurtenissessie vereist om verschillende acties of gebeurtenisvelden in een afzonderlijk histogram doel bij te houden.
Een gebeurtenissessie maken met een histogramdoel
Hier volgt een voorbeeld van het maken van een gebeurtenissessie met een histogram doel.
Als u dit voorbeeld wilt gebruiken in Azure SQL Database of SQL Database in Fabric, vervangt u ON SERVER door ON 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
);
In de ADD TARGET ... (SET ...) component is de doelparameter SOURCE_TYPE ingesteld op 1, wat betekent dat het histogram doel een actie bijhoudt.
De ADD EVENT ... (ACTION ...) component voegt de sqlos.system_thread_id actie toe aan de gebeurtenis. De SOURCE-parameter is ingesteld op sqlos.system_thread_id voor het gebruik van de systeemthread-id die door deze actie wordt verzameld als de gegevensbron voor het histogram-doel. Het histogram doel in dit voorbeeld telt het aantal lock_acquired gebeurtenissen voor elke systeemthread die vergrendelingen verkrijgt terwijl de sessie actief is.
Voer de volgende instructie uit om de gebeurtenissessie te starten:
ALTER EVENT SESSION histogram_lock_acquired
ON SERVER
STATE = START;
Als u de verzamelde histogramgegevens in SSMS wilt weergeven, vouwt u het sessieknooppunt uit en selecteert u het package0.histogram doel. De gegevens worden weergegeven in een raster met twee kolommen. Elke rij vertegenwoordigt een bucket met afzonderlijke waarden en een tel van het aantal voorkomens.
Hier ziet u hoe de gegevens die zijn vastgelegd door het histogram doel in dit voorbeeld, eruit kunnen zien. De waarden in de value kolom zijn system_thread_id waarden. Een totaal van 236 vergrendelingen is bijvoorbeeld verkregen door systeemthread 6540.
value count
----- -----
6540 236
9308 91
9668 74
10144 49
5244 44
2396 28
Hier volgt een voorbeeld van het lezen van de gegevens van een histogram doel met 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;
event_counter doel
Het event_counter doel telt het aantal keren dat elke opgegeven gebeurtenis optreedt.
Het event_counter doel heeft geen parameters en verwerkt de gegevens die het ontvangt synchroon.
Een gebeurtenissessie maken met een event_counter doel
Hier volgt een voorbeeld van het maken van een gebeurtenissessie met een event_counter doel. De sessie telt de eerste vier checkpoint_begin gebeurtenissen en stopt vervolgens met tellen omdat het predicaat het aantal gebeurtenissen dat naar doelen wordt verzonden, beperkt tot vier. U kunt de checkpoint_begin gebeurtenis voor dit voorbeeld genereren door de CHECKPOINT opdracht uit te voeren.
Als u dit voorbeeld wilt gebruiken in Azure SQL Database of SQL Database in Fabric, vervangt u ON SERVER door ON 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
);
Voer de volgende instructie uit om de gebeurtenissessie te starten:
ALTER EVENT SESSION event_counter_checkpoint_begin
ON SERVER
STATE = START;
Als u de verzamelde gegevens in SSMS wilt weergeven, vouwt u het sessieknooppunt uit en selecteert u het package0.event_counter doel. De gegevens worden weergegeven in een raster met drie kolommen. Elke rij vertegenwoordigt een evenement met het aantal voorkomens.
Hier ziet u hoe de gegevens die zijn vastgelegd door het event_counter doel eruit zouden kunnen zien na vier controlepunten.
package_name event_name count
------------ ---------------- -----
sqlserver checkpoint_begin 4
pair_matching doel
Met pair_matching het doel kunt u beginevenementen detecteren die plaatsvinden zonder een bijbehorende eindevenement. U kunt bijvoorbeeld een lock_acquired gebeurtenis vinden zonder een overeenkomende lock_released gebeurtenis, wat kan aangeven dat een langlopende transactie vergrendelingen bevat.
Uitgebreide gebeurtenissen komen niet automatisch overeen met de begin- en eindevenementen. In plaats daarvan definieert u de overeenkomende logica in de pair_matching doelspecificatie in de CREATE EVENT SESSION instructie. Wanneer een begin- en eindgebeurtenis worden gematcht, wordt het paar verwijderd, terwijl niet-gematchte begingebeurtenissen behouden blijven.
Een gebeurtenissessie aanmaken met een pair_matching-target.
Voor dit voorbeeld maken we een voorbeeldtabel met de naam T1, voegen we drie rijen in en verkrijgen we de object_id waarde voor deze tabel. Ter vereenvoudiging maken we de tabel in de tempdb database in dit voorbeeld. Als u een andere database gebruikt, past u de naam van de database aan in de T-SQL-voorbeeldcode die volgt.
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
De volgende gebeurtenissessie verzamelt twee gebeurtenissen, lock_acquired en lock_released. Het heeft ook twee doelen. Een doel is om het event_counter aantal keren voor elke gebeurtenis te leveren. Het andere is de pair_matching target die de logica definieert om de begingebeurtenis lock_acquired en de eindgebeurtenis lock_released in paren te matchen.
De volgorde van door komma's gescheiden velden waaraan is toegewezen BEGIN_MATCHING_COLUMNS en END_MATCHING_COLUMNS moet hetzelfde zijn. Er zijn geen tabs of nieuwe regels toegestaan tussen de velden die worden genoemd in de door komma's gescheiden waarde, hoewel spaties zijn toegestaan.
In de definitie van de gebeurtenissessie gebruiken we een gebeurtenispredicaat om alleen die gebeurtenissen in de tempdb database te verzamelen waarin de object_id in de gebeurtenis overeenkomt met de object-id van de tabel T1. Pas het predicaat in de WHERE component aan om de object-id van de tabel te gebruiken.
Als u dit voorbeeld wilt gebruiken in Azure SQL Database of SQL Database in Fabric, vervangt u ON SERVER door ON 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
);
Voer de volgende instructie uit om de gebeurtenissessie te starten:
ALTER EVENT SESSION pair_matching_lock_acquired_released
ON SERVER
STATE = START;
Begin een transactie die de T1 tabel bijwerkt, maar commit deze niet en rol deze ook niet terug. Dit zorgt ervoor dat er vergrendelingen zijn die zijn verkregen maar niet vrijgegeven.
BEGIN TRANSACTION;
UPDATE T1
SET id = id + 1;
Bekijk de uitvoer van elke doellocatie van de pair_matching_lock_acquired_released gebeurtenissessie in SSMS.
Het event_counter doel heeft de volgende uitvoer, waarin wordt weergegeven dat één vergrendeling niet wordt vrijgegeven. Dit doel toont echter geen details van deze vergrendeling.
package_name event_name count
------------ ---------- -----
sqlserver lock_acquired 4
sqlserver lock_released 3
Het pair_matching doel heeft de volgende uitvoer, afgekapt voor kortheid. Zoals de event_counter uitvoer suggereert, zien we inderdaad de ene rij voor de ongepaarde lock_acquired gebeurtenis, met aanvullende details over de gebeurtenis.
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
De transactie terugdraaien.
ROLLBACK;
Als u een actie toevoegt aan een gebeurtenis die door het pair_matching doel is verzameld, worden de actiegegevens ook verzameld. U kunt bijvoorbeeld de T-SQL-tekst van de sqlserver.sql_text actie opnemen met de gebeurtenis. In dit voorbeeld wordt de query verzameld die de vergrendeling heeft verkregen.
etw_classic_sync_target doel
In SQL Server kunnen uitgebreide gebeurtenissen samenwerken met Event Tracing for Windows (ETW) om systeemactiviteit te bewaken. Voor meer informatie, zie:
Dit ETW-doel verwerkt de gegevens die ze synchroon ontvangen.
Verwante inhoud
- Overzicht van uitgebreide gebeurtenissen
- Quickstart: Uitgebreide gebeurtenissen
- Uitgebreide gebeurtenissen in Azure SQL