Freigeben über


Ziele für erweiterte Ereignisse

Gilt für:SQL ServerAzure SQL-DatenbankVerwaltete Azure SQL-InstanzSQL-Datenbank in Microsoft Fabric

Dieser Artikel erläutert Zweck und Art der Verwendung von Zielen für erweiterte Ereignisse. Für jedes Ziel beschreibt der Artikel Folgendes:

  • Seine Fähigkeiten beim Sammeln und Melden von Ereignisdaten
  • Beispiele für Veranstaltungssitzungen unter Verwendung des Ziels

In der folgenden Tabelle wird die Verfügbarkeit jedes Zieltyps auf unterschiedlichen SQL-Plattformen beschrieben.

Zieltyp SQL Server Azure SQL-Datenbank und SQL-Datenbank in Fabric Verwaltete Azure SQL-Datenbank-Instanz
event_file Ja Ja Ja
Ringpuffer Ja Ja Ja
event_stream Ja Ja Ja
Histogramm Ja Ja Ja
Ereigniszähler Ja Ja Ja
pair_matching Ja Nr. Nr.
ETW_Klassisches_Synchronisationsziel Ja Nr. Nr.

Sofern nicht anders angegeben, verarbeiten Ziele die Daten, die sie asynchron empfangen.

Um diesen Artikel optimal zu nutzen, sollten Sie:

event_file-Ziel

Das event_file Ziel schreibt die Ereignissitzungsausgabe aus Speicherpuffern in eine Datenträgerdatei oder in ein Blob in Azure Storage.

  • Sie geben den filename Parameter in der ADD TARGET Klausel an. Die Dateierweiterung muss xel lauten.

  • Der von Ihnen ausgewählte Dateiname wird vom System als Präfix verwendet, an das ein datumstimer basierter numerischer Wert angefügt wird, gefolgt von der xel Erweiterung.

  • Sie können optional den MAX_FILE_SIZE Parameter angeben. Sie definiert die maximale Größe in Megabyte (MB), auf die die Datei wachsen kann, bevor eine neue Datei erstellt wird.

  • Optional können Sie die MAX_ROLLOVER_FILES Option angeben, um die maximale Anzahl von Dateien auszuwählen, die zusätzlich zur aktuellen Datei im Dateisystem aufbewahrt werden sollen. Der Standardwert ist UNLIMITED. Wenn MAX_ROLLOVER_FILES ausgewertet wird und die Anzahl der Dateien die Einstellung MAX_ROLLOVER_FILES überschreitet, werden die älteren Dateien gelöscht.

Von Bedeutung

Je nach den Ereignissen, die einer Sitzung hinzugefügt wurden, können die vom event_file Ziel erstellten Dateien vertrauliche Daten enthalten. Überprüfen Sie das Dateisystem und die Freigabeberechtigungen für das Verzeichnis und einzelne .xel Dateien, einschließlich geerbter Berechtigungen, um unnötigen Lesezugriff zu verhindern. Folgen Sie dem Prinzip der geringsten Rechte. Um das Risiko zu verringern, vertrauliche Daten versehentlich zu sammeln, vermeiden Sie lange laufende Ereignissitzungen, wenn sie möglicherweise vertrauliche Daten sammeln.

Hinweis

Azure SQL-Datenbank und azure SQL Managed Instance unterstützen nur Blobs in Azure Storage als Wert des filename Parameters. Ein event_file Codebeispiel für Azure SQL-Datenbank, SQL-Datenbank in Fabric oder azure SQL Managed Instance finden Sie unter Erstellen einer Ereignissitzung mit einem event_file Ziel in Azure Storage.

Erstellen einer Ereignissitzung mit event_file Ziel im lokalen Dateisystem

Eine Anleitung zum Erstellen einer Ereignissitzung mit lokalem Dateispeicher mithilfe eines event_file unter Verwendung von SSMS oder T-SQL finden Sie unter Schnellstart: Erweiterte Ereignisse.

Erstellen Sie eine Ereignis-Sitzung mit event_file als Ziel in Azure Storage.

Eine ausführliche Beschreibung zum Erstellen eines Speicherkontos in Azure Storage finden Sie unter Erstellen eines Speicherkontos. Sie können ein Speicherkonto mithilfe von Azure-Portal, PowerShell, Azure SQL, einer ARM-Vorlage oder einer Bicep-Vorlage erstellen. Verwenden Sie ein Konto, das:

  • Ist ein Standard general-purpose v2 Konto.
  • Verwendet die HotBlob-Zugriffsebene.
  • Wenn Sie SQL Server in Azure Virtual Machine (Azure VM) verwenden, sollte sich das Speicherkonto in derselben Azure-Region wie Ihre Azure-VM befinden.
  • Der hierarchische Namespace ist nicht aktiviert.

Erstellen Sie als Nächstes einen Container in diesem Speicherkonto mithilfe des Azure-Portals. Sie können auch einen Container mit PowerShell oder azure CLI erstellen.

Notieren Sie sich die Namen des speicherkontosund des Containers, das Sie erstellt haben. Sie verwenden sie in den folgenden Schritten.

Zum Lesen und Schreiben von Ereignisdaten benötigt das Datenbankmodul einen bestimmten Zugriff. Sie gewähren diesen Zugriff je nach Wahl des Authentifizierungstyps unterschiedlich: verwaltete Identität oder geheime Authentifizierung mit einem SAS-Token (Shared Access Signature).

Um sich bei Azure Storage zu authentifizieren, erfordert das Datenbankmodul eine serverbezogene Anmeldeinformationen oder datenbankbezogene Anmeldeinformationen, die ihm mitgeteilt werden, welche Art von Authentifizierung verwendet werden soll, und stellt einen geheimen Schlüssel für die geheime Authentifizierung bereit. Zum Erstellen dieser Anmeldeinformationen ist die CONTROL Datenbankberechtigung erforderlich.

Für SQL Server und azure SQL Managed Instance ist diese Berechtigung in der master Datenbank erforderlich. Standardmäßig wird die Berechtigung von den Mitgliedern der db_owner Datenbankrolle in masterund von den Mitgliedern der Serverrolle in der sysadmin Instanz gehalten. Für Azure SQL-Datenbank und SQL-Datenbank in Fabric wird diese Berechtigung vom Datenbankbesitzer (dbo), von den Mitgliedern der db_owner Datenbankrolle und vom Administrator des logischen Servers gehalten.

Nachdem eine Benutzeranmeldung erstellt wurde, benötigen die übrigen Schritte zur Erstellung einer Ereignissitzung keine CONTROL Berechtigung. Informationen zu den erforderlichen Berechtigungen finden Sie unter "Berechtigungen ".

Gewähren des Zugriffs mithilfe der verwalteten Identität

Wenn Sie verwaltete Identität mit der Microsoft Entra-Authentifizierung verwenden, weisen Sie die RBAC-Rolle " Storage Blob Data Contributor " für den Container der vom Datenbankmodul verwendeten verwalteten Identität zu. Weitere Informationen finden Sie auf der Grundlage der SQL-Plattform:

Nachdem die Rollenzuweisung für die RBAC-Rolle vorhanden ist, führen Sie die folgenden Schritte aus:

  1. Erstellen Sie ein Berechtigungsnachweis mit T-SQL.

    Bevor Sie den folgenden T-SQL-Batch ausführen, nehmen Sie die folgende Änderung vor:

    • Ersetzen Sie in allen drei Vorkommen https://<storage-account-name>.blob.core.windows.net/<container-name> durch den Namen Ihres Speicherkontos und <storage-account-name> durch den Namen Ihres Containers. Stellen Sie sicher, dass die URL nicht mit einem Schrägstrich endet.

    Erstellen eines serverbezogenen Berechtigungsnachweises: (Gilt für SQL Server, Azure SQL Managed Instance)

    Öffnen Sie mithilfe eines Clienttools wie SSMS ein neues Abfragefenster, stellen Sie eine Verbindung mit master der Datenbank in der Instanz her, in der Sie die Ereignissitzung erstellen möchten, und fügen Sie den folgenden T-SQL-Batch ein.

    /* 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';
    

    Erstellen eines datenbankbezogenen Anmeldeinformationsobjekts: (Gilt für Azure SQL-Datenbank, Azure SQL Managed Instance, SQL-Datenbank in Fabric)

    Öffnen Sie mithilfe eines Clienttools wie SSMS ein neues Abfragefenster, stellen Sie eine Verbindung mit der Benutzerdatenbank her, in der Sie die Ereignissitzung erstellen, und fügen Sie den folgenden T-SQL-Batch ein. Stellen Sie sicher, dass Sie mit Ihrer Benutzerdatenbank und nicht mit der master-Datenbank verbunden sind.

    /* 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';
    
  2. Führen Sie dann die Schritte aus, um eine Ereignissitzung in SSMS mit event_file Ziel in Azure Storage zu erstellen.

Gewähren des Zugriffs mithilfe eines SAS-Tokens (Shared Access Signature)

Wenn Sie die geheime Authentifizierung verwenden, erstellen Sie ein SAS-Token (Shared Access Signature) für den Container. Um diesen Authentifizierungstyp zu verwenden, muss die Zugriffsoption "Speicherkontoschlüsselzugriff zulassen " für das Speicherkonto aktiviert sein. Weitere Informationen finden Sie unter Verhindern der Autorisierung mit gemeinsam verwendeten Schlüsseln für ein Azure Storage-Konto.

  1. Navigieren Sie im Azure-Portal zu dem speicherkonto und container, das Sie erstellt haben. Wählen Sie den Container aus, und navigieren Sie zu Den Einstellungen > für freigegebene Zugriffstoken.

    Das SAS-Token muss die folgenden Anforderungen erfüllen:

    • Berechtigungen auf Read, Write, Delete, List gesetzt.
    • Die Startzeit und die Ablaufzeit müssen die Lebensdauer der Ereignissitzung umfassen. Das von Ihnen erstellte SAS-Token funktioniert nur innerhalb dieses Zeitintervalls.
    • Für Azure SQL-Datenbank, azure SQL Managed Instance und SQL-Datenbank in Fabric darf das SAS-Token keine IP-Adresseinschränkungen aufweisen.

    Wählen Sie die Schaltfläche "SAS-Token und URL generieren" aus . Das SAS-Token befindet sich im Blob SAS-Token-Feld. Sie können sie kopieren, um sie im nächsten Schritt zu verwenden.

    Von Bedeutung

    Das SAS-Token bietet Lese- und Schreibzugriff auf diesen Container. Behandeln Sie es so, als würden Sie ein Kennwort oder ein anderes Geheimnis behandeln.

    Screenshot des Bildschirms

  2. Erstellen Sie Anmeldeinformationen zum Speichern des SAS-Tokens mithilfe von T-SQL.

    Bevor Sie den folgenden T-SQL-Batch ausführen, nehmen Sie diese Änderungen vor:

    • Wenn Sie eine serverumfassende Anmeldeinformation erstellen und die CREATE MASTER KEY Anweisung verwenden, ersetzen Sie <password> durch ein sicheres Kennwort, das den Hauptschlüssel schützt. Weitere Informationen finden Sie unter CREATE MASTER KEY.

    • Ersetzen Sie in allen drei Vorkommen https://<storage-account-name>.blob.core.windows.net/<container-name> durch den Namen Ihres Speicherkontos und <storage-account-name> durch den Namen Ihres Containers.

    • Ersetzen Sie in der SECRET-Klausel <sas-token> durch das SAS-Token, das Sie im vorherigen Schritt kopiert haben.

    Erstellen eines serverbezogenen Berechtigungsnachweises: (Gilt für SQL Server, Azure SQL Managed Instance)

    Öffnen Sie mithilfe eines Clienttools wie SSMS ein neues Abfragefenster, verbinden Sie es mit der Datenbank in der master Instanz, in der Sie die Ereignissitzung erstellen, und fügen Sie den folgenden T-SQL-Batch ein.

    /* 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>';
    

    Erstellen eines datenbankbezogenen Anmeldeinformationsobjekts: (Gilt für Azure SQL-Datenbank, Azure SQL Managed Instance, SQL-Datenbank in Fabric)

    Öffnen Sie mithilfe eines Clienttools wie SSMS ein neues Abfragefenster, stellen Sie eine Verbindung mit der Datenbank her, in der Sie die Ereignissitzung erstellen, und fügen Sie den folgenden T-SQL-Batch ein. Stellen Sie sicher, dass Sie mit Ihrer Benutzerdatenbank und nicht mit der master-Datenbank verbunden sind.

    /* 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>';
    
  3. Führen Sie dann die Schritte im nächsten Abschnitt aus, um eine Ereignissitzung in SSMS mit event_file Ziel in Azure Storage zu erstellen.

Erstellen einer Ereignissitzung in SSMS mit event_file Zielobjekt in Azure Storage

Sobald die Anmeldeinformationen erstellt wurden, die Zugriff auf den Speichercontainer bieten, können Sie die Ereignissitzung erstellen. Im Gegensatz zum Erstellen der Anmeldeinformationen benötigt das Erstellen einer Ereignissitzung nicht die CONTROL Berechtigung. Nachdem die Anmeldeinformationen erstellt wurden, können Sie Ereignissitzungen auch dann erstellen, wenn Sie über eingeschränktere Berechtigungen verfügen. Informationen zu den erforderlichen Berechtigungen finden Sie unter "Berechtigungen ".

So erstellen Sie eine neue Ereignissitzung in SSMS:

  1. Erweitern Sie für SQL Server und azure SQL Managed Instance den Knoten "Erweiterte Ereignisse " unter dem Ordner "Verwaltung ". Erweitern Sie für Azure SQL-Datenbank und SQL-Datenbank in Fabric den Knoten "Erweiterte Ereignisse " unter der Datenbank.

  2. Klicken Sie mit der rechten Maustaste auf den Ordner "Sitzungen ", und wählen Sie "Neue Sitzung" aus.

  3. Geben Sie auf der Seite "Allgemein " einen Namen für die Sitzung ein, der für das folgende Codebeispiel gilt example-session .

  4. Wählen Sie auf der Seite "Ereignisse " ein oder mehrere Ereignisse aus, die der Sitzung hinzugefügt werden sollen. Sie können z. B. das sql_batch_starting Ereignis auswählen.

  5. Wählen Sie auf der Seite event_file" als Zieltyp aus. Fügen Sie die URL des Speichercontainers in das Feld "Speicher-URL " ein. Geben Sie am Ende dieser URL einen Schrägstrich (/) gefolgt von dem Namen der Datei (BLOB) ein. Beispiel: https://<storage-account-name>.blob.core.windows.net/<container-name>/example-session.xel.

  6. Nachdem die Sitzung konfiguriert ist, können Sie optional die Schaltfläche "Skript " auswählen, um ein T-SQL-Skript der Sitzung zu erstellen, um sie später zu speichern.

  7. Wählen Sie OK aus, um die Sitzung zu erstellen.

  8. Erweitern Sie in Objekt-Explorer den Ordner Sitzungen, um die von Ihnen erstellte Ereignissitzung anzuzeigen. Standardmäßig wird die Sitzung beim Erstellen nicht gestartet. Um die Sitzung zu starten, klicken Sie mit der rechten Maustaste auf den Sitzungsnamen, und wählen Sie Sitzung starten aus. Sie können sie später beenden, indem Sie "Sitzung beenden" auswählen, sobald die Sitzung ausgeführt wird.

Während T-SQL-Batches ausgeführt werden, schreibt die Sitzung die sql_batch_starting Ereignisse in den example-session.xel Blob im Speichercontainer.

Hinweis

Verwenden Sie für SQL Managed Instance anstelle der Speichercontainer-URL auf der Seite „Datenspeicher“ die Schaltfläche „Skript“, um ein T-SQL-Skript der Sitzung zu erstellen. Geben Sie die Container-URL als Wert für das filename Argument an, und führen Sie das Skript aus, um die Sitzung zu erstellen.

Erstellen einer Ereignissitzung mit event_file Ziel in Azure Storage in T-SQL

Hier ist ein Beispiel für die CREATE EVENT SESSION mit einer ADD TARGET-Klausel, die ein auf Azure Storage basiertes event_file-Ziel hinzufügt.

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

Ersetzen Sie zum Verwenden dieses Beispiels in Azure SQL-Datenbank oder SQL-Datenbank in Fabric ON SERVER durch ON DATABASE.

Problembehandlung bei Ereignissitzungen mit event_file Ziel in Azure Storage

Die folgende Liste enthält Fehler, die beim Starten einer erweiterten Ereignissitzung auftreten können, die Azure Storage verwendet, mit den möglichen Erklärungen für den Fehler.

  • Fehler 5 des Betriebssystems: "Zugriff verweigert".
    • Bei Verwendung der verwalteten Identitätsauthentifizierung:
      • Die vom Datenbankmodul verwendete verwaltete Identität verfügt nicht über die erforderliche RBAC-Rollenzuweisung. Weitere Informationen finden Sie unter Zugriff gewähren mithilfe der verwalteten Identität.
      • Die Speicherkontofirewall ist aktiviert, und eine Ausnahme, mit der vertrauenswürdige Azure-Dienste auf das Speicherkonto zugreifen können, ist ebenfalls aktiviert, aber eine Microsoft.Sql/servers Ressourceninstanz für den logischen Server wurde nicht zur Liste der Ressourceninstanzen hinzugefügt, die Zugriff gewährt haben. Weitere Informationen finden Sie unter Gewähren des Zugriffs von Azure-Ressourceninstanzen.
      • Wenn Sie einen Netzwerksicherheitsperimeter mit erzwungenem Modus verwenden, befinden sich die Datenbank und das Speicherkonto nicht im gleichen Umkreis.
    • Bei Verwendung der SAS-Tokenauthentifizierung:
      • Die Firewall des Speicherkontos ist aktiviert. Dies wird für Ereignissitzungen, die die SAS-Tokenauthentifizierung verwenden, nicht unterstützt.
      • Das SAS-Token verfügt nicht über ausreichende Berechtigungen oder ist abgelaufen. Weitere Informationen finden Sie unter Gewähren des Zugriffs mithilfe eines SAS-Tokens.
      • Wenn Sie einen Netzwerksicherheitsperimeter mit erzwungenem Modus verwenden, sind Zugriffsregeln nicht vorhanden, um uneingeschränkte ausgehende Kommunikation aus der Datenbank zuzulassen und die uneingeschränkte eingehende Kommunikation mit dem Speicherkonto zu ermöglichen.
  • Fehler 86 des Betriebssystems: "Das angegebene Netzwerkkennwort ist nicht korrekt.".
    • Es gibt keine datenbankbezogenen Anmeldeinformationen (für Azure SQL-Datenbank) oder serverbezogenen Anmeldeinformationen (für Azure SQL Managed Instance oder SQL Server) mit dem Namen, der mit der BLOB-Container-URL übereinstimmt. Weitere Informationen finden Sie in den Beispielen zum Gewähren des Zugriffs mit verwalteter Identität oder Gewähren des Zugriffs mithilfe eines SAS-Tokens.
    • Der Anmeldeinformationsname endet mit einem Schrägstrich (/). Der Anmeldeinformationsname sollte mit dem Containernamen enden, ohne den abschließenden Schrägstrich zu enthalten.
  • Fehler 3 des Betriebssystems: 'Das System kann den angegebenen Pfad nicht finden.'
    • Der in der BLOB-Container-URL angegebene Container ist nicht vorhanden.
  • Fehler 13 des Betriebssystems: "Die Daten sind ungültig.".
    • Es gibt eine Unveränderlichkeitsrichtlinie für den BLOB-Container. Unveränderlicher Speicher wird für Ereignissitzungen nicht unterstützt.
    • Das Speicherkonto hat den hierarchischen Namespace aktiviert. Speicherkonten mit aktiviertem hierarchischen Namespace werden für Ereignissitzungen nicht unterstützt.

sys.fn_xe_file_target_read_file()-Funktion

Das event_fileevent_file-Ziel speichert die empfangenen Daten in einem binären Format, das für Menschen nicht lesbar ist. Mit der sys.fn_xe_file_target_read_file Funktion können Sie den Inhalt einer xel Datei als relationales Rowset darstellen. Weitere Informationen, einschließlich Verwendungsbeispiele, finden Sie unter sys.fn_xe_file_target_read_file.

ring_buffer-Ziel

Das Ziel ring_buffer ist nützlich, um eine Ereignissitzung schnell zu starten und Ereignisdaten ausschließlich im Arbeitsspeicher zu sammeln. Wenn der verfügbare Arbeitsspeicher im Ringpuffer von Ereignissen verwendet wird, werden die älteren Ereignisse verworfen. Wenn Sie die Ereignissitzung beenden, wird auch die gesamte Sitzungsausgabe an das ring_buffer Ziel verworfen.

Sie nutzen Daten aus einem ring_buffer Ziel, indem Sie sie in XML konvertieren, wie im folgenden Beispiel gezeigt. Während dieser Konvertierung werden alle Daten, die nicht in ein 4-MB-XML-Dokument passen, weggelassen. Selbst wenn Sie mehr Ereignisse im Ringpuffer erfassen, indem Sie größere MAX_MEMORY Werte verwenden (oder diesen Parameter bei seinem Standardwert verlassen), können Sie möglicherweise nicht alle Ereignisse nutzen, da die XML-Dokumentgröße auf 4 MB beschränkt ist, wobei der Aufwand von XML-Markup und Unicode-Zeichenfolgen berücksichtigt wird.

Sie wissen, dass der Inhalt des Ringpuffers während der Konvertierung in XML ausgelassen wird, wenn das truncated Attribut im XML-Dokument auf 1festgelegt ist, z. B.:

<RingBufferTarget truncated="1" processingTime="0" totalEventsProcessed="284" eventCount="284" droppedCount="0" memoryUsed="64139">

Tipp

Wenn Sie ein ring_buffer Ziel hinzufügen, legen Sie den MAX_MEMORY Parameter auf 1.024 KB oder weniger fest. Durch die Verwendung größerer Werte kann der Speicherverbrauch unnötig erhöht werden.

Standardmäßig ist ein MAX_MEMORY Ziel in SQL Server nicht beschränkt und in Azure SQL Database, Azure SQL Managed Instance und SQL-Datenbank in Fabric auf 32 MB beschränkt.

Erstellen einer Ereignissitzung mit einem Ringpuffer-Ziel

Hier ist ein Beispiel für das Erstellen einer Ereignissitzung mit einem ring_buffer Ziel zum Sammeln der lock_acquired Ereignisse, wobei die Gesamtanzahl der Ereignisse im Ringpuffer auf 100 beschränkt wird. In diesem Beispiel wird der MAX_MEMORY Parameter zweimal angezeigt: einmal, um den ring_buffer Zielspeicher auf 1.024 KB festzulegen, und einmal, um den Ereignissitzungspufferspeicher auf 2 MB festzulegen.

Ersetzen Sie zum Verwenden dieses Beispiels in Azure SQL-Datenbank oder SQL-Datenbank in Fabric ON SERVER durch 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
);

Führen Sie die folgende Anweisung aus, um die Ereignissitzung zu starten:

ALTER EVENT SESSION ring_buffer_lock_acquired
ON SERVER
STATE = START;

Um die gesammelten Ereignisdaten im Ringpuffer in SSMS anzuzeigen, erweitern Sie den Sitzungsknoten, und wählen Sie das package0.ping_buffer Ziel aus. Die Daten werden in XML angezeigt.

Um Ereignisdaten aus einem Ziel in einem ring_buffer relationalen Rowset anzuzeigen, während die Sitzung aktiv ist, verwenden Sie XQuery-Ausdrücke , um XML in relationale Daten zu konvertieren. Beispiel:

;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 Ziel

Das event_stream Ziel kann in .NET-Programmen nur verwendet werden, die in Sprachen wie C# erstellt wurden. Entwickler können über .NET Framework-Klassen im Microsoft.SqlServer.XEvents.Linq Namespace auf einen Ereignisdatenstrom zugreifen. Dieses Ziel ist implizit in jeder Ereignissitzung vorhanden. Sie kann nicht mithilfe von T-SQL hinzugefügt werden.

Weitere Informationen finden Sie unter sys.fn_MSxe_read_event_stream.

Wenn Fehler 25726 auftritt, 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. wenn aus dem event_stream Ziel gelesen wird, bedeutet dies, dass der Ereignisstream sich schneller mit Daten gefüllt hat, als der Client die Daten nutzen konnte. Dadurch wurde die Verbindung der Datenbank-Engine mit dem Ereignisstream getrennt, um eine Beeinträchtigung von Datenbank-Engine zu vermeiden.

histogram-Ziel

Das histogram Ziel zählt die Anzahl der Ereignisvorkommnisse für unterschiedliche Werte in einem Feld oder einer Aktion. Für jeden eindeutigen Wert wird ein separater Zählbehälter verwendet. Das histogram Ziel verarbeitet die Daten, die es synchron empfängt.

Der SOURCE_TYPE Parameter steuert das Verhalten des histogram Ziels:

  • SOURCE_TYPE = 0: Sammeln von Daten für ein Ereignisfeld.
  • SOURCE_TYPE = 1: Sammeln von Daten für eine Aktion. Dies ist die Standardeinstellung.

Der Standardwert des SLOTS Parameters ist 256. Wenn Sie einen anderen Wert zuweisen, wird der Wert auf die nächste Potenz von 2 aufgerundet. Beispielsweise SLOTS = 59 würde auf 64 aufgerundet werden. Die maximale Anzahl der Histogrammslots für ein histogram Ziel beträgt 16,384.

Wenn Sie histogram für das Ziel verwenden, werden möglicherweise unerwartete Ergebnisse angezeigt. Einige Ereignisse werden möglicherweise nicht in den erwarteten Slots angezeigt, während andere Slots möglicherweise eine höhere als erwartete Anzahl von Ereignissen anzeigen. Dies kann passieren, wenn beim Zuweisen von Ereignissen zu Slots eine Hashkonflikt auftritt. Dies ist zwar selten, wenn jedoch ein Hashkonflikt auftritt, wird ein Ereignis, das in einem Slot gezählt werden soll, in einem anderen gezählt. Aus diesem Grund sollte darauf geachtet werden, dass ein Ereignis nicht nur auftritt, weil die Anzahl in einem bestimmten Slot als Null angezeigt wird.

Betrachten Sie beispielsweise das folgende Szenario:

  • Sie richten eine Extended Events-Sitzung ein, die histogram als Ziel verwendet und Ereignisse nach object_id aufteilt, um Statistiken zur Ausführung gespeicherter Prozeduren zu sammeln.
  • Sie führen gespeicherte Prozedur Aaus. Anschließend führen Sie die gespeicherte Prozedur Baus.

Wenn die Hashfunktion denselben Wert für das object_id beider gespeicherten Prozeduren zurückgibt, zeigt das Histogramm, dass A zweimal ausgeführt wird, während B nicht erscheint.

Um dieses Problem zu beheben, wenn die Anzahl der unterschiedlichen Werte relativ klein ist, legen Sie die Anzahl der Histogramm-Slots fest, die höher als das Quadrat der erwarteten unterschiedlichen Werte sind. Wenn das histogram Ziel beispielsweise auf das SOURCE Ereignisfeld von table_name festgelegt ist und 20 Tabellen in der Datenbank vorhanden sind, dann 20*20 = 400. Die nächste Potenz von 2 größer als 400 ist 512, was die empfohlene Anzahl von Slots in diesem Beispiel ist.

Jedes histogram Ziel akzeptiert Daten aus einer einzelnen Quelle (einem Ereignisfeld oder einer Aktion) und enthält nur ein Histogramm. Es ist nicht möglich, pro Ereignissitzung mehr als ein Ziel desselben Typs hinzuzufügen. Es ist auch nicht möglich, mehr als einen Quelltyp pro histogram Ziel zu haben. Daher ist eine neue Ereignissitzung erforderlich, um verschiedene Aktionen oder Ereignisfelder in einem separaten histogram Ziel nachzuverfolgen.

Eine Ereignissitzung mit einem Histogrammziel erstellen.

Hier ist ein Beispiel für das Erstellen einer Ereignissitzung mit einem histogram Ziel.

Ersetzen Sie zum Verwenden dieses Beispiels in Azure SQL-Datenbank oder SQL-Datenbank in Fabric ON SERVER durch 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 der ADD TARGET ... (SET ...) Klausel wird der Zielparameter SOURCE_TYPE auf 1festgelegt, was bedeutet, dass das histogram Ziel eine Aktion nachverfolgt.

Die ADD EVENT ... (ACTION ...) Klausel fügt die sqlos.system_thread_id Aktion dem Ereignis hinzu. Der SOURCE Parameter wird so festgelegt, dass sqlos.system_thread_id die von dieser Aktion gesammelte Systemthread-ID als Datenquelle für das histogram Ziel verwendet wird. Das histogram Ziel in diesem Beispiel zählt die Anzahl der lock_acquired Ereignisse für jeden Systemthread, der Sperrungen erhält, während die Sitzung aktiv ist.

Führen Sie die folgende Anweisung aus, um die Ereignissitzung zu starten:

ALTER EVENT SESSION histogram_lock_acquired
ON SERVER
STATE = START;

Um die gesammelten Histogrammdaten in SSMS anzuzeigen, erweitern Sie den Sitzungsknoten, und wählen Sie das package0.histogram Ziel aus. Die Daten werden in einem zweispaltigen Raster angezeigt. Jede Zeile stellt einen Bucket mit unterschiedlichen Werten und eine Anzahl von Vorkommen dar.

Hier erfahren Sie, wie die vom histogram Ziel erfassten Daten in diesem Beispiel aussehen können. Die Werte in der value Spalte sind system_thread_id Werte. Zum Beispiel wurden insgesamt 236 Sperren von Systemthread 6540 erworben.

value   count
-----   -----
 6540     236
 9308      91
 9668      74
10144      49
 5244      44
 2396      28

Hier ist ein Beispiel zum Lesen der Daten aus einem histogram Ziel mit 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-Ziel

Das event_counter Ziel zählt, wie oft jedes angegebene Ereignis auftritt.

Das event_counter Ziel hat keine Parameter und verarbeitet die daten, die es synchron empfängt.

Erstellen Sie eine Ereignissitzung mit einem Event-Counter-Ziel.

Hier ist ein Beispiel für das Erstellen einer Ereignissitzung mit einem event_counter Ziel. Die Sitzung zählt die ersten vier checkpoint_begin Ereignisse und beendet dann die Zählung, da das Prädikat die Anzahl von Ereignissen begrenzt, die an Ziele gesendet wurden, auf vier. Sie können das checkpoint_begin Ereignis für dieses Beispiel generieren, indem Sie den CHECKPOINT Befehl ausführen.

Ersetzen Sie zum Verwenden dieses Beispiels in Azure SQL-Datenbank oder SQL-Datenbank in Fabric ON SERVER durch 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
);

Führen Sie die folgende Anweisung aus, um die Ereignissitzung zu starten:

ALTER EVENT SESSION event_counter_checkpoint_begin
ON SERVER
STATE = START;

Um die gesammelten Daten in SSMS anzuzeigen, erweitern Sie den Sitzungsknoten, und wählen Sie das package0.event_counter Ziel aus. Die Daten werden in einem dreispaltigen Raster angezeigt. Jede Zeile stellt ein Ereignis mit einer Anzahl seiner Vorkommen dar.

Hier erfahren Sie, wie die vom event_counter Ziel erfassten Daten in diesem Beispiel aussehen können, nachdem vier Prüfpunkte aufgetreten sind.

package_name   event_name         count
------------   ----------------   -----
sqlserver      checkpoint_begin   4

pair_matching-Ziel

Mithilfe des pair_matching Ziels können Sie aufgetretene Startereignisse ermitteln, denen kein Endeereignis entspricht. Sie können z. B. ein lock_acquired Ereignis ohne übereinstimmende lock_released Ereignisse finden, was möglicherweise darauf hindeutet, dass eine lange ausgeführte Transaktion Sperren hält.

Erweiterte Ereignisse werden nicht automatisch mit den Start- und Endereignissen abgeglichen. Stattdessen definieren Sie die Abgleichslogik in der pair_matching-Zielspezifikation und der CREATE EVENT SESSION-Anweisung. Wenn ein Start- und Endereignis übereinstimmen, verwirft das Ziel das Paar, behält jedoch die nicht übereinstimmenden Startereignisse bei.

Erstellen einer Ereignissitzung mit einem Paarabgleich-Ziel

In diesem Beispiel erstellen wir eine Beispieltabelle mit dem Namen T1, fügen drei Zeilen ein, und rufen den object_id Wert für diese Tabelle ab. Der Einfachheit halber erstellen wir die Tabelle in der tempdb Datenbank in diesem Beispiel. Wenn Sie eine andere Datenbank verwenden, passen Sie den Datenbanknamen im folgenden T-SQL-Beispielcode an.

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

Die folgende Ereignissesitzung sammelt zwei Ereignisse, lock_acquired und lock_released. Sie hat auch zwei Ziele. Eines ist das event_counter Ziel, das die Anzahl der Vorkommen für jedes Ereignis bereitstellt. Das andere ist das pair_matching Ziel, das die Logik definiert, die mit dem Startereignis lock_acquired und dem Endereignis lock_released in Paaren übereinstimmt.

Die Abfolge von durch Trennzeichen getrennte Felder, die BEGIN_MATCHING_COLUMNS und END_MATCHING_COLUMNS zugewiesen sind, müssen identisch sein. Zwischen den durch Trennzeichen getrennten Feldern sind keine Tabstopp- oder Zeilenvorschubzeichen zulässig, jedoch Leerzeichen.

In der Ereignissitzungsdefinition wird ein Ereignis-Prädikat verwendet, um nur die Ereignisse in der tempdb Datenbank zu sammeln, in denen das object_id Ereignis mit der Objekt-ID der Tabelle T1übereinstimmt. Passen Sie das Prädikat in der WHERE Klausel an, um die Objekt-ID Der Tabelle zu verwenden.

Ersetzen Sie zum Verwenden dieses Beispiels in Azure SQL-Datenbank oder SQL-Datenbank in Fabric ON SERVER durch 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
);

Führen Sie die folgende Anweisung aus, um die Ereignissitzung zu starten:

ALTER EVENT SESSION pair_matching_lock_acquired_released
ON SERVER
STATE = START;

Starten Sie eine Transaktion, die die T1 Tabelle aktualisiert, aber führen Sie keinen Commit durch und setzen Sie die Transaktion nicht zurück. Dadurch wird sichergestellt, dass es erworbene, aber nicht freigegebene Sperren gibt.

BEGIN TRANSACTION;
UPDATE T1
    SET id = id + 1;

Überprüfen Sie die Ausgabe von jedem Ziel der pair_matching_lock_acquired_released Ereignissitzung in SSMS.

Das event_counter Ziel hat folgende Ausgabe, die anzeigt, dass eine Sperre nicht freigegeben wurde. Dieses Ziel zeigt jedoch keine Details zu diesem Schloss.

package_name   event_name      count
------------   ----------      -----
sqlserver      lock_acquired   4
sqlserver      lock_released   3

Das pair_matching Ziel hat die folgende gekürzte Ausgabe. Wie durch die event_counter Ausgabe vorgeschlagen, sehen wir tatsächlich die eine Zeile für das nicht gekoppelte lock_acquired Ereignis mit weiteren Details zum Ereignis.

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

Führen Sie ein Rollback für die Transaktion aus.

ROLLBACK;

Wenn Sie einer Aktion ein Ereignis hinzufügen, das vom Ziel pair_matching erfasst wird, werden auch die Aktionsdaten erfasst. Sie können z. B. den T-SQL-Text einschließen, der von der sqlserver.sql_text Aktion mit dem Ereignis bereitgestellt wird. In diesem Beispiel würde die Abfrage erfasst, die die Sperre abgerufen hat.

etw_classic_sync_target-Ziel

Erweiterte Ereignisse in SQL Server können mit der Ereignisablaufverfolgung für Windows (Event Tracing for Windows, ETW) zusammenwirken, um die Systemaktivität zu überwachen. Weitere Informationen finden Sie unter:

Dieses ETW-Ziel verarbeitet die Daten, die sie synchron empfängt.