Esemény-munkamenet létrehozása egy ring_buffer-tárolóval a memóriában

A következőre vonatkozik: Azure SQL DatabaseFelügyelt Azure SQL-példány

Az útmutató magas szintű lépései a következők:

  1. Esemény-munkamenet létrehozása és indítása egy ring_buffer cél használatával
  2. Rögzített eseményadatok megtekintése XML-fájlként
  3. Rögzített eseményadatok megtekintése relációs sorkészletként

ring_buffer A cél esetében a lépések egyszerűbbek, mint a event_file cél esetében, mivel nem kell eseményadatokat tárolnia az Azure Storage-ban.

Esemény-munkamenet létrehozása és indítása egy ring_buffer-cél használatával

Ha új esemény munkamenetet szeretne létrehozni az SQL Server Management Studióban (SSMS), bontsa ki a Kiterjesztett események csomópontot . Ez a csomópont az Azure SQL Database adatbázismappájában, a felügyelt Azure SQL-példány Felügyeleti mappájában található. Kattintson a jobb gombbal a Munkamenetek mappára, és válassza az Új munkamenet...lehetőséget. Az Általános lapon adja meg a munkamenet nevét, amely ebben a példában szerepel example-session . Az Események lapon válasszon ki egy vagy több eseményt, amely hozzáadható a munkamenethez. Ebben a példában az eseményt sql_batch_starting választottuk ki.

Screenshot of the New Session SSMS dialog showing the event selection page with the sql_batch_starting event selected.

Az Adattárolás lapon válassza ki ring_buffer a céltípust. A memória megőrzése érdekében javasoljuk, hogy az események számát kis számra (alapértelmezés szerint 1000) tartsa, és állítsa a puffermemória maximális számát 1 MB-ra vagy annál kisebbre. További részletekért lásd ring_buffer célt.

Screenshot of the New Session SSMS dialog showing the data storage selection page with a ring_buffer target selected.

Most, hogy a munkamenet konfigurálva lett, a Szkript gombra kattintva létrehozhat egy T-SQL-szkriptet a munkamenetből, hogy később menthesse. A példamunkamenet szkriptje a következő:

CREATE EVENT SESSION [example-session] ON DATABASE
ADD EVENT sqlserver.sql_batch_starting
ADD TARGET package0.ring_buffer(SET max_memory=(1024))
GO

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

Munkamenet-adatok megtekintése XML-fájlként

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 is leállíthatja.

Mivel a T-SQL-kötegek végrehajtása ebben az adatbázisban vagy felügyelt példányban történik, a munkamenet eseményeket ír egy memóriapufferbe. Mivel a memóriapuffer mérete véges, az összes memória használata után a rendszer elveti a régebbi eseményeket, hogy helyet biztosítsunk az újabb eseményeknek.

Az Object Explorerben bontsa ki a munkamenetet a package0.ring_buffer cél megjelenítéséhez, és kattintson duplán a célra. A céladatok megtekintésére is kattinthat a jobb gombbal, és kiválaszthatja a lehetőséget. Ekkor megnyílik egy rács, amelyen megjelenik egy XML-töredék. Jelölje ki ezt az XML-töredéket a memóriapuffer tartalmát képviselő XML-dokumentum megtekintéséhez.

Az XML-dokumentum első sora a munkamenet és a cél metaadatait írja le:

<RingBufferTarget truncated="0" processingTime="0" totalEventsProcessed="17" eventCount="17" droppedCount="0" memoryUsed="32070">

Ebben a példában azt látjuk, hogy a cél 17 eseményt ring_buffer feldolgozott. A rendszer nem törölt eseményeket, mert a puffermemória nem merült ki, és a konfigurált események maximális száma (1000) nem lett elérve.

Tipp.

Ügyeljen az attribútumra truncated . Ha be van állítva 1, az azt jelenti, hogy a memóriapuffer XML-reprezentációja nem jeleníti meg a teljes puffertartalmat. További információ: ring_buffer cél.

Az XML-dokumentum többi része eseményeket tartalmaz. Egyetlen esemény xml-fájlban való megjelenítése a következőképpen nézhet ki:

  <event name="sql_batch_starting" package="sqlserver" timestamp="2023-10-18T17:43:34.079Z">
    <data name="batch_text">
      <type name="unicode_string" package="package0"></type>
      <value><![CDATA[SELECT
'DatabaseXEStore[@Name=' + quotename(CAST(db_name() AS sysname),'''') +' and @ServerName=' + quotename(CAST(SERVERPROPERTY('servername') AS sysname),'''') + ']' AS [Urn],
CAST(db_name() AS sysname) AS [Name],
CAST(SERVERPROPERTY('servername') AS sysname) AS [ServerName],
(SELECT count(*) FROM sys.dm_xe_database_sessions) AS [RunningSessionCount]]]></value>
    </data>
  </event>

Itt az value attribútum tartalmazza a T-SQL köteget (ebben a példában egyetlen lekérdezést).

Munkamenet-adatok megtekintése relációs sorkészletként

Ha egy cél eseményadatait ring_buffer szeretné megtekinteni egy relációs sorhalmazban, meg kell írnia egy T-SQL-lekérdezést, amely XQuery-kifejezésekkel konvertálja az XML-t relációs adatokká.

Íme egy példa a létrehozott munkamenetre, amely először a legutóbbi eseményeket jeleníti meg:

WITH
/* An XML document representing memory buffer contents */
RingBuffer AS
(
SELECT CAST(xst.target_data AS xml) AS TargetData
FROM sys.dm_xe_database_session_targets AS xst
INNER JOIN sys.dm_xe_database_sessions AS xs
ON xst.event_session_address = xs.address
WHERE xs.name = N'example-session'
),
/* 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;