Megosztás a következőn keresztül:


Bővített eseménycélok

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példánySQL-adatbázis a Microsoft Fabricben

Ez a cikk bemutatja, hogy mikor és hogyan használhatóak a bővített események céljai. A cikk az egyes célokat a következőket ismerteti:

  • Képes eseményadatok gyűjtésére és jelentésére
  • Példák a cél használatával végzett esemény-munkamenetekre

Az alábbi táblázat az egyes céltípusok rendelkezésre állását ismerteti a különböző SQL-platformokon.

Céltípus SQL Server Azure SQL Database és SQL Database a Fabricben Azure SQL Managed Instance
esemény_fájl Igen Igen Igen
ring_buffer Igen Igen Igen
event_stream Igen Igen Igen
hisztogram Igen Igen Igen
eseményszámláló Igen Igen Igen
pár_összeillesztés Igen Nem Nem
etw_klasszikus_szinkronizációs célpont Igen Nem Nem

Ha másként nem jelezzük, a célok aszinkron módon dolgozzák fel az általuk kapott adatokat.

A cikk legnagyobb kihasználásához tegye a következőt:

event_file célfájl

A event_file cél esemény-munkamenet kimenetét írja a memóriapufferekből egy lemezfájlba vagy egy Azure Storage-blobba.

  • Adja meg a paramétert filename a ADD TARGET záradékban. A fájlkiterjesztésnek a következőnek kell lennie xel: .

  • A választott fájlnevet a rendszer előtagként használja, amelyhez dátumalapú numerikus értéket fűz hozzá, majd a xel bővítményt.

  • Igény szerint megadhatja a paramétert MAX_FILE_SIZE . Meghatározza a maximális méretet megabájtban (MB), amelyre a fájl növekedhet egy új fájl létrehozása előtt.

  • Megadhatja azt a lehetőséget, hogy az MAX_ROLLOVER_FILES aktuális fájl mellett a fájlrendszerben megtartandó fájlok maximális számát is megadhatja. Az alapértelmezett érték a UNLIMITED. Ha MAX_ROLLOVER_FILES a kiértékelés során a fájlok száma meghaladja a MAX_ROLLOVER_FILES beállítást, a rendszer törli a régebbi fájlokat.

Fontos

A munkamenethez hozzáadott eseményektől függően a cél által event_file létrehozott fájlok bizalmas adatokat tartalmazhatnak. A szükségtelen olvasási hozzáférés elkerülése érdekében gondosan tekintse át a fájlrendszert, és ossza meg a címtárra és az egyes .xel fájlokra vonatkozó engedélyeket, beleértve az örökölt hozzáférést is. Kövesse a minimális jogosultság elvét. A bizalmas adatok véletlen gyűjtésének kockázatának csökkentése érdekében kerülje a hosszú ideig futó esemény-munkameneteket, ha bizalmas adatokat gyűjthetnek.

Megjegyzés:

Az Azure SQL Database és a felügyelt Azure SQL-példány csak az Azure Storage-ban lévő blobokat támogatja a filename paraméter értékeként. Az event_file kódpéldákért, amelyek az Azure SQL Database-re, a Fabric SQL-adatbázisra vagy a felügyelt Azure SQL-példányra vonatkoznak, lásd: Esemény-munkamenet létrehozása event_file-tárolóval az Azure Storage-ban.

Esemény-munkamenet létrehozása event_file cél használatával a helyi fájlrendszerben

Az esemény-munkamenet létrehozásának útmutatóját, amely helyi fájltárolót használ SSMS-sel vagy T-SQL-lel, lásd a event_file részben.

Esemény-munkamenet létrehozása event_file-cél használatával az Azure Storage-ban

A tárfiók Azure Storage-ban való létrehozásának részletes leírását a Tárfiók létrehozása című témakörben találja. Az Azure portal, a PowerShell, az Azure SQL, egy ARM-sablon vagy egy Bicep-sablon használatával hozhat létre tárfiókot. Használjon olyan fiókot, amely:

  • Standard general-purpose v2 Egy fiók.
  • A Hotblob hozzáférési szintet használja.
  • Ha az SQL Servert Azure-beli virtuális gépen használja, a tárfiókjának ugyanabban az Azure-régióban kell lennie, mint az Azure-beli virtuális gép.
  • Nincs engedélyezve a hierarchikus névtér .

Ezután hozzon létre egy tárolót ebben a tárfiókban az Azure Portal használatával. Tárolót a PowerShell vagy az Azure CLI használatával is létrehozhat.

Jegyezze fel a létrehozott tárfiók és tároló nevét. Ezeket a következő lépésekben használhatja.

Az eseményadatok olvasásához és írásához az adatbázismotornak speciális hozzáférésre van szüksége. Ezt a hozzáférést a választott hitelesítési típustól függően eltérően adja meg: felügyelt identitás vagy titkos kulcsalapú hitelesítés közös hozzáférésű jogosultságkóddal (SAS) jogkivonattal.

Az Azure Storage-hez való hitelesítéshez az adatbázismotornak kiszolgáló hatókörű vagy adatbázis hatókörű hitelesítő adatokra van szüksége, amely meghatározza, hogy milyen típusú hitelesítést kell használnia, és titok alapú hitelesítést biztosít. A hitelesítő adatok létrehozásához adatbázis-engedély CONTROL szükséges.

Az SQL Serverhez és a felügyelt Azure SQL-példányhoz ez az engedély szükséges az master adatbázisban. Alapértelmezés szerint az engedélyt az adatbázis-szerepkör db_ownertagjai master és a példányon lévő sysadmin kiszolgálói szerepkör tagjai birtokolják. A Fabricben található Azure SQL Database és SQL Database esetében ezt az engedélyt az adatbázis tulajdonosa (dbo), az db_owner adatbázis-szerepkör tagjai és a logikai kiszolgáló rendszergazdája birtokolja.

A hitelesítő adatok létrehozása után az esemény-munkamenet létrehozásához szükséges további lépésekhez nincs szükség az engedélyre CONTROL . Tekintse meg a szükséges engedélyek.

Hozzáférés biztosítása felügyelt identitással

Ha felügyelt identitást használ Microsoft Entra-hitelesítéssel, a tároló storage blobadat-közreműködő RBAC-szerepkörét az adatbázismotor által használt felügyelt identitáshoz rendeli. További információkért tekintse meg az SQL-platformon alapuló alábbi információkat:

Az RBAC-szerepkör-hozzárendelés végrehajtása után kövesse az alábbi lépéseket:

  1. Hozzon létre egy hitelesítő adatot a T-SQL használatával.

    A következő T-SQL-köteg végrehajtása előtt végezze el a következő módosítást:

    • Mindhárom előfordulásnál cserélje le a https://<storage-account-name>.blob.core.windows.net/<container-name> elemet a tárfiók nevével, és cserélje le a <storage-account-name> elemet a tároló nevére. Győződjön meg arról, hogy az URL-cím végén nincs záró perjel.

    Kiszolgáló hatókörű hitelesítő adatok létrehozása: (az SQL Serverre, felügyelt Azure SQL-példányra vonatkozik)

    Egy ügyféleszköz, például az SSMS használatával nyisson meg egy új lekérdezési ablakot, csatlakozzon az adatbázishoz master azon a példányon, ahol létre szeretné hozni az esemény-munkamenetet, és illessze be a következő T-SQL-köteget.

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

    Adatbázis-hatókörű hitelesítő adatok létrehozása: (Az Azure SQL Database, az Azure SQL Managed Instance és az SQL Database in Fabric szolgáltatásra vonatkozik)

    Egy ügyféleszköz, például az SSMS használatával nyisson meg egy új lekérdezési ablakot, csatlakozzon a felhasználói adatbázishoz, ahol az esemény munkamenetet hozza létre, és illessze be a következő T-SQL-köteget. Győződjön meg arról, hogy a felhasználói adatbázishoz csatlakozik, és nem az master adatbázishoz.

    /* 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. Ezután a lépéseket követve hozzon létre egy esemény-munkamenetet az SSMS-ben event_file Azure Storage-célhellyel.

Hozzáférés biztosítása közös hozzáférésű jogosultságkód (SAS) jogkivonat használatával

Titkos hitelesítés használata esetén létre kell hoznia egy közös hozzáférésű jogosultságkód (SAS) jogkivonatot a tárolóhoz. Ennek a hitelesítési típusnak a használatához engedélyezni kell a Tárfiók kulcshozzáférés engedélyezése beállítást a tárfiókhoz. További információt az Azure Storage-fiók megosztott kulcsának engedélyezésének megakadályozása című témakörben talál.

  1. Az Azure Portalon keresse meg a létrehozott tárfiókot és tárolót. Válassza ki a tárolót, és keresse meg a Beállítások > megosztott hozzáférési jogkivonatokat.

    Az SAS-jogkivonatnak meg kell felelnie a következő követelményeknek:

    • Engedélyek beállításaRead: , Write, DeleteList.
    • A kezdési és a lejárati időnek az esemény munkamenetének élettartamát kell magában foglalnia. A létrehozott SAS-jogkivonat csak ezen időintervallumon belül működik.
    • Az Azure SQL Database, az Azure SQL Managed Instance és az SQL Database in Fabric esetében az SAS-jogkivonatnak nem kell IP-címkorlátozásokkal rendelkeznie.

    Válassza az SAS-jogkivonat és az URL-cím létrehozása gombot. Az SAS-jogkivonat a Blob SAS-jogkivonat mezőjében található. Másolja át, hogy a következő lépésben használhassa.

    Fontos

    Az SAS-jogkivonat olvasási és írási hozzáférést biztosít ehhez a tárolóhoz. Kezelje úgy, mintha egy jelszót vagy bármilyen más titkos kódot kezelne.

    Képernyőkép egy Azure Storage-tároló megosztott hozzáférésű jogkivonatainak képernyőjéről egy példatárolóhoz létrehozott SAS-jogkivonattal.

  2. Hozzon létre egy hitelesítő adatot az SAS-jogkivonat T-SQL használatával történő tárolásához.

    A következő T-SQL-köteg végrehajtása előtt végezze el a következő módosításokat:

    • Ha kiszolgálói hatókörű hitelesítő adatot hoz létre, és az CREATE MASTER KEY utasítást használja, cserélje le <password> egy erős jelszóra, amely védi a főkulcsot. További információ: CREATE MASTER KEY.

    • Mindhárom előfordulásnál cserélje le a https://<storage-account-name>.blob.core.windows.net/<container-name> elemet a tárfiók nevével, és cserélje le a <storage-account-name> elemet a tároló nevére.

    • A SECRET záradékban cserélje le a <sas-token> helyére az előző lépésben másolt SAS-jogkivonatot.

    Kiszolgáló hatókörű hitelesítő adatok létrehozása: (az SQL Serverre, felügyelt Azure SQL-példányra vonatkozik)

    Egy ügyféleszköz, például az SSMS használatával nyisson meg egy új lekérdezési ablakot, csatlakoztassa az master adatbázishoz azon a példányon, ahol az esemény-munkamenetet létrehozza, és illessze be a következő T-SQL-köteget.

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

    Adatbázis-hatókörű hitelesítő adatok létrehozása: (Az Azure SQL Database, az Azure SQL Managed Instance és az SQL Database in Fabric szolgáltatásra vonatkozik)

    Egy ügyféleszköz, például az SSMS használatával nyisson meg egy új lekérdezési ablakot, csatlakozzon ahhoz az adatbázishoz, ahol az esemény munkamenetet hozza létre, és illessze be a következő T-SQL-köteget. Győződjön meg arról, hogy a felhasználói adatbázishoz csatlakozik, és nem az master adatbázishoz.

    /* 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. Ezután a következő szakaszban leírt lépéseket követve hozzon létre egy esemény-munkamenetet az SSMS-ben event_file Azure Storage-célhellyel.

Esemény-munkamenet létrehozása az SSMS-ben event_file-cél használatával az Azure Storage-ban

Miután létrejött a tárolóhoz hozzáférést biztosító hitelesítő adat, létrehozhatja az esemény-munkamenetet. A hitelesítő adatok létrehozásával ellentétben az esemény-munkamenetek létrehozásához nincs szükség engedélyre CONTROL . A hitelesítő adatok létrehozása után akkor is létrehozhat esemény-munkameneteket, ha korlátozottabb engedélyekkel rendelkezik. Tekintse meg a szükséges engedélyek.

Új esemény munkamenet létrehozása az SSMS-ben:

  1. Sql Server és felügyelt Azure SQL-példány esetén bontsa ki a Kiterjesztett események csomópontot a Felügyeleti mappa alatt. Az Azure SQL Database és az SQL Database in Fabric esetében bontsa ki a Kiterjesztett események csomópontot az adatbázis alatt.

  2. Kattintson a jobb gombbal a Munkamenetek mappára, és válassza az Új munkamenet...lehetőséget.

  3. Az Általános lapon adja meg a munkamenet nevét, amely a következő kódmintához tartozik example-session .

  4. Az Események lapon válasszon ki egy vagy több eseményt, amely hozzáadható a munkamenethez. Kiválaszthatja például az eseményt sql_batch_starting .

  5. Az Adattárolás lapon válassza ki event_file a céltípust. Illessze be a tároló URL-címét a Storage URL mezőbe. Írjon be egy perjelet (/) az URL-cím végére, majd a fájl (blob) nevét. Például: https://<storage-account-name>.blob.core.windows.net/<container-name>/example-session.xel.

  6. Most, hogy a munkamenet konfigurálva lett, kiválaszthatja a Szkript gombot a munkamenet T-SQL-szkriptjének létrehozásához, hogy később mentse.

  7. A munkamenet létrehozásához kattintson az OK gombra .

  8. Az Object Explorerben bontsa ki a Munkamenetek mappát a létrehozott esemény-munkamenet megtekintéséhez. Alapértelmezés szerint a munkamenet létrehozásakor nem indul el. A munkamenet elindításához kattintson a jobb gombbal a munkamenet nevére, és válassza a Munkamenet indítása parancsot. Később a munkamenet futtatása után a Munkamenet leállítása lehetőséget választva állíthatja le.

A T-SQL-kötegek végrehajtása során a munkamenet az eseményeket a sql_batch_starting blobba írja a example-session.xel tárolóban.

Megjegyzés:

Felügyelt SQL-példány esetén a Adattárolás oldalon a tároló URL-címének beillesztése helyett használja a Szkript gombot a munkamenet T-SQL-szkriptjének létrehozásához. Adja meg a tároló URL-címét az filename argumentum értékeként, és hajtsa végre a szkriptet a munkamenet létrehozásához.

Esemény-munkamenet létrehozása event_file célhellyel az Azure Storage-ban a T-SQL-ben

Íme egy példa a CREATE EVENT SESSION záradékkal, amely hozzáad egy Azure Storage-alapú ADD TARGET célt.

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

Ha ezt a példát szeretné használni az Azure SQL Database-ben vagy az SQL Database-ben a Fabricben, cserélje le a következőre ON SERVERON DATABASE: .

Esemény-munkamenetek hibaelhárítása az event_file-céllal az Azure Storage-ban

Az alábbi lista az Azure Storage-t használó kiterjesztett esemény-munkamenet indításakor előforduló hibákat tartalmazza a hiba lehetséges magyarázatával.

  • Az operációs rendszer 5. hibát adott vissza: "Hozzáférés megtagadva."
    • Felügyelt identitás hitelesítése esetén:
    • SAS-jogkivonat-hitelesítés használata esetén:
      • A tárfiók tűzfala engedélyezve van. Ez sas-jogkivonat-hitelesítést használó esemény-munkamenetek esetében nem támogatott.
      • Az SAS-jogkivonat nem rendelkezik megfelelő engedélyekkel, vagy lejárt. További információ: Hozzáférés biztosítása SAS-jogkivonat használatával.
      • Ha a hálózati biztonsági szegélyt kényszerítő móddal használja, a hozzáférési szabályok nem engedélyezik az adatbázisból való korlátlan kimenő kommunikációt, és a tárfiók felé irányuló korlátlan bejövő kommunikáció nincs érvényben.
  • Az operációs rendszer a következő 86-os hibát adta vissza: "A megadott hálózati jelszó nem helyes."
    • Nem létezik az Azure SQL Database esetében adatbázis-hatókörű hitelesítő adat, illetve az Azure SQL Managed Instance vagy SQL Server esetében kiszolgáló-hatókörű hitelesítő adat, amelynek neve egyezik a blobtároló URL-címével. További információkért tekintse meg a felügyelt identitással való hozzáférés megadására vagy a hozzáférés SAS-jogkivonattal való engedélyezésére vonatkozó példákat.
    • A hitelesítési név perjellel (/) végződik. A hitelesítőadat-névnek a tároló nevével kell végződnie, amely nem tartalmazza a záró perjelet.
  • Az operációs rendszer 3. hibát adott vissza: "A rendszer nem találja a megadott elérési utat."
    • A blobtároló URL-címében megadott tároló nem létezik.
  • Az operációs rendszer 13- os hibát adott vissza: "Az adatok érvénytelenek."
    • A blobtárolón egy módosíthatatlansági szabályzat található. Az esemény-munkamenetek nem támogatják a nem módosítható tárolást.
    • A tárfiókban engedélyezve van a hierarchikus névtér . A hierarchikus névtérrel rendelkező tárfiókok nem támogatottak az esemény-munkamenetekben.

sys.fn_xe_file_target_read_file() függvény

A event_file cél olyan bináris formátumban tárolja a kapott adatokat, amelyek nem olvashatók az emberek számára. A sys.fn_xe_file_target_read_file függvény lehetővé teszi, hogy egy xel fájl tartalmát relációs sorhalmazként ábrázolja. További információkért, beleértve a használati példákat, tekintsék meg sys.fn_xe_file_target_read_file dokumentációját.

ring_buffer célpont

A ring_buffer cél hasznos az esemény munkamenetének gyors elindításához és az eseményadatoknak kizárólag a memóriában történő gyűjtéséhez. Ha az események a gyűrűpufferben rendelkezésre álló memóriát használják, a rendszer elveti a régebbi eseményeket. Amikor leállítja az esemény-munkamenetet, a ring_buffer célra irányuló összes munkamenet-kimenet is el lesz vetve.

A ring_buffer célból származó adatokat XML formátumba konvertálva használja fel, a következő példában látható módon. Az átalakítás során a 4 MB-os XML-dokumentumba nem férő adatok nem lesznek megadva. Ezért még ha több eseményt is rögzít a gyűrűpufferben nagyobb MAX_MEMORY értékek használatával (vagy ha ezt a paramétert az alapértelmezett értéken hagyja), előfordulhat, hogy az XML-dokumentum méretének 4 MB-os korlátja miatt nem tudja mindegyiket felhasználni, figyelembe véve az XML-korrektúrák és a Unicode-sztringek többletterhelését.

Tudja, hogy a gyűrűpuffer tartalma kimarad az XML-formátumra való átalakítás során, ha az XML-dokumentumban található truncated attribútum értéke 1 lesz, például:

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

Jótanács

Amikor ring_buffer célt ad hozzá, állítsa be a MAX_MEMORY paramétert 1,024 KB-ra vagy annál kisebbre. A nagyobb értékek használata szükségtelenül növelheti a memóriahasználatot.

Alapértelmezés szerint MAX_MEMORY a ring_buffer cél az SQL Serverben nincs korlátozva, de az Azure SQL Database, az Azure SQL Managed Instance és az SQL Database a Fabricben esetén 32 MB-ra korlátozott.

Esemény-munkamenet létrehozása ring_buffer-cél használatával

Íme egy példa egy esemény-munkamenet létrehozására, ring_buffer amelynek célja az lock_acquired események összegyűjtése, és a gyűrűpufferben lévő események teljes száma 100-ra van korlátozva. Ebben a példában a MAX_MEMORY paraméter kétszer jelenik meg: egyszer a ring_buffer célmemória 1024 KB-ra való beállításához, egyszer pedig az esemény-munkamenet puffermemória 2 MB-ra való beállításához.

Ha ezt a példát szeretné használni az Azure SQL Database-ben vagy az SQL Database-ben a Fabricben, cserélje le a következőre 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
);

Az esemény munkamenetének elindításához hajtsa végre a következő utasítást:

ALTER EVENT SESSION ring_buffer_lock_acquired
ON SERVER
STATE = START;

Ha meg szeretné tekinteni az összegyűjtött eseményadatokat a gyűrűpufferben az SSMS-ben, bontsa ki a munkamenet-csomópontot, és válassza ki a package0.ping_buffer célterületet. Az adatok XML-ben jelennek meg.

Ha egy cél eseményadatait ring_buffer szeretné megtekinteni egy relációs sorhalmazban, miközben a munkamenet aktív, XQuery-kifejezésekkel konvertálja az XML-t relációs adatokká. Például:

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

eseményfolyam cél

A event_stream cél csak olyan nyelveken írt .NET-programokban használható, mint a C#. A fejlesztők .NET-keretrendszerosztályokon keresztül érhetnek el eseményfolyamokat a Microsoft.SqlServer.XEvents.Linq névtérben. Ez a cél implicit módon jelen van minden esemény-munkamenetben. T-SQL használatával nem adható hozzá.

További információ: sys.fn_MSxe_read_event_stream.

Ha 25726-os hibát tapasztal, 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. amikor a event_stream célból olvas, az azt jelenti, hogy az eseményfolyam gyorsabban tele van adatokkal, mint amennyit az ügyfél felhasználhatna. Ez azt eredményezi, hogy az adatbázismotor leválasztja az eseményfolyamot az adatbázismotor teljesítményére gyakorolt hatás elkerülése érdekében.

hisztogram cél

A histogram cél megszámolja egy mező vagy művelet különböző értékeinek eseményeseményeinek számát. Minden különálló értékhez külön darabszám gyűjtőt használ a rendszer. A histogram cél szinkron módon dolgozza fel a kapott adatokat.

A SOURCE_TYPE paraméter szabályozza a cél viselkedését histogram :

  • SOURCE_TYPE = 0: adatokat gyűjt egy eseménymezőhöz.
  • SOURCE_TYPE = 1: gyűjtsön adatokat egy művelethez. Ez az alapértelmezett érték.

A paraméter alapértelmezett értéke SLOTS 256. Ha másik értéket rendel hozzá, az érték fel lesz kerekítve a 2 következő hatványára. Például a SLOTS = 59 értékét felfelé kerekítve 64 lesz. A histogram cél hisztogramhelyeinek maximális száma 16,384.

Ha célként használja histogram , előfordulhat, hogy váratlan eredményeket fog látni. Előfordulhat, hogy egyes események nem jelennek meg a várt pontokon, míg más pontok az események vártnál magasabb számát mutathatják. Ez akkor fordulhat elő, ha hash ütközés történik, amikor eseményeket rendel a helyekhez. Bár ez ritkán fordul elő, hash ütközés esetén egy esemény, amelyet egy meghatározott helyen kellene számolni, végül egy másik helyen kerül megszámlálásra. Ezért óvatosan kell kezelni azt a feltételezést, hogy pusztán azért nem történt esemény, mert egy adott hely számlálása nullát mutat.

Példaként tekintse meg a következő forgatókönyvet:

  • Bővített események munkamenetet állít be, histogram célként használva, és object_id alapján kategorizálja az eseményeket, hogy összegyűjtse a tárolt eljárás végrehajtási statisztikáit.
  • Ön végrehajtja a tárolt eljárást A. Ezután végrehajtja a tárolt eljárást B.

Ha a kivonatfüggvény ugyanazt az értéket adja vissza a mindkét object_id tárolt eljárás esetében, a hisztogram azt mutatja, hogy A kétszer hajtódik végre, miközben B nem jelenik meg.

A probléma megoldásához, ha a különböző értékek száma viszonylag kicsi, állítsa be a hisztogramhelyek számát a várt eltérő értékek négyzeténél magasabbra. Ha például a histogram cél SOURCE értékét az table_name eseménymezőre állítják, és 20 tábla van az adatbázisban, akkor 20*20 = 400. A 400-nál nagyobb következő 2 hatványa a 512, ami a példában javasolt helyek száma.

Minden histogram cél egyetlen forrásból (eseménymezőből vagy műveletből) fogad adatokat, és csak egy hisztogramot tartalmaz. Esemény-munkamenetenként nem lehet egynél több, azonos típusú célértéket hozzáadni. Célonként histogram egynél több forrástípus sem lehet. Ezért egy új esemény munkamenetre van szükség a különböző műveletek vagy eseménymezők nyomon követéséhez egy külön histogram célban.

Esemény-munkamenet létrehozása hisztogram célponttal.

Íme egy példa egy eseménymunkamenet létrehozására egy histogram céllal.

Ha ezt a példát szeretné használni az Azure SQL Database-ben vagy az SQL Database-ben a Fabricben, cserélje le a következőre 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
);

A ADD TARGET ... (SET ...) záradékban a célparaméter SOURCE_TYPE a következőre 1 van állítva, ami azt jelenti, hogy a histogram cél egy műveletet követ nyomon.

A ADD EVENT ... (ACTION ...) záradék hozzáadja a sqlos.system_thread_id műveletet az eseményhez. A SOURCE paraméter úgy van beállítva, hogy sqlos.system_thread_id a művelet által gyűjtött rendszerszál-azonosítót használja a histogram cél adatforrásaként. A histogram példában szereplő cél megszámolja az egyes rendszerszálak eseményeinek lock_acquired számát, amelyek zárolva lesznek, miközben a munkamenet aktív.

Az esemény munkamenetének elindításához hajtsa végre a következő utasítást:

ALTER EVENT SESSION histogram_lock_acquired
ON SERVER
STATE = START;

Az összegyűjtött hisztogramadatok SSMS-ben való megtekintéséhez bontsa ki a munkamenet-csomópontot, és válassza ki a package0.histogram célértéket. Az adatok kétoszlopos rácson jelennek meg. Minden sor különböző értékekből és előfordulások számából álló gyűjtőt jelöl.

Ebben a példában az histogram célpont által rögzített adatok így nézhetnek ki. Az value oszlopban lévő értékek system_thread_id értékek. Például összesen 236 zárolást szerzett be a rendszerszál 6540.

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

Íme egy példa egy histogram célhely adatainak beolvasására T-SQL-el:

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;

eseményszámláló cél

A event_counter cél megszámolja, hogy az egyes események hányszor fordulnak elő.

A event_counter cél nem rendelkezik paraméterekkel, és szinkron módon dolgozza fel a kapott adatokat.

Eseménymunkamenet létrehozása egy event_counter cél használatával

Íme egy példa egy eseménymunkamenet létrehozására egy event_counter céllal. A munkamenet megszámolja az első négy checkpoint_begin eseményt, majd leállítja a számolást, mert a predikátum négyre korlátozza a céloknak küldött események számát. A példához tartozó eseményt checkpoint_begin a CHECKPOINT parancs végrehajtásával hozhatja létre.

Ha ezt a példát szeretné használni az Azure SQL Database-ben vagy az SQL Database-ben a Fabricben, cserélje le a következőre 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
);

Az esemény munkamenetének elindításához hajtsa végre a következő utasítást:

ALTER EVENT SESSION event_counter_checkpoint_begin
ON SERVER
STATE = START;

Az összegyűjtött adatok SSMS-ben való megtekintéséhez bontsa ki a munkamenet-csomópontot, és válassza ki a package0.event_counter célt. Az adatok háromoszlopos rácson jelennek meg. Minden sor egy eseményt jelöl, amelynek előfordulásai száma meg van számlálva.

Így nézhetnek ki a event_counter célállomás által a példában rögzített adatok négy ellenőrzőpont után.

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

párosítási cél

A pair_matching cél lehetővé teszi a megfelelő záróesemény nélkül bekövetkező indítási események észlelését. Egy lock_acquired eseményt például egyező lock_released esemény nélkül is megtalálhat, ami azt jelezheti, hogy egy hosszú ideig futó tranzakció zárolásokat tart fenn.

A bővített események nem felelnek meg automatikusan a kezdő és a záró eseményeknek. Ehelyett az illesztési logikát a pair_matching célspecifikációban található CREATE EVENT SESSION utasításban definiálja. Amikor egy kezdési és egy záró esemény megegyezik, a rendszer elveti a párot, de megtartja a nem párosított kezdési eseményeket.

Olyan esemény-munkamenet létrehozása, amely a párkeresés célt szolgálja.

Ebben a példában létrehozunk egy példatáblát T1, három sort szúrunk be, és lekérjük a object_id tábla értékét. Az egyszerűség kedvéért ebben a példában létrehozzuk a táblát az tempdb adatbázisban. Ha másik adatbázist használ, módosítsa az adatbázis nevét a következő T-SQL-példakódban.

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

A következő eseménymunkamenet két eseményt gyűjt össze, lock_acquired és lock_released. Két célpontja is van. Az egyik az event_counter a cél, amely az egyes események előfordulásainak számát adja meg. A másik az a pair_matching célpont, amely meghatározza a logikát, hogy a kezdő lock_acquired eseményt és a záró lock_released eseményt párokba rendezze.

A vesszővel tagolt mezők BEGIN_MATCHING_COLUMNSEND_MATCHING_COLUMNS sorrendjének meg kell egyeznie. A vesszővel tagolt értékben említett mezők között nincsenek tabulátorok vagy újvonalak, bár a szóközök engedélyezettek.

Az esemény-munkamenet definíciójában egy esemény-predikátumot használunk, amely csak azokat az eseményeket gyűjti össze az tempdb adatbázisban, ahol az object_id esemény megegyezik a tábla T1objektumazonosítójával. Módosítsa a záradék predikátumát a WHERE tábla objektumazonosítójának használatához.

Ha ezt a példát szeretné használni az Azure SQL Database-ben vagy az SQL Database-ben a Fabricben, cserélje le a következőre 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
);

Az esemény munkamenetének elindításához hajtsa végre a következő utasítást:

ALTER EVENT SESSION pair_matching_lock_acquired_released
ON SERVER
STATE = START;

Indítson el egy tranzakciót, amely frissíti a T1 táblát, de ne véglegesítse és ne vonja vissza. Ez biztosítja, hogy léteznek megszerzett, de nem feloldott zárolások.

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

Vizsgálja meg az SSMS-ben az pair_matching_lock_acquired_released esemény-munkamenet egyes céljainak kimenetét.

A event_counter cél a következő kimenetet adja, amely azt mutatja, hogy egy zárolás nem lett feloldva. Ez a cél azonban nem jeleníti meg a zárolás részleteit.

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

A pair_matching cél az alábbi kimenet jelenik meg, a rövidség kedvéért csonkolva. Ahogy a event_counter kimenet is sugallja, megjelenik valóban az összepárosítatlan lock_acquired esemény egyetlen sora, további részletekkel az eseményről.

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

A tranzakció visszaállítása.

ROLLBACK;

Ha műveletet ad hozzá egy, a pair_matching cél által gyűjtött eseményhez, a műveletadatok is összegyűjtve lesznek. Belefoglalhatja például az eseményhez tartozó művelet által sqlserver.sql_text biztosított T-SQL-szöveget. Ebben a példában összegyűjti a zárolást beszerző lekérdezést.

etw_classic_sync_target cél

Az SQL Serverben a kiterjesztett események együttműködhetnek a Windows eseménykövetésével (ETW) a rendszertevékenységek figyelése érdekében. További információkért lásd:

Ez az ETW-cél szinkron módon dolgozza fel a kapott adatokat.